保存Android Stock语音识别引擎的音频输入

时间:2011-12-20 23:40:50

标签: android audio speech-recognition wav voice-recognition

我试图在文件中保存由android语音识别服务监听的音频数据。

实际上我按照此处的说明实施RecognitionListenerSpeech to Text on Android

将数据保存到缓冲区中,如下所示: Capturing audio sent to Google's speech recognition server

并将缓冲区写入Wav文件,如此处所示。 Android Record raw bytes into WAVE file for Http Streaming

我的问题是如何获取适当的音频设置以保存在wav文件的标题中。 事实上,当我播放wav文件时,只听到奇怪的噪音,这个参数,

short nChannels=2;// audio channels
int sRate=44100;    // Sample rate
short bSamples = 16;// byteSample

或者没有这个:

short nChannels=1;// audio channels
int sRate=8000;    // Sample rate
short bSamples = 16;// byteSample

令人困惑的是,从logcat查看语音识别任务的参数我首先发现将PLAYBACK采样率设置为44100 HZ

    12-20 14:41:34.007: DEBUG/AudioHardwareALSA(2364): Set PLAYBACK PCM format to S16_LE (Signed 16 bit Little Endian)
    12-20 14:41:34.007: DEBUG/AudioHardwareALSA(2364): Using 2 channels for PLAYBACK.
    12-20 14:41:34.007: DEBUG/AudioHardwareALSA(2364): Set PLAYBACK sample rate to 44100 HZ
    12-20 14:41:34.007: DEBUG/AudioHardwareALSA(2364): Buffer size: 2048
    12-20 14:41:34.007: DEBUG/AudioHardwareALSA(2364): Latency: 46439

然后 aInfo.SampleRate = 8000 ,当它播放要发送到谷歌服务器的文件时:

    12-20 14:41:36.152: DEBUG/(2364): PV_Wav_Parser::InitWavParser
12-20 14:41:36.152: DEBUG/(2364): File open Succes
12-20 14:41:36.152: DEBUG/(2364): File SEEK End Succes
...
12-20 14:41:36.152: DEBUG/(2364): PV_Wav_Parser::ReadData
12-20 14:41:36.152: DEBUG/(2364): Data Read buff = RIFF?
12-20 14:41:36.152: DEBUG/(2364): Data Read = RIFF?
12-20 14:41:36.152: DEBUG/(2364): PV_Wav_Parser::ReadData
12-20 14:41:36.152: DEBUG/(2364): Data Read buff = fmt 
...
12-20 14:41:36.152: DEBUG/(2364): PVWAVPARSER_OK
12-20 14:41:36.156: DEBUG/(2364): aInfo.AudioFormat = 1
12-20 14:41:36.156: DEBUG/(2364): aInfo.NumChannels = 1
12-20 14:41:36.156: DEBUG/(2364): aInfo.SampleRate = 8000
12-20 14:41:36.156: DEBUG/(2364): aInfo.ByteRate = 16000
12-20 14:41:36.156: DEBUG/(2364): aInfo.BlockAlign = 2
12-20 14:41:36.156: DEBUG/(2364): aInfo.BitsPerSample = 16
12-20 14:41:36.156: DEBUG/(2364): aInfo.BytesPerSample = 2
12-20 14:41:36.156: DEBUG/(2364): aInfo.NumSamples = 2258

那么,我怎样才能找到合适的参数来将音频缓冲区保存在一个好的wav音频文件中呢?

3 个答案:

答案 0 :(得分:6)

您还没有包含实际写出PCM数据的代码,所以很难诊断,但如果您听到奇怪的声音,那么当您编写时,您很可能看错了endian数据或错误的通道数。获取采样率错误只会导致音频声音变慢或变快,但如果听起来完全乱码,则可能是指定通道数或字节流的字节顺序错误。

要确定,只需将您的字节直接流式传输到没有任何标头的文件(原始PCM数据)。这样,您可以在编写文件头时排除任何错误。然后使用Audacity导入原始数据,尝试不同的选项(位深度,字节序,通道),直到获得听起来正确的音频文件(只有一个是正确的)。您可以从File-> Import-> Raw Data ...

执行此操作

一旦您以这种方式识别了字节格式,您只需要担心是否正确设置了标题。您可能希望参考此参考http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html获取文件格式。或者在编写音频文件Java - reading, manipulating and writing WAV filesFMJ时查看现有Java解决方案的以下链接。虽然我猜这些可能无法在Android上使用。

如果您需要自己编写WAV / RIFF编写器,请记住Java的数据类型为big-endian,因此您写入文件的任何多字节基元都必须用reverse byte order编写,以匹配RIFF的小数据 - 字节序。

答案 1 :(得分:2)

8000 ,小端, 16位PCM ,单声道通道就行了

答案 2 :(得分:0)

在最新版本中,onBufferReceived不起作用,您可以改用record/save audio from voice recognition intent