SpeechRecognizer throws onError on the first listening

后端 未结 5 933
[愿得一人]
[愿得一人] 2020-12-11 07:09

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_

相关标签:
5条回答
  • 2020-12-11 07:12

    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:

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

    and in the 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
    }
    
    0 讨论(0)
  • 2020-12-11 07:17

    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

    0 讨论(0)
  • 2020-12-11 07:18

    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;
    
     @Override
        public void onError(int error) {
            if (!isEndOfSpeech)
                return;
    }
    
    
     @Override
        public void onEndOfSpeech() { 
            isEndOfSpeech = true; 
        }
    
    0 讨论(0)
  • 2020-12-11 07:27

    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)

    0 讨论(0)
  • 2020-12-11 07:38

    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);
        }
    }
    ...
    @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.
    }
    
    0 讨论(0)
提交回复
热议问题