首页 文章

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

提问于
浏览
4

为了识别Google服务器的语音,我将SpeechRecognizer类与RecognitionListener结合使用,如Stephananswerthis question所示 . 另外,我尝试通过使用来自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 数组缺少一些音频块 .

有没有人遇到同样的问题?任何提示解决方案?谢谢!

3 回答

  • 1

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

    为什么您认为在方法中收到的音频中缺少一些块?如果只缺少几个块,甚至可能是这样的,虽然那些块丢失了,但识别仍然有效 .

  • 0

    在现代版本中,onBufferReceieved不起作用,您可以检查record/save audio from voice recognition intent .

  • 1

    实现这一目标的最佳方式是另一种方式 . 使用 AudioRecord 捕获音频数据,(我建议使用 VOICE_COMMUNICATION 而不是 MIC 作为输入,以便获得非常干净的音频),然后将其传递给 SpeechRecognizer . :)

相关问题