onBeginningOfSpeech()是在本地还是由服务器触发的?

时间:2012-07-17 04:05:23

标签: android speech-recognition

onBeginningOfSpeech()的文档说:

  

[呼叫何时]用户已开始发言。

但它没有说明这是麦克风识别(即本地)事件还是服务器识别事件(即需要谷歌语音服务器来确认语音开始)。

我试图在the source code中找到线索,但是在某些时候我在服务,回调,接口之间迷失了......这不是一个简单的谁叫 - 谁 - 序列。

您是否碰巧知道onBeginningOfSpeech()是在本地执行(例如本地电路是否检测到RMS更改),还是必须前往Google服务器并获取“是/否”?

我知道语音识别本身可以传送到Google的服务器,但它是否也为onBeginningOfSpeech()完成了?

2 个答案:

答案 0 :(得分:3)

有趣的问题。出于好奇,我进行了一点测试。在示例应用程序中,我在onReadyForSpeech()中禁用了WiFi:

WifiManager wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
wifiManager.setWifiEnabled(false);

观察发生了什么。果然,只要麦克风听到最轻微的噪音,就会调出onBeginningOfSpeech()。它甚至不必是演讲。

所以@KevinJunghans的结论是正确的:onBeginningOfSpeech()未由Google服务器确定或发起。

答案 1 :(得分:2)

检测语音开始和语音结束必须在本地执行,因为系统基本上必须“监听”以确定这些事件何时发生。使用远程服务无法有效执行此操作。在语音识别中寻找语音的开始和结束被称为端点,并且使用复杂的信号处理来确定这一点。对于Google语音,客户端设备确定语音何时开始并开始记录,然后确定何时发生语音结束以停止记录。在某些系统上,终端指针还负责消除录制两端的过度静音。语音的开始也可以由用户做出的选择触发,例如点击Web浏览器上的麦克风图标。然后将录制的音频发送到Google服务器进行分析,并返回结果。有关Google非官方API及其处理此音频的详细信息,请查看this article