2011-08-23 30 views
14

我的應用程序記錄使用的AsyncTask,還可以使用谷歌API轉換語音到文本MediaRecorder類音頻 - 語音識別意圖 - 使用此問題的代碼:How can I use speech recognition without the annoying dialog in android phonesAndroid的語音識別,並在同一時間錄音

我曾嘗試也要在Thread中錄製音頻,但這是更糟糕的解決方案。它會導致更多的問題。我的問題是我的應用程序在模擬器上正常工作。但由於缺乏語音識別服務,仿真器不支持語音重新識別。而在我的設備上,當我開始錄製音頻和語音識別時,我的應用程序崩潰 - 「意外停止」。但是,當我關閉WiFi時,應用程序在仿真器上正常工作。

錄製音頻需要AndroidManifest:

<uses-permission android:name="android.permission.RECORD_AUDIO" /> 

和語音識別requiers:

<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
<uses-permission android:name="android.permission.INTERNET" /> 

我想這是一個音頻輸入問題?我該如何解決這個問題? 谷歌語音識別器的要求工作在主UI線程,所以我不能在異步任務。所以我在Async Task中錄音。我不知道爲什麼這會導致問題。

我已將我的設備連接到Eclipse,並使用USB調試。這是execption我在logcat中:

08-23 14:50:03.528: ERROR/ActivityThread(12403): Activity go.android.Activity has leaked ServiceConnection [email protected] that was originally bound here 
08-23 14:50:03.528: ERROR/ActivityThread(12403): android.app.ServiceConnectionLeaked: Activity go.android.Activity has leaked ServiceConnection [email protected] that was originally bound here 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ActivityThread$PackageInfo$ServiceDispatcher.<init>(ActivityThread.java:1121) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ActivityThread$PackageInfo.getServiceDispatcher(ActivityThread.java:1016) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ContextImpl.bindService(ContextImpl.java:951) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.content.ContextWrapper.bindService(ContextWrapper.java:347) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.speech.SpeechRecognizer.startListening(SpeechRecognizer.java:267) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at go.android.Activity.startRecordingAndAnimation(Activity.java:285) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at go.android.Activity.onResume(Activity.java:86) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1151) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.Activity.performResume(Activity.java:3823) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3118) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3143) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2684) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.os.Looper.loop(Looper.java:123) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at java.lang.reflect.Method.invoke(Method.java:521) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at dalvik.system.NativeStart.main(Native Method) 

而在這之後另一個異常:

08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412): Failed to create session 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412): com.google.android.voicesearch.speechservice.ConnectionException: POST failed 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.SpeechServiceHttpClient.post(SpeechServiceHttpClient.java:176) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.SpeechServiceHttpClient.post(SpeechServiceHttpClient.java:88) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.ServerConnectorImpl.createTcpSession(ServerConnectorImpl.java:118) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.ServerConnectorImpl.createSession(ServerConnectorImpl.java:98) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.RecognitionController.runRecognitionMainLoop(RecognitionController.java:679) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.RecognitionController.startRecognition(RecognitionController.java:463) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.RecognitionController.access$200(RecognitionController.java:75) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.RecognitionController$1.handleMessage(RecognitionController.java:300) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at android.os.Looper.loop(Looper.java:123) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at android.os.HandlerThread.run(HandlerThread.java:60) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412): Caused by: java.net.SocketTimeoutException 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.harmony.luni.net.PlainSocketImpl.read(PlainSocketImpl.java:564) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.harmony.luni.net.SocketInputStream.read(SocketInputStream.java:88) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:191) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:82) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:174) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:179) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:235) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:259) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:410) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at android.net.http.AndroidHttpClient.execute(AndroidHttpClient.java:243) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.SpeechServiceHttpClient.post(SpeechServiceHttpClient.java:167) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  ... 10 more 
08-23 14:50:08.000: ERROR/RecognitionController(12412): Ignoring error 2 
+0

我試圖做同樣的事情了2個項目的最小合併。但似乎可能只有一個應用程序錄制音頻。你有成功嗎?現在,我正在嘗試錄製音頻並進行一些攻擊,將其發送到語音識別器,但找到響應RECOGNIZE_SPEECH的活動或服務對我來說很複雜。 –

+1

我沒有測試過這個解決方案,但也許有可能。在http://developer.android.com/reference/android/speech/RecognitionService.Callback.html中有方法'void bufferReceived(byte [] buffer)'。可能的解決方案是將此Recive緩存保存在AudioRecord Android類中。它具有類似'read(byte [] audioData,int offsetInBytes,int sizeInBytes)'的方法。所以也許有可能以這種方式連接這兩個實用程序?記錄後配置AudioRecord並將結果轉換爲mp3或wav格式可能會發生問題。 – woyaru

+0

有人有幸運嗎?這對創建錄音記錄非常有用。創建語音文本文件,但然後能夠播放語音記錄來驗證它。 –

回答

0

我沒有測試過這種解決方案還沒有,但也許有可能。在http://developer.android.com/reference/android/speech/RecognitionService.Callback.html有方法void bufferReceived(byte[] buffer)。可能的解決方案是將這個已收到的緩衝區保存在Android類中的AudioRecord中。它有像read(byte[] audioData, int offsetInBytes, int sizeInBytes)這樣的方法。所以也許有可能以這種方式連接這兩個實用程序?錄製後配置AudioRecord並將結果轉換爲mp3或wav格式可能會發生問題。

+3

不幸的是,這個方法並沒有被每個設備調用,所以不能保證你獲得任何音頻數據。這是一個令人傷心和令人沮喪的結果,因爲我們試圖在我們的口述記錄應用程序Dictator中利用此功能。此外,這些數據的格式和採樣率沒有正式定義,但通常看起來像(8KHz,但是與實現有關)16位單聲道。 –

3

延遲答案,但對於第一個異常,您必須在此之後銷燬您的SpeechRecognizer,例如(在onStop()或onDestroy()中或直接在您不需要SpeechRecognizer之後) :

if (YourSpeechRecognizer != null) 
    { 
     YourSpeechRecognizer.stopListening(); 
     YourSpeechRecognizer.cancel(); 
     YourSpeechRecognizer.destroy(); 
    } 
6

我得到了一個解決方案,運行良好,有語音識別和錄音。下面是我創建的一個簡單的Android項目link,以顯示解決方案的工作。另外,我在項目中放置了一些打印屏幕來說明應用程序。

我會盡量簡單地解釋我使用的方法。我在該項目中結合了兩個功能:Google Speech API和Flac錄製。

Google Speech API通過HTTP連接調用。 Mike Pultz給出了關於API的更多細節:

(...)新的[Google] API是一個全雙工流媒體API。這意味着它實際上使用兩個HTTP連接 - 以「實時」分塊流的形式上傳內容,以及訪問結果的第二個GET請求,這對於更長的音頻樣本或流式音頻更爲合理。「

然而,這個API需要接收FLAC聲音文件才能正常工作這使得我們去第二部分:拉克記錄

我實現拉克記錄在該項目中,通過提取和適應某些片斷來自開源應用程序AudioBoo的代碼和庫AudioBoo使用本機代碼來記錄和播放flac格式

因此,可以記錄flac聲音,將其發送到Google Speech API,獲取文本並播放剛剛錄製的聲音

該項目我創建了基本原則,使其工作,並可以針對特定情況進行改進。爲了使它在不同的場景下工作,有必要獲得Google Speech API密鑰,該密鑰由Google Chromium-dev組的一部分獲得。我在該項目中留下了一把鑰匙,以顯示它正在工作,但我最終會將其刪除。如果有人需要更多關於它的信息,讓我知道原因,我不能在這篇文章中添加2個以上的鏈接。

+0

我將盡快測試您的解決方案。很長一段時間我沒有適當的設備。最後我有設備來測試它。 – woyaru

+0

@isantsan你可以告訴我如何將音頻文件保存到存儲卡中,然後將其轉換爲文本API的語音?我想要做相同的功能。你可以告訴我這個示例代碼,所以我可以開始。 – Google

+0

我們將音頻錄製爲.flac文件(使用由AudioBoo開發的一些庫),然後通過HTTP連接將.flac文件發送給Google。在我的GitHub項目答案中有一個鏈接,它有一個簡單的實現示例。 – lsantsan

1

我已經在CLOUD SPEECH API的幫助下成功完成了這個任務。 你可以在google speech找到它的演示。

API可識別80多種語言和變體,以支持您的全球用戶羣。您可以將用戶的文本抄錄到應用程序的麥克風,通過語音啓用命令和控制,或轉錄音頻文件以及其他許多用例。識別在請求中上傳的音頻 ,並通過Google使用的相同技術爲您的音頻存儲集成 Google雲端存儲。

它使用音頻緩衝區在Google Speech API的幫助下轉錄數據。我已經使用這個緩衝區來存儲音頻錄音AudioRecorder的幫助。

因此,通過本演示,我們可以將用戶的語音與錄音並行錄製。

在此,它啓動和停止基於語音的語音識別。它還在VoiceRecorder.java中提供SPEECH_TIMEOUT_MILLIS的功能,它與RecognizerIntentEXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS相同,但是由用戶控制。

因此,總而言之,您可以指定靜默超時,並根據該值在用戶輸出後停止,並在用戶開始講話後立即重新開始。

0

最近在'google-speech'和'android-opus'(opuslib)上的項目允許簡單的併發識別以及音頻記錄到android ext中的opus文件。存儲。

查看語音項目中的VoiceRecorder,在讀取麥克風緩衝區後只有幾行額外的代碼,緩衝區也可以由fileSink(PCM16到Opus-codec)消耗,除了當前的語音 - 觀察者。

看到上面Google-speech-opus-recorder