Распознавание голоса перестает слушать через несколько секунд
Я много пробовал, но не могу это выяснить, поэтому надеюсь, что вы мне поможете.
Я пытаюсь создать собственное приложение для распознавания голоса, которое не отображает диалог.
Я уже написал некоторый код, и он работает довольно хорошо, но моя проблема в том, что распознаватель, кажется, останавливается без каких-либо ошибок или других сообщений в LogCat.
Странный факт заключается в том, что onRmsChanged из интерфейса RecognitionListener по-прежнему вызывается все время, но больше не вызывается onBeginningOfSpeech.
Если я говорю сразу после начала распознавания речи, это работает. Но это не так, если я подожду несколько секунд.
Используемый API - это 4.0.3, и я установил его на свой Nexus 7 с версией 4.2.1.
Буду очень признателен, если у вас есть хорошие идеи.
Некоторые фрагменты кода:
Мои занятия:
class SpeechListener implements RecognitionListener
{
public void onBeginningOfSpeech()
{
Log.d(TAG, "onBeginningOfSpeech()");
}
public void onBufferReceived(byte[] buffer)
{
Log.d(TAG, "onBufferReceived()");
}
public void onEndOfSpeech()
{
Log.d(TAG, "onEndOfSpeech()");
}
public void onError(int error)
{
Log.d(TAG, "onError(): " + error);
if(error == SpeechRecognizer.ERROR_NO_MATCH)
{
}
else if(error == SpeechRecognizer.ERROR_SPEECH_TIMEOUT)
{
}
else
{
tvOutput.setText("Error: " + error);
}
}
public void onEvent(int eventType, Bundle params)
{
Log.d(TAG, "onEvent()");
}
public void onPartialResults(Bundle partialResults)
{
Log.d(TAG, "onPartialResults()");
}
public void onReadyForSpeech(Bundle params)
{
Log.d(TAG, "onReadyForSpeech()");
}
public void onResults(Bundle results)
{
Log.d(TAG, "onResults(): " + results);
String str = new String();
ArrayList<String> data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
for(int i = 0; i < data.size(); i++)
{
str += data.get(i) + "\n";
}
tvOutput.setText(tvOutput.getText().toString() + "\n\n" + "Results: " + str);
}
public void onRmsChanged(float rmsdB)
{
Log.d(TAG, "onRmsChanged()");
}
}
И моя реализация в MainActivity:
this.srSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
this.srSpeechRecognizer.setRecognitionListener(new SpeechListener());
this.iSpeechIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
this.iSpeechIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
this.iSpeechIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, "voice.recognition.test");
this.iSpeechIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 10);
И так началось:
srSpeechRecognizer.startListening(iSpeechIntent);
Журналы с разговором:
12-16 13:50:53.576: D/DreamManagerService(485): Dream finished: android.os.Binder@415bbf38
12-16 13:50:53.576: I/DreamManagerService(485): Leaving dreamland.
12-16 13:50:53.576: I/DreamController(485): Stopping dream: name=ComponentInfo{com.google.android.deskclock/com.android.deskclock.Screensaver}, isTest=false, userId=0
12-16 13:50:53.586: I/PowerManagerService(485): Waking up from dream...
12-16 13:50:53.616: I/ActivityManager(485): No longer want com.google.android.gsf.login (pid 13171): empty #17
12-16 13:50:56.796: I/GoogleRecognitionServiceImpl(1461): #startListening [de-DE]
12-16 13:50:56.806: I/ActivityManager(485): Start proc com.google.android.gsf.login for service com.google.android.gsf.login/com.google.android.gsf.loginservice.GoogleLoginService: pid=13343 uid=10019 gids={50019, 3003, 1007, 1028, 1015, 2001, 3006}
12-16 13:50:56.866: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:56.886: D/dalvikvm(1461): GC_FOR_ALLOC freed 516K, 12% free 8706K/9892K, paused 18ms, total 18ms
12-16 13:50:56.906: D/dalvikvm(1461): GC_CONCURRENT freed 160K, 9% free 9015K/9892K, paused 3ms+2ms, total 21ms
12-16 13:50:56.906: I/AudioService(485): AudioFocus requestAudioFocus() from android.media.AudioManager@4135e960com.google.android.speech.audio.AudioController$1@41261910
12-16 13:50:56.916: I/VS.G3EngineManager(1461): create_rm: m=ENDPOINTER_VOICESEARCH,l=en-US
12-16 13:50:56.916: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:56.916: I/VS.G3EngineManager(1461): Brought up new g3 instance :/system/usr/srec/en-US/endpointer_voicesearch.config for: en-USin: 3 ms
12-16 13:50:56.926: I/ConnectionFactoryImpl(1461): Opening SSL connection: vs.google.com:14259
12-16 13:50:56.966: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:57.016: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:57.066: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:57.116: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:57.166: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:57.216: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:57.266: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:57.316: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:57.366: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:57.416: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:57.466: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:57.516: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:57.566: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:57.616: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:57.666: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:57.716: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:57.766: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:57.816: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:57.866: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:57.916: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:57.966: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:58.016: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:58.066: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:58.116: I/MainActivity/SpeechListener(13268): onBeginningOfSpeech()
12-16 13:50:58.126: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:58.176: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:58.226: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:58.276: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:58.326: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:58.376: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:58.426: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:58.476: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:58.526: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:58.576: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:58.626: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:58.676: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:58.726: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:58.776: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:58.826: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:58.876: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:58.926: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:58.976: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:59.026: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:59.076: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:59.126: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:59.176: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:59.236: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:59.286: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:59.336: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:59.386: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:59.436: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:59.486: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:59.536: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:59.586: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:59.636: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:59.646: I/MicrophoneInputStream(1461): mic_close
12-16 13:50:59.666: I/AudioService(485): AudioFocus abandonAudioFocus() from android.media.AudioManager@4135e960com.google.android.speech.audio.AudioController$1@41261910
12-16 13:50:59.666: D/dalvikvm(1461): threadid=37: thread exiting, not yet detached (count=0)
12-16 13:50:59.666: I/MainActivity/SpeechListener(13268): onEndOfSpeech()
12-16 13:50:59.676: I/decoder(1461): INFO: recognition time wall: 2.732 sec user: 0.54 sec sys: 0.08 sec
12-16 13:50:59.686: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:59.736: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:59.786: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:59.826: I/MainActivity/SpeechListener(13268): onResults(): Bundle[mParcelledData.dataSize=292]
12-16 13:50:59.836: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:59.886: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:59.936: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:50:59.986: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:51:00.046: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:51:00.096: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:51:00.146: D/MainActivity/SpeechListener(13268): onRmsChanged()
12-16 13:51:00.196: D/MainActivity/SpeechListener(13268): onRmsChanged()
Логи без разговоров:
12-16 13:53:39.246: I/GoogleRecognitionServiceImpl(1461): #startListening [de-DE]
12-16 13:53:39.296: D/dalvikvm(1461): GC_FOR_ALLOC freed 567K, 12% free 8708K/9892K, paused 21ms, total 21ms
12-16 13:53:39.316: D/dalvikvm(1461): GC_CONCURRENT freed 164K, 9% free 9017K/9892K, paused 3ms+2ms, total 21ms
12-16 13:53:39.316: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:39.316: I/AudioService(485): AudioFocus requestAudioFocus() from android.media.AudioManager@4135e960com.google.android.speech.audio.AudioController$1@41261910
12-16 13:53:39.326: I/VS.G3EngineManager(1461): create_rm: m=ENDPOINTER_VOICESEARCH,l=en-US
12-16 13:53:39.326: I/ConnectionFactoryImpl(1461): Opening SSL connection: vs.google.com:14259
12-16 13:53:39.326: I/VS.G3EngineManager(1461): Brought up new g3 instance :/system/usr/srec/en-US/endpointer_voicesearch.config for: en-USin: 5 ms
12-16 13:53:39.366: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:39.416: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:39.466: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:39.516: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:39.576: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:39.626: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:39.676: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:39.726: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:39.776: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:39.826: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:39.876: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:39.926: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:39.976: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:40.026: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:40.076: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:40.136: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:40.176: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:40.226: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:40.286: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:40.336: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:40.386: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:40.436: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:40.486: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:40.536: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:40.586: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:40.636: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:40.686: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:40.736: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:40.786: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:40.836: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:40.886: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:40.936: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:40.986: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:41.046: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:41.096: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:41.146: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:41.196: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:41.246: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:41.296: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:41.346: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:41.396: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:41.446: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:41.496: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:41.546: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:41.596: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:41.646: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:41.696: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:41.746: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:41.796: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:41.846: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:41.896: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:41.946: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:41.996: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:42.046: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:42.096: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:42.146: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:42.196: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:42.246: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:42.296: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:42.356: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:42.406: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:42.456: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:42.506: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:42.556: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:42.606: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:42.656: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:42.706: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:42.756: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:42.806: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:42.856: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:42.906: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:42.956: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:43.006: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:43.056: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:43.116: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:43.156: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:43.216: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:43.266: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:43.316: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:43.366: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:43.416: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:43.466: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:43.516: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:43.566: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:43.616: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:43.666: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:43.716: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:43.766: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:43.816: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:43.866: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:43.916: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:43.966: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:44.016: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:44.066: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:44.116: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:44.166: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:44.226: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:44.276: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:44.326: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:44.376: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:44.426: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:44.476: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:44.526: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:44.576: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:44.626: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:44.676: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:44.726: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:44.776: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:44.826: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:44.876: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:44.926: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:44.976: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:45.026: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:45.076: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:45.126: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:45.176: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:45.226: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:45.276: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:45.326: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:45.376: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:45.426: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:45.476: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:45.526: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:45.576: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:45.636: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:45.676: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:45.736: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:45.786: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:45.836: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:45.886: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:45.936: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:45.986: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:46.036: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:46.086: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:46.136: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:46.186: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:46.236: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:46.286: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:46.336: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:46.386: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:46.436: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:46.486: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:46.536: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:46.596: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:46.636: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:46.696: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:46.746: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:46.796: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:46.846: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:46.896: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:46.946: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:46.996: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:47.046: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:47.096: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:47.146: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:47.196: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:47.246: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:47.296: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:47.346: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:47.396: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:47.446: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:47.496: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:47.556: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:47.596: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:47.656: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:47.696: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:47.746: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:47.796: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:47.856: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:47.906: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:47.956: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:48.006: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:48.056: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:48.106: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:48.156: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:48.206: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:48.256: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:48.306: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:48.356: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:48.406: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:48.456: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:48.506: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:48.556: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:48.616: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:48.656: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:48.706: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:48.766: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:48.816: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:48.866: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:48.916: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:48.966: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:49.016: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:49.066: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:49.116: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:49.166: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:49.216: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:49.266: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:49.316: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:49.366: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:49.416: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:49.466: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:49.516: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:49.566: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:49.616: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:49.666: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:49.716: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:49.776: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:49.816: D/dalvikvm(1461): GC_FOR_ALLOC freed 106K, 9% free 9025K/9892K, paused 32ms, total 32ms
12-16 13:53:49.816: I/dalvikvm-heap(1461): Grow heap (frag case) to 9.282MB for 320656-byte allocation
12-16 13:53:49.836: D/dalvikvm(1461): GC_FOR_ALLOC freed 156K, 11% free 9182K/10208K, paused 19ms, total 19ms
12-16 13:53:49.836: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:49.886: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:49.936: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:49.986: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:50.036: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:50.086: D/MainActivity/SpeechListener(13441): onRmsChanged()
12-16 13:53:50.136: D/MainActivity/SpeechListener(13441): onRmsChanged()
3 ответа
Единственное решение, которое наверняка обойдет эту проблему, - это использование сторонней службы. 4.1.1 и 4.2 оба полагаются на версию службы распознавания речи, которая не придерживается документированного поведения в том смысле, что служба, на которой она работает, молча умирает.
Если вы не хотите использовать сторонний API и вам нужно каким-то образом учитывать смерть этого сервиса, это возможно, но это не красиво и не идеально.
Как только служба умирает, ни один из следующих методов никогда не будет вызван:
- onBeginningOfSpeech
- OnError
- onResults
- onEndOfSpeech
Но если onBeginningOfSpeech вызывается до того, как служба умирает, вы можете быть уверены, что в конце концов будет вызван либо onError, либо onEndOfSpeech.
Поэтому, если все, что вам нужно, это убедиться, что вы узнали о жизни и смерти службы в Jellybean, обходной путь для этой проблемы во встроенном SpeechRecognizer заключается в следующем:
- Создайте логический флаг, такой как isSpeechRecognizerAlive.
- Каждый раз, когда вы запускаете SpeechRecognizer, установите для указанного выше флага значение false.
- В onBeginningOfSpeech, если он вызывается, присвойте isSpeechRecognizerAlive значение true.
- Поддерживайте обработчик, который с задержкой в 4 секунды будет проверять состояние isSpeechRecognizerAlive. Если значение равно false, вручную убейте экземпляр SpeechRecognizer. Если это правда, ничего не делать. Нормальный поток позаботится обо всем за вас.
Почему это не идеальное решение для поддержания непрерывной настройки распознавания речи
Это не было прямо указано в вашем вопросе, но несколько человек хотят сделать это, чтобы иметь возможность непрерывного распознавания речи. Это не очень хороший способ сделать это в 4.1.1 и 4.2, потому что сервис Google SpeechRecognition теперь запускается с необязательным звуковым эффектом "bloop". Кажется, нет никакого способа отключить этот звук. Ничто не перечислено в API, чтобы управлять этим. Ваши пользователи НЕ будут ценить то, что их "замкнули" на 4-секундном повторяющемся цикле
Я создал Службу с распознавателем аудио в речь, которая имитирует непрерывность, перезапуская себя каждый раз, когда возникает ошибка или результат. Как вы можете видеть, мой сервис прослушивает широковещательный приемник, чтобы запустить / остановить непрерывный ASR (это дорогая батарея, поэтому я рекомендую запускать этот сервис непрерывного ASR только тогда, когда ваш соответствующий пользовательский интерфейс находится на переднем плане). Результаты ASR также транслируются в остальной части приложения. Вы можете игнорировать трансляцию, сервис и Recognizer Listener являются основной идеей. НЕ забывайте разрешение ИНТЕРНЕТА и манифест, и декларацию сервиса:
<service android:name=".speechRecognitionService" />
SpeechRecognitionService:
/**
* Created by Josh on 22/07/15.
* This service bears an Audio to Speech recognizer (ASR), once this service is started,
* it listens a broadcast called "asrService".
* the Service starts ASR when it receives a "START-ASR" value inside the "message" parameter of its broadcast receiver
* the Service stopss ASR when it receives a "STOP-ASR" value inside the "message" parameter of its broadcast receiver
Example:
Intent intent = new Intent("asrService");
intent.putExtra("message", "STOP-ASR");
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
Once the ASR Listener that this service bears is running, it will broadcast the results is gets.
To catch ASR results, implement a Broadcast receiver that listens to app.asrResult="ASRresult", for example:
private BroadcastReceiver ASRReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String message = intent.getStringExtra("message");
if(message!=null) {
app.logwhite("ASR says: "+message);
}
}
};
LocalBroadcastManager.getInstance(this).registerReceiver(ASRReceiver, new IntentFilter(app.asrResult));
Unregister the broadcast receiver likewise:
LocalBroadcastManager.getInstance(this).unregisterReceiver(ASRReceiver);
*/
public class speechRecognitionService extends Service {
private static speechRecognitionListenerJosh speechReconListener;
private static SpeechRecognizer mSpeechRecognizer=null;
private static Intent mSpeechRecognizerIntent;
private static boolean mIslistening=false;
//======== BROADCAST RECEIVERS
// handler for received Intents for the "my-event" event
private BroadcastReceiver startASRReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String message = intent.getStringExtra("message");
if(message.equals("START-ASR")) {
if (mIslistening == false) {
if (mSpeechRecognizer != null) {
mSpeechRecognizer.destroy();
mSpeechRecognizer = null;
}
app.logy("==BROADCAST Rx: START_ASR");
mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "en-US");
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
//mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
//mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE , this.getPackageName());
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS, 5000);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 5000);
//mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);
//mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 3);
mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(getApplicationContext());
speechReconListener = new speechRecognitionListenerJosh();
mSpeechRecognizer.setRecognitionListener(speechReconListener);
mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
} else {
app.logy("==BROADCAST Rx: STOP_ASR");
mSpeechRecognizer.stopListening();
mSpeechRecognizer.destroy();
speechReconListener = null;
}
}
if(message.equals("STOP-ASR")){
app.logy("==BROADCAST Rx: STOP_ASR");
mSpeechRecognizer.stopListening();
mSpeechRecognizer.destroy();
speechReconListener = null;
}
}
};
@Override
public void onCreate() {
super.onCreate();
mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "en-US");
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL , RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
//mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE , this.getPackageName());
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 4000);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 3);
mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
speechReconListener = new speechRecognitionListenerJosh();
mSpeechRecognizer.setRecognitionListener(speechReconListener);
LocalBroadcastManager.getInstance(this).registerReceiver(startASRReceiver, new IntentFilter("asrService"));
app.toastlog("==ASR Service - CREATED");
}
@Override
public void onDestroy() {
super.onDestroy();
LocalBroadcastManager.getInstance(this).unregisterReceiver(startASRReceiver);
if (mSpeechRecognizer != null){
mSpeechRecognizer.destroy();
mSpeechRecognizer=null;
}
app.toastlog("==ASR Service - DESTROYED");
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override //rather not use, runs before onStart
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
app.toastlog("==ASRservice - onStart");
}
private class speechRecognitionListenerJosh implements RecognitionListener {
@Override
public void onBeginningOfSpeech() {
mIslistening=true;
app.loge("=ASRListener - onBeginingOfSpeech");
}
@Override
public void onBufferReceived(byte[] buffer){
}
@Override
public void onEndOfSpeech(){
app.loge("=ASRListener - onEndOfSpeech");
}
@Override
public void onError(int error) {
mIslistening=false;
String code= Integer.toString(error);
if(error==SpeechRecognizer.ERROR_CLIENT){ // 5
code="ERROR_CLIENT";
mIslistening=false;
mSpeechRecognizer.destroy();
Intent intent = new Intent("asrService");
intent.putExtra("message", "START-ASR");
LocalBroadcastManager.getInstance(app.appContext).sendBroadcast(intent);
}
if(error==SpeechRecognizer.ERROR_SPEECH_TIMEOUT){ // 6
code="SPEECH_TIMEOUT";
mSpeechRecognizer.stopListening();
mIslistening=false;
Intent intent = new Intent("asrService");
intent.putExtra("message", "START-ASR");
LocalBroadcastManager.getInstance(app.appContext).sendBroadcast(intent);
//Usualy bounces back to ERROR_CLIENT.
}
if(error==SpeechRecognizer.ERROR_NO_MATCH){ // 7
code="ERROR_NO_MATCH";
mIslistening=false;
Intent intent = new Intent("asrService");
intent.putExtra("message", "START-ASR");
LocalBroadcastManager.getInstance(app.appContext).sendBroadcast(intent);
//Usually bounces back to ERROR_CLIENT.
}
app.loge("=ASRListener - ASR Error: "+code);
/*
// 1 = NETWORK_TIMEOUT
// 2 = ERROR_NETWORK
// 3 = ERROR_AUDIO
// 4 = ERROR_SERVER
// 5 = ERROR_CLIENT
// 8 = ERROR_RECOGNIZER_BUSY
// 9 = ERROR_INSUFFICIENT_PERMISSIONS
*/
}
@Override
public void onEvent(int eventType, Bundle params){
}
@Override //Somehow doesn't trigger upon partial results
public void onPartialResults(Bundle partialResults){
ArrayList<String> results=partialResults.getStringArrayList("EXTRA_PARTIAL_RECOGNITION");
if(results!=null) {
if (results.size() > 0) {
app.logwhite("=== ASR Partial Results: " + results);
}
}
}
@Override
public void onReadyForSpeech(Bundle params){
app.loge("=ASRListener - onReadyForSpeech, LISTENING (((( ");
}
@Override
public void onResults(Bundle resultBundle){
app.loge("=ASRListener - onResults");
ArrayList<String> result = resultBundle.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
if(result!=null) { //when speaking timeout happen, results is null
// matches are the return values of speech recognition engine
if (result.size() > 0) {
app.logwhite("=== ASR Results:");
app.logwhite(result.get(0));
//BC name, message
app.broadcast(app.asrResult,result.get(0)); //The result is broadcast to the entire app
}
}
mIslistening=false;
Intent intent = new Intent("asrService");
intent.putExtra("message", "START-ASR");
LocalBroadcastManager.getInstance(app.appContext).sendBroadcast(intent);
}
@Override
public void onRmsChanged(float rmsdB){
//VOLUME VUmeter!!!!
}
}
}
Вы можете попробовать предоставить следующие дополнительные функции RecognizerIntent:
EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS
EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS
EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS
хотя ни один из них действительно не подходит в этом случае. Android просто не предлагает "WAIT_UNTIL_I_START_SPEAKING
"extra. Это не ошибка (в Jelly Bean или где-либо еще), это просто отсутствие функции. И даже если такое дополнение будет добавлено в будущую версию Android, не может быть гарантии, что приложение распознавания речи (такой как Google Voice Search) фактически реализует это. Документация RecognizerIntent содержит множество дополнений с неопределенным поведением.
Лучшим вариантом может быть повторный запуск распознавателя, как только вы получите onEndOfSpeech
или же onError
,
Некоторое время я сталкивался с той же проблемой и нигде не мог найти правильный рабочий ответ. Чтобы слушать бесконечно, отправьте сообщениеonError()
или onResults()
Я звонил speechRecognizer.startListening(intent);
снова после повторного создания экземпляра SpeechRecognizer и повторной установки объекта намерения.
Но, как вы упомянули, в конечном итоге он отключается после некоторого прослушивания.
Вот что я пробовал, и у меня это сработало.
Я просто убедился, что прежде чем вспомнить speechRecognizer.startListening(intent);
Я бы просто позвонил
speechRecognizer.stopListening();
speechRecognizer.destroy();
и делать вещи, упомянутые в первом параграфе.
Пока что у меня все работает нормально.
У меня была такая же проблема с библиотекой Node.js, и вот проблема, которую я отправил вместе с ответом команды.https://github.com/googleapis/nodejs-speech/issues/667
TL; DR; Установите конфигурацию следующим образом (обратите внимание на использование расширенных моделей)
const config = {
encoding: "LINEAR16",
sampleRateHertz: 16000,
languageCode: "en-US",
metadata: recognitionMetadata,
model: 'phone_call',
useEnhanced: true}
Результат, который вы получите, следующий - обратите внимание на альтернативы, на мой взгляд, это немного вводит в заблуждение формулировка, ну да ладно:
[{"results":[{"alternatives":[{"words":[],"transcript":"I live in Boston","confidence":0.9128385782241821}],"channelTag":0,"languageCode":"en-us"},{"alternatives":[{"words":[],"transcript":" Boston is an amazing City","confidence":0.9128385186195374}],
Когда вы говорите что-то, вы говорите о конце речи, а это значит, что он что-то слышал. но странно, что он все еще слушает, я думаю, что он начинает слушать снова без показа начала прослушивания. Я думаю, что вы должны сделать проверку на результат. если результаты - ваши желаемые результаты, тогда можно перевернуть речь и отпустить ее, иначе вы можете остановить и снова начать распознавание речи. он снова начнет слушать, даже после того, как прозвучит конец речи.