Skip to content Skip to sidebar Skip to footer

Speechrecognizer Throws Onerror On The First Listening

In the Android 5 I faced with strange problem. The first call to the startListening of SpeechRecognizer results to the onError with error code 7 (ERROR_NO_MATCH). I made test app

Solution 1:

As soon as you configure the "Okay Google" function to every screen the error appears.

So this seems to be the reason!

Deactivate the function and the problem should be solved

Solution 2:

Done one workaround.

This is a regular flow

onReadyForSpeech -->onBeginningOfSpeech-->onEndOfSpeech -->onResults

But weired flow

onError(no match) -->onReadyForSpeech -->onBeginningOfSpeech-->onEndOfSpeech -->onResults

So set a boolean on the end of speech to true. and check onError to make sure that it has thrown an error after an end of speech!

speech.startListening(recognizerIntent);
isEndOfSpeech = false;

 @OverridepublicvoidonError(int error) {
        if (!isEndOfSpeech)
            return;
}


 @OverridepublicvoidonEndOfSpeech() { 
        isEndOfSpeech = true; 
    }

Solution 3:

I had the same problem but I couldn't find a workaround, so I ended up just calling return inside onError if the time between startListening and onError is unreasonably short.

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);
    }
}
...
@Overridepublic 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 alsoif (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.
}

Solution 4:

I had the same problem on several devices. It seems onError(7) is always called before onReadyForSpeech(), so if to avoid using ugly times, you can do something like:

publicvoidstart(){
    performingSpeechSetup = true;
    speechRecognizer.startListening(intent);
}

and in the RecognitionListener:

publicvoidonReadyForSpeech(Bundle bundle) {
    performingSpeechSetup = false;
}

@OverridepublicvoidonError(int error) {
    if (performingSpeechSetup && error == SpeechRecognizer.ERROR_NO_MATCH) return;
    // else handle error
}

Solution 5:

Turned out to be very easy in my case. The launching sound of the voice recognition was too loud and triggered the listening process at the very beginning. Turn down the system sound would help. (The volume key)

Post a Comment for "Speechrecognizer Throws Onerror On The First Listening"