1

私はキーワードスポッティングのためにAndroidでpocketsphynxライブラリを使用しています。しかし、私がアプリケーションの別のコンポーネントでそれを利用するためにマイクをリリースしようとしているとき、私はそうすることができません。私は、logcatに次のエラーを取得する:Androidのpocketsphynxからマイクを解放する方法

12-11 10:19:55.827 255-30344/? I/AudioFlinger_Threads: AudioFlinger's thread 0xa6cc0000 ready to run 
12-11 10:19:55.849 255-31292/? W/APM::AudioPolicyManager: startInput(17675) preempting low-priority input 17671 
12-11 10:19:55.859 255-29587/? W/AudioALSAStreamManager: -routingInputDevice(), input_device == AUDIO_DEVICE_NONE(0x0), return 
12-11 10:19:55.924 27054-1900/? W/AudioRecord: dead IAudioRecord, creating a new one from obtainBuffer() 
12-11 10:19:55.925 255-30344/? W/AudioALSAStreamManager: -routingInputDevice(), input_device == current_input_device(0x80000004), return 
12-11 10:19:55.927 255-30346/? I/AudioFlinger_Threads: AudioFlinger's thread 0xaa880000 ready to run 
12-11 10:19:55.930 255-31292/? W/APM::AudioPolicyManager: stopInput() unknown input 17671 
12-11 10:19:55.930 255-31292/? W/APM::AudioPolicyManager: releaseInput() releasing unknown input 17671 
12-11 10:19:55.931 255-953/? W/APM::AudioPolicyManager: startInput(AUDIO_SOURCE_HOTWORD) invalid, already started high-priority input 17675 
12-11 10:19:55.931 27054-1900/? W/AudioRecord: restoreRecord_l() failed status -38 
12-11 10:19:55.934 27054-1900/? E/AudioRecord-JNI: Error -38 during AudioRecord native read 
12-11 10:19:55.951 27054-1900/? E/AudioProvider: audioRecord read failed 
               com.google.android.apps.gsa.shared.exception.GsaIOException: Error code: 393221 | not open 
                at com.google.android.libraries.assistant.hotword.a.a(SourceFile:67) 
                at com.google.android.libraries.assistant.hotword.b.run(SourceFile:30) 
                at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423) 
                at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423) 
                at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269) 
                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
                at java.lang.Thread.run(Thread.java:818) 

これは私がWebViewからgetUserMediaを使用しようとしていたときに起こります。その前に私は

recognizer.cancel(); 

私のアクティビティから電話していますが、それは役に立たないようです。

また、.stop(),.removeListener(...) APIを使用しても問題は解決しません。 pocketsphinxが作成しているマイクを保持する方法がある場合は、他のアプリのコンポーネントでマイクをもう一度使用できるようにする方法を提案してください。

何か助けていただければ幸いです。

更新1:さらにログを追加し、AudioPolicyManagerのAndroidコードを見ました。 2つのプロセス(31292953)がstartInputコールで競合しようとしていて、もう1つ(31292)が別のプロセス(953)をシャットダウンしようとしていたようです。明らかに、私はログを誤解している可能性があります。

UPDATE 2: Iはpocketsphynx SpeechRecognizer.shutdown方法に見て、これは実際AudioRecordオブジェクトを解放方法であることを見出しました。試行錯誤で、私はshutdownに電話し、アプリケーションをクラッシュさせないようにしました(すべてのリスナーが削除された後、onResultで発生する必要があります)。その後、別のコンポーネントが動作し始めました。 shutdownの後にキーワードスポッティングを再開できるかどうかを確認する機会はまだありませんでした。後で再初期化が必要な場合(時間がかかる)、それは許容される回避策にはなりません。

更新3:shutdownは、マイクのホールドを解除する必要はないことを確認しました。私はちょうどstop APIを呼び出した後、私の他のコンポーネントを作ることができました。鍵は、ポケットフィックスの停止に少し時間がかかること、そしてもう1つのコンポーネントがそれを待つべきことだと思われます。私が使ったイベントは、私のために働いたのはonResultでした。この時点で、もう1つのコンポーネントはすでに新しいAudioRecordを保持することができます。私はまだポケットフィックスを再開しようとしていない。

答えて

0

申し訳ありませんが、私はそれを動作させました。実際にはSpeechRecognizer.shutdownを呼び出す必要はありません。 SpeechRecognizer.stop APIを使用して、最後の結果がコールバック(RecognitionListener実装)に来るのを待つようにしました。その後、私はgetUserMediaブラウザAPIを呼び出すことができ、それは正常にマイクを取得します。私RecognitionListener実装で

onResultコード:

recognizer.removeListener(listener); 

私もその再起動の認識を確認することができたが、私は次のことを行うために必要な、簡単です:

recognizer.addListener(listener); 
recognizer.addKeyphraseSearch(KWS_SEARCH, KEYPHRASE); 
recognizer.startListening(KWS_SEARCH); 

注:認識プログラムがどのようにインスタンス化されたかと同様に、別のスレッドで認識プログラムを停止していますが、必要かどうかを確認していません。

関連する問題