Android でキーワード スポッティング用に pocketphynx ライブラリを使用していますが、その目的を十分に果たしています。ただし、アプリの別のコンポーネントで使用するためにマイクを解放しようとすると、それができません。logcat に次のエラーが表示されます。
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)
getUserMedia
これは、 fromを使用しようとしたときに発生しますWebView
。そうする前に、私は電話しています
recognizer.cancel();
私のアクティビティからですが、それは役に立たないようです。
.stop()
、 APIも使用してみ.removeListener(...)
ましたが、問題はまだ残っています。アプリの他のコンポーネントが再びマイクを使用できるように、ポケットフィンクスが作成しているマイクの保留を解除する方法があるかどうかを提案してください。
どんな助けでも大歓迎です。
更新 1:ログを追加し、AudioPolicyManagerの Android コードを調べました。2 つのプロセス (31292
と) が呼び出しを953
実行して競合しようとしていて、1 つのプロセス ( ) が別のプロセス ( ) をシャットダウンしたようです。明らかに、ログを誤解している可能性があります。startInput
31292
953
更新 2: pocketphynxSpeechRecognizer.shutdown
メソッドを調べたところ、これが実際にオブジェクトを解放するメソッドであることがわかりました。AudioRecord
試行錯誤によりshutdown
、アプリをクラッシュさせずに呼び出す方法を理解することができました(すべてのリスナーが削除された後、onResultで発生する必要があります)。その後、私の別のコンポーネントが動作し始めました。の後にキーワード スポッティングを再開できるかどうかを確認する機会はまだありませんでしたshutdown
。その後、再初期化が必要な場合 (これには多くの時間がかかります)、これは受け入れられる回避策ではありません。
更新 3:shutdown
マイクのホールドを解除する必要がないことを確認しました。stop
APIを呼び出すだけで、なんとか他のコンポーネントを作成できました。重要なのは、ポケットフィンクスの停止には少し時間がかかることであり、他のコンポーネントはそれを待つ必要があります。私が使用したイベントは、私のために働いたonResult
. その時点で、別のコンポーネントがすでに新しい を取得できAudioRecord
ます。その後、まだポケットフィンクスを再起動していません。