Прослушиватель распознавания речи ERROR_NETWORK

У меня проблема с моим слушателем распознавания речи, как предлагает тема. Эта ошибка появляется случайным образом после того, как я начинаю слушать. Проблема такая же: 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, но это ничего не меняет.

Я также могу добавить, что я не могу использовать автономное распознавание, потому что мой язык (польский) еще не поддерживается.


person Lau    schedule 18.01.2015    source источник