[呼叫何时]用户已开始发言。
但它没有说明这是麦克风识别(即本地)事件还是服务器识别事件(即需要谷歌语音服务器来确认语音开始)。
我试图在the source code中找到线索,但是在某些时候我在服务,回调,接口之间迷失了......这不是一个简单的谁叫 - 谁 - 序列。
您是否碰巧知道onBeginningOfSpeech()是在本地执行(例如本地电路是否检测到RMS更改),还是必须前往Google服务器并获取“是/否”?
我知道语音识别本身可以传送到Google的服务器,但它是否也为onBeginningOfSpeech()完成了?
答案 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。