2013-04-02 15 views
4

我正在使用Android的語音API來不斷從用戶那裏獲取輸入。但是,如果發生錯誤,這種情況不會奏效。處理RecognitionListener錯誤

我所做的是在檢測錯誤的方法中重新啓動偵聽器。它有時可用,但識別器經常掛起一段時間。特別是在檢測到服務器,網絡超時和識別器繁忙錯誤之後。這很煩人!

我發現了一些嘗試解決這個問題,但他們都沒有爲我工作。

你有更好的主意嗎?

在這裏,我我的代碼:

private void startSR(){ 

    intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
    //intent.putExtra(RecognizerIntent., value) 
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
    intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, mContext.getPackageName()); 

    intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 10); 

    Log.d(TAG,"Speech recognition started!"); 
    if (recognizer != null) { 
     recognizer = null; 
     mListener = null; 
    } 

    Log.d(TAG,"setRecognitionListener"); 
    recognizer = SpeechRecognizer.createSpeechRecognizer(mContext); 
    mListener = new Listener(); 

    recognizer.setRecognitionListener(mListener); 

    recognizer.startListening(intent); 

} 
class Listener implements RecognitionListener{ 

    @Override 
    public void onBeginningOfSpeech() { 
     Log.i(TAG, "onBeginningOfSpeech"); 
     mStatus = "Beginning speech"; 
    } 

    @Override 
    public void onBufferReceived(byte[] buffer) { 
     Log.i(TAG, "onBufferReceived"); 

    } 

    @Override 
    public void onEndOfSpeech() { 
     Log.i(TAG, "onEndOfSpeech"); 
     mStatus = "Speech ended"; 
    } 


    @Override 
    public void onEvent(int eventType, Bundle params) { 
     Log.i(TAG, "onEvent " + eventType); 

    } 

    @Override 
    public void onPartialResults(Bundle partialResults) { 
     Log.i(TAG, "onPartialResults"); 
     mStatus = "Partial results"; 
    } 

    @Override 
    public void onReadyForSpeech(Bundle params) { 
     Log.i(TAG, "onReadyForSpeech"); 
     mReady = true; 
     mStatus = "Speech engine ready"; 
    } 
    @Override 
    public void onRmsChanged(float rmsdB) { 
     // TODO Auto-generated method stub 

    } 
    @Override 
    public void onError(int error) { 
     // TODO Auto-generated method stub 
     mError = ""; 
     mStatus = "Error detected"; 
     switch (error) { 
     case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:     
      mError = " network timeout"; 
      startListening(); 
      break; 
     case SpeechRecognizer.ERROR_NETWORK: 
      mError = " network" ; 
      //toast("Please check data bundle or network settings"); 
      return; 
     case SpeechRecognizer.ERROR_AUDIO: 
      mError = " audio"; 
      break; 
     case SpeechRecognizer.ERROR_SERVER: 
      mError = " server"; 
      startListening(); 
      break; 
     case SpeechRecognizer.ERROR_CLIENT: 
      mError = " client"; 
      break; 
     case SpeechRecognizer.ERROR_SPEECH_TIMEOUT: 
      mError = " speech time out" ; 
      break; 
     case SpeechRecognizer.ERROR_NO_MATCH: 
      mError = " no match" ; 
      startListening(); 

      break; 
     case SpeechRecognizer.ERROR_RECOGNIZER_BUSY: 
      mError = " recogniser busy" ; 
      break; 
     case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS: 
      mError = " insufficient permissions" ; 
      break; 

     } 
     Log.i(TAG, "Error: " + error + " - " + mError); 

     //startSR(); 
    } 


    @Override 
    public void onResults(Bundle results) { 
     mStatus = "Got some results"; 
     mResultAvailable = true; 
     String str = new String(); 
     Log.d(TAG, "onResults " + results); 

     mResults = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 

     //mConfidences = results.getDoubleArray(SpeechRecognizer.CONFIDENCE_SCORES); 

     Log.i(TAG, toString()); 

     startListening(); 


    } 



}// class Listener 

public ArrayList<String> getResults(){ 
    return mResults; 
} 
public void startListening(){ 
    if (SpeechRecognizer.isRecognitionAvailable(mContext)) { 
     if (recognizer!=null){ 
      recognizer.startListening(intent); 
      mResultAvailable = false; 
      mResults = new ArrayList<String>(); 
     } 
     else 
      startSR(); 
    } 
} 
+0

哪些語音識別您使用的? – Kaarel

+0

我正在使用SpeechRecognizer實例來初始化以實現一些RecongitionListener方法 – Patrick

+0

您的'Manifest'文件中是否有''? – 2013-05-20 20:45:00

回答

2
  • 如果你得到識別忙中出錯,你必須調用cancel,然後調用startListening
  • 如果你的服務器或網絡錯誤,你必須檢查網絡連接,因此調用startListening
0

嘗試錯誤後,收拾妥當,例如在SpeechRecognizer上撥打canceldestroy

+1

這仍然不起作用。如何捕獲錯誤「未連接到識別服務」?在我statListening()之後,它實際上並沒有偵聽到這個錯誤 – Patrick

2
Intent RC = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 

     if (!RC.hasExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE)) 
     { 
      RC.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, "com.dummy"); 
     } 

     sr.startListening(RC); 
0

前我發佈這個晚了,但這可能有助於某個人。 我也面臨着同樣的錯誤,也&這不是一些隨機的時間後聽, 我嘗試以下&它幫助我一些,嘗試這樣做,

case SpeechRecognizer.ERROR_RECOGNIZER_BUSY: 
     recognizer.destroy(); 
     startSR(); // As it destroys the current objects & calling startSR() will instantiate 
        // objects again