Hello, thank you for your time. I am willing to build speech recognition with only two word phrases "next screen" and "back screen". Add only one keyphrase is working well. I will add my code.
public class VoiceService extends Service implements RecognitionListener { private static final String LOG_TAG = VoiceService.class.getSimpleName(); /* Named searches allow to quickly reconfigure the decoder */ private static final String KWS_SEARCH = "wakeup"; /* Keyword we are looking for to activate menu */ private static final String KEYPHRASE = "next screen"; private SpeechRecognizer recognizer; @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { // Check if user has given permission to record audio int permissionCheck = ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.RECORD_AUDIO); if (permissionCheck == PackageManager.PERMISSION_GRANTED) { runRecognizerSetup(); } return super.onStartCommand(intent, flags, startId); } private void runRecognizerSetup() { // Recognizer initialization is a time-consuming and it involves IO, // so we execute it in async task new AsyncTask<Void, Void, Exception>() { @Override protected Exception doInBackground(Void... params) { try { Assets assets = new Assets(VoiceService.this); File assetDir = assets.syncAssets(); setupRecognizer(assetDir); } catch (IOException e) { return e; } return null; } @Override protected void onPostExecute(Exception result) { if (result != null) { Log.i(LOG_TAG, "Failed to init recognizer "); } else { switchSearch(KWS_SEARCH); } } }.execute(); } @Override public void onDestroy() { super.onDestroy(); if (recognizer != null) { recognizer.cancel(); recognizer.shutdown(); } } /** * In partial result we get quick updates about current hypothesis. In * keyword spotting mode we can react here, in other modes we need to wait * for final result in onResult. */ @Override public void onPartialResult(Hypothesis hypothesis) { if (hypothesis == null) return; String text = hypothesis.getHypstr(); if (text.contains(KEYPHRASE)) { Toast.makeText(this, "onPartialResult text=" + text, Toast.LENGTH_SHORT).show(); switchSearch(KWS_SEARCH); } Log.i(LOG_TAG, "onPartialResult text=" +text); } /** * This callback is called when we stop the recognizer. */ @Override public void onResult(Hypothesis hypothesis) { if (hypothesis != null) { String text = hypothesis.getHypstr(); Log.i(LOG_TAG, "onResult text=" +text); } } @Override public void onBeginningOfSpeech() { Log.i(LOG_TAG, "onBeginningOfSpeech"); } /** * We stop recognizer here to get a final result */ @Override public void onEndOfSpeech() { if (!recognizer.getSearchName().contains(KWS_SEARCH)) switchSearch(KWS_SEARCH); Log.i(LOG_TAG, "onEndOfSpeech"); } private void switchSearch(String searchName) { Log.i(LOG_TAG, "switchSearch searchName = " + searchName); recognizer.stop(); // If we are not spotting, start listening with timeout (10000 ms or 10 seconds). recognizer.startListening(searchName, 10000); } private void setupRecognizer(File assetsDir) throws IOException { // The recognizer can be configured to perform multiple searches // of different kind and switch between them recognizer = SpeechRecognizerSetup.defaultSetup() .setAcousticModel(new File(assetsDir, "en-us-ptm")) .setDictionary(new File(assetsDir, "cmudict-en-us.dict")) .setRawLogDir(assetsDir) // To disable logging of raw audio comment out this call (takes a lot of space on the device) .setKeywordThreshold(1e-45f) // Threshold to tune for keyphrase to balance between false alarms and misses .setBoolean("-allphone_ci", true) // Use context-independent phonetic search, context-dependent is too slow for mobile .getRecognizer(); recognizer.addListener(this); /** In your application you might not need to add all those searches. * They are added here for demonstration. You can leave just one. */ // Create keyword-activation search. recognizer.addKeyphraseSearch(KWS_SEARCH, KEYPHRASE); } @Override public void onError(Exception error) { Log.i(LOG_TAG, "onError " + error.getMessage()); } @Override public void onTimeout() { switchSearch(KWS_SEARCH); Log.i(LOG_TAG, "onTimeout"); } } This code works well, i just want add more keyphrase like "back screen" So i added code KEYPHRASE1 = "back screen" recognizer.addKeyphraseSearch(KWS_SEARCH, KEYPHRASE1); //onpartialResult fuction if (text.contains(KEYPHRASE1)) { Toast.makeText(this, "onPartialResult text=" + text, Toast.LENGTH_SHORT).show(); switchSearch(KWS_SEARCH); }
Add gram is another concept, i believe and accuracy is too low (without trained, my opinion). So could you help me? Thank you.
You can use keyphrase list file:
https://stackoverflow.com/questions/25748113/recognizing-multiple-keywords-using-pocketsphinx
Log in to post a comment.
Hello, thank you for your time.
I am willing to build speech recognition with only two word phrases "next screen" and "back screen".
Add only one keyphrase is working well.
I will add my code.
Add gram is another concept, i believe and accuracy is too low (without trained, my opinion).
So could you help me?
Thank you.
Last edit: Nickolay V. Shmyrev 2017-08-04
You can use keyphrase list file:
https://stackoverflow.com/questions/25748113/recognizing-multiple-keywords-using-pocketsphinx