【发布时间】:2013-02-03 03:22:39
【问题描述】:
我已经设法让连续语音识别工作(使用 SpeechRecognizer 类)作为所有 Android 版本(最高 4.1)的服务。我的问题涉及让它在 4.1 和 4.2 版本上运行,因为众所周知,API 没有按照在语音识别开始后几秒钟内记录的那样执行,如果没有检测到语音输入,那么它就像如果语音识别器无声无息地死去。 (http://code.google.com/p/android/issues/detail?id=37883)
我发现了一个建议解决此问题的问题 (Voice Recognition stops listening after a few seconds),但我不确定如何实现此解决方案所需的处理程序。我知道这种解决方法每隔几秒钟就会发出“哔”声,但获得持续的语音识别对我来说更重要。
如果有人有任何其他替代解决方法,那么我也想听听。
【问题讨论】:
-
在我的安卓 4.1.1 的 Nexus S 上,语音识别器不会死,但与其他 4.0 版手机的行为不同。几秒钟后(比如 5 秒)4.0,我得到错误没有语音输入。使用 4.1.1 至少比 4.0 (15s) 长 3 倍,我得到了其他与网络相关的错误。因此,如果用户在说 5 秒后说话,那么语音识别器将不会拾取它,因为它仍然处理“无输入错误”。总之,在 4.1.1 版本中,“无语音输入”被视为“其他网络相关错误”,服务器返回此错误需要更长的时间。
-
直到调用 onError() 方法之前,4.0 都没有问题,语音识别器仍然处于活动状态,我可以简单地“重新启动”语音识别 - 允许连续识别.我知道在 4.1.1 上会发生什么,但是等待调用 onError() 并不能帮助我提供连续识别,因为在语音识别器变为非活动状态和等待调用 onError() 之间存在很长的延迟. (在某些情况下几乎是一分钟!)
-
作为一种解决方法,您可以在 onReadyForSpeech 上实现一个计时器,如果 onEndofSpeech 没有被调用 5 秒后,则再次调用 cancel 和 startListening。
-
这个我试过了,检测超时没问题。再次启动侦听器时出现问题。如果您查看 SpeechRecognizer 类 (github.com/android/platform_frameworks_base/blob/master/core/…) 的 Android 源代码,您将看到调用了 checkIsCalledFromMainThread() 方法,并且我不确定在使用计时解决方法时如何从主线程内部调用 startListening()。
-
我通过向我的服务消息处理程序发送一个开始监听消息来做到这一点。
标签: android speech-recognition android-4.2-jelly-bean