安卓系统原生语音识别引擎如何保存音频输入?

39

我正在尝试将Android语音识别服务听到的音频数据保存到文件中。

实际上,我按照这里所述实现了RecognitionListener: 在Android上进行语音转文本

按照这里所示的方法将数据保存到缓冲区: 捕获发送到Google语音识别服务器的音频

并像这里一样将缓冲区写入Wav文件。 Android将原始字节记录到用于HTTP流媒体的WAVE文件中

我的问题是如何获取适当的音频设置以保存在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音频文件?


2
你找到解决方案了吗? - Doug
看起来你已经在这方面做得最好了。mmmx,你能解决这个问题吗? - CompEng88
3个回答

6
您没有包含实际写出PCM数据的代码,因此很难诊断,但如果您听到奇怪的噪音,那么最有可能是在写入数据时使用了错误的字节序(endian),或者使用了错误的声道数。如果采样率不正确,则只会导致音频听起来更慢或更快,但如果听起来完全混乱,则可能是在指定字节流的声道数或字节序时出现错误。
要确定,请直接将字节流传输到文件中而不带任何头信息(原始PCM数据)。这样,您可以排除编写文件头时的任何错误。然后使用Audacity导入原始数据,并尝试不同选项(位深度、字节序、声道),直到获得听起来正确的音频文件(只有一个是正确的)。您可以从“文件”->“导入”->“原始数据…”进行操作。
一旦以这种方式确定了字节格式,您只需要担心是否正确设置了头文件。您可能需要参考此参考资料以了解文件格式。或查看以下链接,了解有关现有Java解决方案编写音频文件的信息:Java - reading, manipulating and writing WAV files,或FMJ。虽然我猜这些可能无法在Android上使用。
如果您必须自己编写WAV / RIFF编写器,请记住Java的数据类型是big-endian,因此您写入文件的任何多字节原语都必须以反向字节顺序编写,以匹配RIFF的little-endianess。

2

8000,小端(little endian),16 位 PCM,单声道即可达到目的。


顺便说一句,上述信息适用于三星GS2的音频。 - Nirvana Tikku

0

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