3

onBeginningOfSpeech()的文档说:

[调用时] 用户已开始说话。

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

我试图在源代码中找到线索,但在某些时候我迷失在服务、回调、接口之间……这不是一个简单的谁-呼叫-谁序列。

您是否碰巧知道onBeginningOfSpeech()是在本地执行(例如本地电路检测 RMS 变化)还是必须前往 Google 服务器并获得他们的“是/否”?

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

4

2 回答 2

3

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

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

并观察发生了什么。果然,onBeginningOfSpeech()只要他有一点点噪音,麦克风就会被叫到。它甚至不必是言语。

所以@KevinJunghans 的结论是正确的:onBeginningOfSpeech()不是由谷歌服务器决定或发起的。

于 2012-07-17T15:56:42.043 回答
2

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

于 2012-07-17T13:42:51.930 回答