Android中语音识别使用的比较:按意图还是线程?
Posted
技术标签:
【中文标题】Android中语音识别使用的比较:按意图还是线程?【英文标题】:Comparison of Speech Recognition use in Android: by Intent or on-thread? 【发布时间】:2012-08-08 11:11:38 【问题描述】:简介
android 为我提供了两种使用语音识别的方法。
第一种方式是Intent
,如这个问题:Intent example。一个新的Activity
被推送到堆栈的顶部,它倾听用户的声音,听到一些语音,尝试转录它(通常通过云),然后通过onActivityResult
调用将结果返回到我的应用程序。
第二是通过获取SpeechRecognizer
,就像这里的代码:SpeechRecognizer example。在这里,看起来语音是在其他线程上录制和转录的,然后回调给我带来结果。这是在不离开我的Activity
的情况下完成的。
我想了解这两种语音识别方式的优缺点。
到目前为止我得到了什么
使用Intent
:
但是
使用自己的窗口创建新活动可能会很慢使用SpeechRecognizer
:
但是
仅限于从主线程调用 更多的控制需要更多的错误检查。【问题讨论】:
这很奇怪。为什么人们对这个问题投了反对票?为什么不给我一些反馈呢? 而且他们似乎也对这两个答案都投了反对票。爱在哪里? 我认为这两种方法都有启动缓慢的问题。应用程序希望启动语音识别与启动语音识别之间存在延迟。至少使用 Intent 方法,用户可以通过各种对话了解,使用语音识别器,您必须以其他方式告诉用户。 有没有启动不慢的替代方案? 不,除了慢启动,别无选择。更糟糕的是,开始时间是可变的。有时是快有时慢。你必须对 UI 做一些事情来提供帮助,或者谷歌可能会通过添加一些有用的哔哔声来解决它。 【参考方案1】:除此之外,我至少要补充一点:
SpeechRecognizer
更适合免提用户界面,因为您的应用实际上可以响应“无匹配”之类的错误条件,并且可能会自行重启。当您使用Intent
时,应用会发出哔哔声并显示一个对话框,用户必须按下才能继续。
我的总结如下:
语音识别器
显示不同的 UI 或根本不显示 UI。您真的希望您的应用程序的用户界面发出哔哔声吗?您真的希望您的 UI 在出现错误时显示对话框并等待用户点击吗?
应用可以在语音识别发生时做其他事情
可以在后台运行或从 服务
可以更好地处理错误
可以访问低级语音内容,例如原始音频或 RMS。分析该音频或使用响度发出某种闪光以表明应用正在收听
意图
用户界面一致且易于使用 易于编程【讨论】:
一个比另一个更准确吗?还是 Intent 版本只是 SpeechRecognizer 的 UI? 准确率是一样的【参考方案2】:主要区别在于用户界面。 SpeechRecognizer
没有,所以你负责创建一个。
我曾经写过一个原型,我有一个用于听耳机按钮的接收器,然后激活语音识别来听一些命令。屏幕没有激活,所以我不得不使用SpeechRecognizer
(我的用户界面是一些预先录制的声音和文本转语音)。
第二个区别是SpeechRecognizer
有持续倾听的能力。意图版本总是会在一段时间后结束强制执行。例如,SpeechRecognizer
被语音识别“键盘”使用,因此您可以口述 SMS。
在这种情况下,您将仅收到部分结果(在正常模式下SpeechRecognizer
仅提供最终结果)。
【讨论】:
不正确。 SpeechRecognizer 和 Intent 都会在一定的可控周期后结束。使用 SpeechRecognizer 至少你可以重新启动它。 你们都错了。 ;) 这一切都取决于提供语音识别服务的应用程序。它可以随心所欲地运行。如果是SpeechRecognizer
,调用者可以调用cancel
,但不能控制录制时间。在 Intent 的情况下,控制权被移交给一个新的 Activity,只有当用户按下 BACK 时才能完成。【参考方案3】:
其他答案没有提到的一件事:如果设备上安装了多个语音识别器,那么用户在它们之间的切换会有所不同,具体取决于使用的是“Intent”还是SpeechRecognizer
。
SpeechRecognizer
,用户可以在全局设置中设置和配置默认识别器(ICS 上的Language and input -> Voice recognizer
)。
因此,根据使用的接口,有关设置默认识别器和在识别器之间切换的文档应该有所不同。 (在大多数情况下,虽然只有一个识别器,谷歌语音搜索,所以这在实践中可能不是一个大问题。)
【讨论】:
以上是关于Android中语音识别使用的比较:按意图还是线程?的主要内容,如果未能解决你的问题,请参考以下文章