私はキーワードスポッティングのために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つのプロセス(31292
と953
)がstartInput
コールで競合しようとしていて、もう1つ(31292
)が別のプロセス(953
)をシャットダウンしようとしていたようです。明らかに、私はログを誤解している可能性があります。
UPDATE 2: Iはpocketsphynx SpeechRecognizer.shutdown
方法に見て、これは実際AudioRecord
オブジェクトを解放方法であることを見出しました。試行錯誤で、私はshutdown
に電話し、アプリケーションをクラッシュさせないようにしました(すべてのリスナーが削除された後、onResultで発生する必要があります)。その後、別のコンポーネントが動作し始めました。 shutdown
の後にキーワードスポッティングを再開できるかどうかを確認する機会はまだありませんでした。後で再初期化が必要な場合(時間がかかる)、それは許容される回避策にはなりません。
更新3:shutdown
は、マイクのホールドを解除する必要はないことを確認しました。私はちょうどstop
APIを呼び出した後、私の他のコンポーネントを作ることができました。鍵は、ポケットフィックスの停止に少し時間がかかること、そしてもう1つのコンポーネントがそれを待つべきことだと思われます。私が使ったイベントは、私のために働いたのはonResult
でした。この時点で、もう1つのコンポーネントはすでに新しいAudioRecord
を保持することができます。私はまだポケットフィックスを再開しようとしていない。