简介
Android为我提供了两种使用语音识别的方法 .
first 方式是 Intent
,就像这个问题:Intent example . 一个新的 Activity
被推到堆栈的顶部,它听取用户的声音,听到一些语音,尝试转录它(通常是通过 Cloud ),然后通过 onActivityResult
调用将结果返回给我的应用程序 .
second 是获取 SpeechRecognizer
,就像这里的代码一样:SpeechRecognizer example . 在这里,看起来语音被记录并转录到其他一些线程上,然后回调给我带来了结果 . 这是在不离开我的 Activity
的情况下完成的 .
我想了解 pros and cons of these two ways of doing speech recognition .
到目前为止我得到了什么
使用 Intent
:
-
很容易编码
-
避免重新发明轮子
-
在整个设备上提供一致的语音识别用户体验
但
使用自己的窗口创建新活动时,
- 可能会很慢
使用 SpeechRecognizer
:
-
让我在我的应用程序中保留对UI的控制权
-
给了我更多回应的可能性(documentation)
但
-
仅限于从主线程调用
-
更多控制需要更多错误检查 .
3 回答
除此之外,我至少还要补充一点:
SpeechRecognizer
对于免提用户界面更好,因为您的应用程序实际上可以响应"No matches"等错误情况并可能重新启动 . 当您使用Intent
时,应用程序会发出蜂鸣声并显示一个用户必须按才能继续的对话框 .我的总结如下:
SpeechRecognizer
显示不同的UI或根本没有UI . 你真的希望你的应用程序的用户界面发出哔哔声吗?您是否真的希望UI在出现错误时显示对话框并等待用户点击?
应用程序可以在语音识别发生时执行其他操作
可以在后台或服务中运行时识别语音
可以更好地处理错误
可以访问低级语音内容,如原始音频或RMS . 分析音频或使用响度发出某种闪烁的灯光来指示应用正在收听
意图
为用户提供一致且易于使用的UI
易于编程
UI的主要区别在于 .
SpeechRecognizer
没有,所以你负责创建一个 .我用来写一个原型,我有接收器用于收听耳机按钮,然后激活语音识别以听取一些命令 . 屏幕未激活,因此我不得不使用
SpeechRecognizer
(我的UI是一些预先录制的声音和文本到语音) .第二个区别是
SpeechRecognizer
具有持续聆听的能力 . 意图版本将在一段时间后始终结束 . 例如SpeechRecognizer
由语音识别"keyboard"使用,因此您可以指定SMS .在这种情况下,您将仅收到部分结果(在正常模式下
SpeechRecognizer
仅给出最终结果) .其他答案未提及的一件事是:如果设备上安装了多个语音识别器,则用户之间的切换会有所不同,具体取决于是使用了"Intent"还是
SpeechRecognizer
.如果是"Intent",则会弹出标准的“活动选择”对话框 . 用户可以选择要使用的识别器,并可选择将其全局设置为默认识别器,以避免将来出现对话 .
如果是
SpeechRecognizer
,用户可以在全局设置中设置和配置默认识别器(ICS上的Language and input -> Voice recognizer
) .因此,根据使用的界面,有关设置默认识别器和在识别器之间切换的文档应该是不同的 . (在大多数情况下,虽然只有一个识别器,谷歌语音搜索,所以这在实践中可能不是一个大问题 . )