2011-08-17 87 views
3

我正試圖通過文本到語音和Android的語音識別活動實現與用戶對話的Android應用程序。Android語音識別活動的啓動延遲

以下代碼啓動活性,如記錄在tutorial

Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
     RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Speech recognition demo"); 
startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE); 

的問題是酶活性0.5到1秒之間的某個時候需要開始記錄用戶的語音。這看起來不是很多,但這通常意味着用戶在語音識別活動開始錄製之前已經開始講話,這意味着應用程序將錯過用戶說的部分內容。

是否有避免這種延遲的好方法,以便在文本到語音完成發言後立即開始語音識別?

可能性我認爲:

  • 預緊在Android上的活動,並暫停其上的開始。我不認爲有任何方法可以做到這一點,除非我有能力更改活動內的代碼,但我並不認爲它不屬於Android源代碼。
  • 在文本到語音完成之前開始活動的呼叫的時間。這並不理想,因爲它依賴於未定義的行爲:語音識別活動需要加載多長時間,這可能因系統而異。此外,它需要知道文本到語音將花費多長時間來說出一個短語,而不是text-to-speech API的一部分。
  • 開始語音識別活動,然後暫停正在運行的線程。絕對不推薦。
  • 從我的活動中的語音識別活動中未在API中公開的調用方法。我不知道如何做到這一點,我不確定是否有可能。
  • 實現我自己的語音識別活動版本。這就是我現在正在做的事情,但這無論如何也不是微不足道的,我寧願不必用Java編寫我自己的FLAC編碼器,並使用Google的服務器在未經許可的情況下進行語音識別。

如果您有任何其他想法,可以如何正確地完成或解決任何上述問題將是可怕的。

回答

1

你可以做的一件事是鼓勵你的用戶說更長的命令。這樣,如果他們開始說話太快,系統可以識別命令的後面部分。

例如,不是讓系統識別「打開電子郵件」,而是鼓勵用戶說「系統打開電子郵件」。這樣,如果系統只聽到「打開電子郵件」部分,它仍然可以識別該命令。

它可能會添加不必要的單詞給命令,但我相信它不會讓用戶暫停的尷尬。正如你所描述的,延遲是有問題的。

+0

是啊,這絕對是一個可行的解決方案,但它並不是非常適合短表的答案,如「是」,「否」或「取消」,其中用戶最在意的速度。 – sskates

1

看起來像有一個較低級別的方式來控制語音識別活動。

創建一個名爲SpeechRecognizer的對象,調用SpeechRecognizer.setRecognitionListener()並將其傳遞給RecognitionListener。然後將RecognizerIntent.ACTION_RECOGNIZE_SPEECH意圖傳遞給SpeechRecognizer.startListening(),它將開始聆聽並執行語音識別,而無需等待彈出窗口。

來源:How can I use speech recognition without the annoying dialog in android phones