SpeechRecognizer在第一次侦听时抛出onError

时间:2015-06-26 11:08:11

标签: android speech-recognition speech

在Android 5中我遇到了奇怪的问题。第一次调用SpeechRecognizer的startListening会导致错误代码为7的错误( ERROR_NO_MATCH )。

我使用以下代码制作了测试应用程序:

if (speechRecognizer == null) {

    speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
    speechRecognizer.setRecognitionListener(new RecognitionListener() {
        @Override
        public void onReadyForSpeech(Bundle bundle) {
            Log.d(TAG, "onReadyForSpeech");
        }

        @Override
        public void onBeginningOfSpeech() {
            Log.d(TAG, "onBeginningOfSpeech");
        }

        @Override
        public void onRmsChanged(float v) {
            Log.d(TAG, "onRmsChanged");
        }

        @Override
        public void onBufferReceived(byte[] bytes) {
            Log.d(TAG, "onBufferReceived");
        }

        @Override
        public void onEndOfSpeech() {
            Log.d(TAG, "onEndOfSpeech");
        }

        @Override
        public void onError(int i) {
            Log.d(TAG, "onError " + i);
        }

        @Override
        public void onResults(Bundle bundle) {
            Log.d(TAG, "onResults");
        }

        @Override
        public void onPartialResults(Bundle bundle) {
            Log.d(TAG, "onPartialResults");
        }

        @Override
        public void onEvent(int i, Bundle bundle) {
            Log.d(TAG, "onEvent");
        }
    });
}

final Intent sttIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
sttIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
        RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
sttIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "en");
sttIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "en");

speechRecognizer.startListening(sttIntent);

在第一次startListening致电后收到此日志消息:

onError 7
onReadyForSpeech
onBeginningOfSpeech
onEndOfSpeech
onResults

在另一个startListening来电之后关注消息:

onRmsChanged
...
onRmsChanged
onReadyForSpeech
onRmsChanged
...
onRmsChanged
onBeginningOfSpeech
onRmsChanged
...
onRmsChanged
onEndOfSpeech
onRmsChanged
onRmsChanged
onRmsChanged
onResults

那么,这个错误的原因是什么,我该如何解决?

5 个答案:

答案 0 :(得分:6)

一旦你配置了" Okay Google"功能到每个屏幕出现错误。

所以这似乎是原因!

取消激活功能,问题应解决

答案 1 :(得分:3)

完成一个解决方法。

这是一个常规流程

onReadyForSpeech - > onBeginningOfSpeech - > onEndOfSpeech - > onResults

但是流量

onError(不匹配) - > onReadyForSpeech - > onBeginningOfSpeech - > onEndOfSpeech - > onResults

因此,在语音结束时将布尔值设置为true。并检查onError以确保它在演讲结束后抛出错误!

speech.startListening(recognizerIntent);
isEndOfSpeech = false;

 @Override
    public void onError(int error) {
        if (!isEndOfSpeech)
            return;
}


 @Override
    public void onEndOfSpeech() { 
        isEndOfSpeech = true; 
    }

答案 2 :(得分:2)

我遇到了同样的问题,但我找不到解决方法,所以如果startListening和onError之间的时间不合理地缩短,我最终只是在onError中调用return。

protected long mSpeechRecognizerStartListeningTime = 0;

protected synchronized void speechRecognizerStartListening(Intent intent) {
    if (mSpeechRecognizer != null) {
        this.mSpeechRecognizerStartListeningTime = System.currentTimeMillis();
        RLog.d(this, "speechRecognizerStartListening");
        this.mSpeechRecognizer.startListening(intent);
    }
}
...
@Override
public synchronized void onError(int error) {
    RLog.i(this, this.hashCode() + " - onError:" + error);

// Sometime onError will get called after onResults so we keep a boolean to ignore error also
    if (mSuccess) {
        RLog.w(this, "Already success, ignoring error");
        return;
    }

    long duration = System.currentTimeMillis() - mSpeechRecognizerStartListeningTime;
    if (duration < 500 && error == SpeechRecognizer.ERROR_NO_MATCH) {
        RLog.w(this, "Doesn't seem like the system tried to listen at all. duration = " + duration + "ms. This might be a bug with onError and startListening methods of SpeechRecognizer");
        RLog.w(this, "Going to ignore the error");
        return;
    }

// -- actual error handing code goes here.
}

答案 3 :(得分:2)

我在几台设备上遇到了同样的问题。似乎onError(7)总是在onReadyForSpeech()之前调用,所以如果要避免使用丑陋的时间,你可以做类似的事情:

public void start(){
    performingSpeechSetup = true;
    speechRecognizer.startListening(intent);
}

并在RecognitionListener中:

public void onReadyForSpeech(Bundle bundle) {
    performingSpeechSetup = false;
}

@Override
public void onError(int error) {
    if (performingSpeechSetup && error == SpeechRecognizer.ERROR_NO_MATCH) return;
    // else handle error
}

答案 4 :(得分:0)

在我的案例中变得非常容易。语音识别的发声声音太大,一开始就触发了聆听过程。调低系统声音会有所帮助。 (音量键)