2017-07-28 35 views
3

我正在開發Android,並使用SpeechRecognizer來實現連續語音識別。爲什麼SpeechRecognizer在onEndOfSpeech被調用後啓動時很忙?

開始後通過下面的代碼語音識別:

private void startListening(){ 
    recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH); 
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "en"); 
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getActivity().getPackageName()); 
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS,Long.valueOf(3000L)); 
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,1); 
} 

並再次調用startListening()onEndOfSpeech被調用。

onError將被調用,並顯示SpeechRecognizer.ERROR_RECOGNIZER_BUSY

Q1: 爲什麼SpeechRecognizer忙,當我onEndOfSpeech後開始已叫什麼名字?

Q2 如何實現連續語音識別的方式?

回答

1

Android語音識別庫的設計方式是在廣泛使用時最終會出現超時。

因此,沒有官方文檔說明爲什麼Google會這樣做,即使使用Google應用程序,也沒有可用的連續語音識別。

爲了克服這個問題,我們需要利用語音回調方法來抓住錯誤並再次嘗試收聽。我創建了一個專門用來克服這個超時問題的庫,我認爲它也可以滿足您的需求。

轉到Github - DroidSpeech並將庫添加到您的項目中,或者克隆它,或者您可以使用gradle依賴。一旦添加初始化Droid的講話,並設置監聽如下文所述,

DroidSpeech droidSpeech = new DroidSpeech(this, null); 
droidSpeech.setOnDroidSpeechListener(this); 

要收聽用戶調用下面的代碼,

droidSpeech.startDroidSpeechRecognition(); 

,你會得到的聲音結果在監聽方法,

@Override 
public void onDroidSpeechFinalResult(String finalSpeechResult, boolean droidSpeechWillListen) 
{ 
    // Do whatever you want with the speech result 
} 

是什麼讓這個庫不同的是,

  1. 信息的每個詞說出之後連續語音識別的支持,
  2. 你不需要爲庫注意到了這一問題擔心語音忙&超時錯誤,並確保它完全根除的問題,
  3. 您不必編寫代碼特定的語音識別比初始化庫和設置監聽器方法以外的任何線路,
  4. 可以採取詢問是否需要麥克風權限用戶的關懷
  5. 注意到惱人的蜂鳴聲的護理聲音如果有錯誤
+0

謝謝,我會試試! – Wun

+0

爲什麼在幾次嘗試後停止工作?還是我用它錯了? – edwardffs

相關問題