2011-05-08 77 views
4

以識別Google服務器的語音,我使用SpeechRecognizer類與RecognitionListener結合使用,如Stephananswerthis question中所建議的。此外,我試圖捕獲音頻信號通過onBufferReceived()回調從RecognitionListener像被認可:捕獲發送給Google語音識別服務器的音頻

byte[] sig = new byte[500000] ; 
int sigPos = 0 ; 
... 
public void onBufferReceived(byte[] buffer) { 
    System.arraycopy(buffer, 0, sig, sigPos, buffer.length) ; 
    sigPos += buffer.length ; 
} 
... 

這似乎是做工精細,除了當SpeechRecognizer無法連接到谷歌服務器上,當音頻的塊是未複製到上述sig數組中,並且引發HTTP連接超時異常。 SpeechRecognizer最終連接到Google服務器,識別結果表明已收到完整的音頻信號;只有sig陣列缺少一些音頻塊。

有沒有人遇到同樣的問題?任何提示解決方案?謝謝!

+0

您是如何處理sig以獲取原始音頻信號以識別丟失的塊的? – ComputerEngineer88 2012-03-14 07:34:23

回答

1

我傾向於認爲這可能是識別服務行爲的不一致,甚至可能是您使用的Android版本中的錯誤。但是,文檔指出,不保證此方法被調用,因此它符合規範。我目前注意到的是以下內容(在Android 2.3.4上):我在記錄時獲取字節,但如果有例如SocketTimeout,它會在一段時間後嘗試向服務器重新發送數據,但不要再撥打onBufferReceived相同的數據。用於測試的代碼與您在發佈中鏈接的代碼相同。

爲什麼您認爲在該方法中收到的音頻中缺少一些塊?如果只有幾塊缺失,甚至可能是這種情況,儘管這些塊缺失,但承認起作用。