У меня проблема с моим слушателем распознавания речи, как предлагает тема. Эта ошибка появляется случайным образом после того, как я начинаю слушать. Проблема такая же: Link
С учетом этого ответа:
В соответствии с использованием SpeechRecognizer выдает ERROR_NETWORK (значение 2), ошибка была вызвана речевым API Samsung (на базе Vlingo). Изменение голосового API в настройках телефона на стандартное Google API решило проблемы.
Я могу добавить, что я использую Samsung Galaxy S4 (и, очевидно, распознаватель Vlingo не отмечен)
Хорошо... мой код:
SpeechRecognizerService.java
@Override
public void cancel() {
mAudioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, false);
mSpeechRecognizer.cancel();
listener.setListening(false);
}
@Override
public void listen() {
mAudioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, true);
if (!listener.isListening()) {
mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
listener.setListening(true);
}
}
@Override
public void repeat() {
mSpeechRecognizer.cancel();
mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
listener.setListening(true);
}
Намерение распознавания речи
public Intent getSpeechIntent() {
Intent mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "pl");
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, Config.getContext().getPackageName());
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 3);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_WEB_SEARCH_ONLY, true);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 100);
return mSpeechRecognizerIntent;
}
Прослушиватель распознавания речи
@Override
public void onBeginningOfSpeech() {
Log.i(TAG, "on begining");
}
@Override
public void onBufferReceived(byte[] buffer) {
}
@Override
public void onEndOfSpeech() {
Log.i(TAG, "on end");
}
@Override
public void onError(int error) {
Log.i(TAG, error + "");
service.repeat();
}
@Override
public void onEvent(int eventType, Bundle params) {
}
@Override
public void onPartialResults(Bundle partialResults) {
}
@Override
public void onReadyForSpeech(Bundle params) {
Log.i(TAG, "on ready for speech");
}
@Override
public void onResults(Bundle results) {
Log.i(TAG, "on results");
service.manageResults(results);
service.cancel();
}
@Override
public void onRmsChanged(float rmsdB) {
}
LogCat при правильной работе
01-18 12:56:08.827: I/SPEECH LISTENER(602): on ready for speech
01-18 12:56:09.538: I/SPEECH LISTENER(602): on begining
01-18 12:56:10.969: I/SPEECH LISTENER(602): on end
01-18 12:56:11.670: I/SPEECH LISTENER(602): on results
01-18 12:56:11.740: I/SPEECH LISTENER(602): on end
здесь это работает правильно, но почему «конец» срабатывает дважды?
LogCat при возникновении ошибки
01-18 13:00:42.694: I/SPEECH LISTENER(3202): on ready for speech
01-18 13:00:42.694: I/SPEECH LISTENER(3202): 2
01-18 13:00:42.704: I/SPEECH LISTENER(3202): on ready for speech
01-18 13:00:42.704: I/SPEECH LISTENER(3202): 2
01-18 13:00:43.185: I/SPEECH LISTENER(3202): on ready for speech
01-18 13:00:43.415: I/SPEECH LISTENER(3202): on ready for speech
01-18 13:00:43.415: I/SPEECH LISTENER(3202): 2
01-18 13:00:43.425: I/SPEECH LISTENER(3202): on ready for speech
01-18 13:00:43.425: I/SPEECH LISTENER(3202): 2
01-18 13:00:43.625: I/SPEECH LISTENER(3202): on ready for speech
01-18 13:00:43.975: I/SPEECH LISTENER(3202): on ready for speech
01-18 13:00:43.975: I/SPEECH LISTENER(3202): 2
01-18 13:00:43.985: I/SPEECH LISTENER(3202): on ready for speech
01-18 13:00:43.985: I/SPEECH LISTENER(3202): 2
01-18 13:00:44.176: I/SPEECH LISTENER(3202): on ready for speech
01-18 13:00:46.548: I/SPEECH LISTENER(3202): on begining
01-18 13:00:47.979: I/SPEECH LISTENER(3202): on end
01-18 13:00:49.060: I/SPEECH LISTENER(3202): on results
01-18 13:00:49.190: I/SPEECH LISTENER(3202): on end
2 означает, что сработала ошибка (2 - ERROR_NETWORK)
Android Manifest.xml — разрешения
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
Я также пытался использовать свой SpeechRecognizer как синглтон, как предлагает кто-то из stackoverflow, но это ничего не меняет.
Я также могу добавить, что я не могу использовать автономное распознавание, потому что мой язык (польский) еще не поддерживается.