捕捉发送到Google语音识别服务器的音频

5
为了让Google服务器识别语音,我使用SpeechRecognizer类与RecognitionListener相结合,如Stephan答案中建议的那样,针对这个问题。此外,我尝试使用RecognitionListener的onBufferReceived()回调来捕获正在识别的音频信号。
byte[] sig = new byte[500000] ;
int sigPos = 0 ;
...
public void onBufferReceived(byte[] buffer) {
  System.arraycopy(buffer, 0, sig, sigPos, buffer.length) ;
  sigPos += buffer.length ;
}
...

这似乎运行良好,除非SpeechRecognizer无法连接到Google服务器,当一块音频未复制到上述的sig数组时,会抛出HTTP连接超时异常。SpeechRecognizer最终连接到Google服务器,并且识别结果表明接收到了完整的音频信号;只是sig数组缺少一些音频块。是否有人遇到同样的问题?有解决方案的提示吗?谢谢!

你是如何处理信号(sig)以恢复原始音频信号并识别缺失的块? - CompEng88
3个回答

1

我倾向于认为这可能是识别服务行为上的不一致,甚至是您使用的Android版本中的一个错误。然而,文档说明并不保证该方法被调用,因此它符合规范。到目前为止,我注意到以下情况(在Android 2.3.4上):在录制时我可以得到字节,但如果出现例如SocketTimeout,它会在一段时间后尝试将数据重新发送到服务器,但不会再次为相同的数据调用onBufferReceived。测试使用的代码与您在帖子中链接的代码相同。

您认为为什么会有一些音频块丢失?如果只有少数块丢失,那么即使这些块丢失了,识别也可能已经完成。


1

1
最好的方式是反过来实现。使用AudioRecord捕获音频数据(我建议使用VOICE_COMMUNICATION而不是MIC作为输入,以便获得非常干净的音频),然后将其传递给SpeechRecognizer。 :)

你有这方面的示例吗? - Wesley
@tommed 你有没有想过如何将音频数据传递给SpeechRecognizer? - Uttam Panchasara

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接