【问题标题】:Capturing audio sent to Google's speech recognition server捕获发送到 Google 语音识别服务器的音频
【发布时间】:2011-08-21 00:07:39
【问题描述】:

为了通过 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 数组缺少一些音频块。

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

【问题讨论】:

  • 您是如何处理 sig 以获取原始音频信号以识别丢失的块的?

标签: android speech-recognition voice-recognition


【解决方案1】:

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

为什么您认为在该方法中收到的音频中缺少某些块?如果只是丢失了几个块,甚至可能是这种情况,尽管这些块丢失了,但识别仍然有效。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      实现这一目标的最佳方式是反过来。使用AudioRecord 捕获您的音频数据,(我建议使用VOICE_COMMUNICATION 而不是MIC 作为输入,这样您可以获得真正干净的音频),然后将其传递给SpeechRecognizer。 :)

      【讨论】:

      • 你有这方面的例子吗?
      • @tommed 知道如何将音频数据传递给 SpeechRecognizer 吗?
      猜你喜欢
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 2014-10-04
      • 1970-01-01
      • 2019-10-04
      • 2016-12-11
      • 2017-10-20
      • 1970-01-01
      相关资源
      最近更新 更多