首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Android环境下如何从pocketsphynx中释放麦克风

在Android环境下如何从pocketsphynx中释放麦克风
EN

Stack Overflow用户
提问于 2017-12-09 01:00:11
回答 1查看 537关注 0票数 1

我正在使用Android上的pocketsphynx库来查找关键字,它的用途非常好。然而,当我试图释放麦克风,以利用它在另一个组件的应用,我无法这样做。在logcat中我得到了以下错误:

代码语言:javascript
复制
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)

当我试图使用来自WebViewWebView时,就会发生这种情况。在此之前,我打电话给

代码语言:javascript
复制
recognizer.cancel();

从我的活动中,但这似乎没有帮助。

我也尝试使用.stop().removeListener(...) API,但问题仍然存在。请建议,如果有办法释放一个麦克风,口袋狮身人面像正在制造,以便其他组件的应用可以再次使用麦克风。

任何帮助都是非常感谢的。

更新1:添加了更多日志,并查看了AudioPolicyManager的安卓代码。似乎有两个进程(31292953)试图通过执行startInput调用来竞争,一个进程(31292)关闭了另一个进程(953)。很明显,我可能曲解了日志。

更新2: --我查看了pocketsphynx SpeechRecognizer.shutdown方法,发现这是实际释放AudioRecord对象的方法。通过尝试-结束-错误,我设法找到了如何调用shutdown,而不是崩溃的应用程序(它必须发生在onResult,在所有的侦听器被删除后)。在那之后,我的另一个组件开始工作。我还没有机会确认是否可以在shutdown之后重新启动关键字定位。如果在此之后需要重新初始化(这需要很长时间),那么这将不是一个可以接受的解决方法。

更新3:我确认shutdown不是释放麦克风所必需的。在调用stop API之后,我成功地制作了另一个组件。关键似乎是阻止袖珍狮身人面像需要一些时间,而另一个组件应该等待它。我使用的事件,对我有效的是onResult。此时,另一个组件已经能够获得一个新的AudioRecord。从那以后我还没试过重新开始。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-13 17:49:19

好吧,我开始工作了。调用SpeechRecognizer.shutdown确实是不必要的。我能够使用SpeechRecognizer.stop API,同时确保等待onResult实现的onResult回调中的最后结果。之后,我可以调用getUserMedia浏览器API,它成功地获得了一个麦克风。

我的onResult实现中的RecognitionListener代码:

代码语言:javascript
复制
recognizer.removeListener(listener);

我还确认了重新开始识别很容易,我只需要做以下几点:

代码语言:javascript
复制
recognizer.addListener(listener);
recognizer.addKeyphraseSearch(KWS_SEARCH, KEYPHRASE);
recognizer.startListening(KWS_SEARCH);

注意:我在一个单独的线程中停止识别器,类似于识别器是如何被实例化的,但是我还没有确认它是否必要。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47724253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档