为了通过谷歌服务器识别语音,我按照Stephan的answer to this question中的建议,将SpeechRecognizer类与RecognitionListener结合使用。此外,我尝试使用onBufferReceived()从RecognitionListener回调来捕获正在识别的音频信号,如下所示:
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最终连接到谷歌服务器,识别结果表明收到了一个完整的音频信号;只有sig阵列缺少一些音频块。
有没有人遇到过同样的问题?有任何解决方案的提示吗?谢谢!
发布于 2011-05-10 14:56:54
我倾向于说,这可能是识别服务的行为不一致,甚至可能是你使用的Android版本中的一个bug。但是,文档指出,不能保证此方法会被调用,因此它将适合规范。到目前为止,我注意到的是(在安卓2.3.4上):我在记录时获取字节数,但如果有一个SocketTimeout,它会在一段时间后尝试将数据重新发送到服务器,但不会再次调用onBufferReceived来获取相同的数据。用于测试的代码与您在帖子中链接的代码相同。
为什么你认为你在方法中接收到的音频中缺少了一些块?如果只是丢失了几个块,情况甚至可能是这样的,尽管这些块丢失了,但识别仍然有效。
发布于 2016-02-03 23:26:39
在最新的版本中,onBufferReceieved不能工作,你可以检查record/save audio from voice recognition intent。
发布于 2018-05-29 19:15:31
要做到这一点,最好的方法是绕过另一条路。使用AudioRecord捕获音频数据(我建议使用VOICE_COMMUNICATION而不是MIC作为输入,这样可以获得真正干净的音频),然后将其传递给SpeechRecognizer。:)
https://stackoverflow.com/questions/5925657
复制相似问题