1

나는 키워드 스포팅을 위해 안드로이드에서 pocketsphynx 라이브러리를 사용하고 있습니다. 그러나 앱의 다른 구성 요소에서이를 사용하기 위해 마이크를 출시하려고 할 때 그렇게 할 수 없습니다. 나는 로그 캣에 다음과 같은 오류가 발생합니다 :안드로이드에서 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를 사용하려고 시도하고있을 때 발생합니다. 그렇게하기 전에 나는 전화를 걸었습니다.

내 활동에는 있지만 도움이되지 않습니다.

또한 .stop(), .removeListener(...) 개의 API를 사용해 보았지만 문제는 여전히 남아 있습니다. pocketsphinx가 만드는 마이크를 보류 해제하는 방법이 있다면 앱의 다른 구성 요소에서 마이크를 다시 사용할 수 있도록 제안하십시오.

도움을 주시면 감사하겠습니다.

업데이트 1 : 더 많은 로그를 추가하고 AudioPolicyManager의 Android 코드를 확인했습니다. 두 프로세스 (31292953)가 startInput 호출을 수행하여 경쟁하려고 시도하고 하나 (31292)가 다른 프로세스 (953)를 종료하려고 시도한 것처럼 보입니다. 분명히, 나는 로그를 오해하고 있을지도 모른다.

업데이트 2 : 나는 pocketsphynx SpeechRecognizer.shutdown 방법에 모습이 실제로 AudioRecord 객체를 출시 방법 것으로 나타났습니다. trial-end-error에 의해 나는 shutdown을 호출하는 방법을 알아 냈고 (모든 리스너가 제거 된 후에 onResult에서 일어난다.) 앱을 중단시키지 않았다. 그 후 다른 구성 요소가 작동하기 시작했습니다. shutdown 후에 키워드 스포팅을 다시 시작할 수 있는지 여부를 확인할 기회가 아직 없습니다. 그 후에 (많은 시간이 소요되는) 재 초기화가 필요한 경우, 이는 적절한 해결책이 될 수 없습니다.

업데이트 3 : 마이크에서 보류를 해제 할 필요가 없음을 확인했습니다. stop API를 호출 한 후 다른 구성 요소를 만들었습니다. 열쇠는 pocketsphinx를 멈추는 데 약간의 시간이 걸리는 것으로 보입니다. 다른 구성 요소는 기다려야합니다. 내가 사용했던 이벤트는 나를 위해 일했다 onResult이었다. 이 시점에서 다른 구성 요소는 이미 새로운 AudioRecord을 보유 할 수 있습니다. 나는 아직도 그 후에 pocketsphinx를 다시 시작하지 않았다.

답변

0

좋아요, 작동하도록했습니다. SpeechRecognizer.shutdown 전화는 실제로 불필요합니다. 내 RecognitionListener 구현의 onResult 콜백에서 마지막 결과를 기다리는 동안 SpeechRecognizer.stop API를 사용할 수있었습니다. 그 후에 나는 getUserMedia 브라우저 API를 호출 할 수 있으며 성공적으로 마이크를 잡을 수 있습니다.내 RecognitionListener 구현

onResult 코드 :

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

참고 :

recognizer.removeListener(listener); 

나는 또한 다시 시작하는 인식이 쉽게 확인 할 수 있었다, 난 그냥 다음과 같은 작업을 수행 할 필요가 : 인식기가 인스턴스화 된 방법과 마찬가지로 별도의 스레드에서 인식기를 중지하지만 필요 여부를 확인하지 않았습니다.