保存Android股票语音识别引擎的音频输入
我正在尝试在文件中保存由android的语音识别服务所侦听的音频数据。
其实我实现RecognitionListener
如下所述:在Android上的语音到文本
将数据保存到缓冲区中,如下所示:捕获发送到Google语音识别服务器的音频
并将缓冲区写入Wav文件,如下所示。 Android将原始字节记录到用于Http Streaming的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采样率设置为44100HZ :
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音频文件中?
你没有包含你的代码来实际写出PCM数据,所以很难诊断,但是如果你听到奇怪的噪声,那么当你写数据的时候,你看起来很可能是错误的endian,或者错误的数字通道。 使采样率错误只会导致音频声音变慢或变快,但如果听起来完全乱码,则可能是在指定字节流的通道数或字节数时出错。
要知道确实,只需将您的字节直接传输到没有任何头文件(原始PCM数据)的文件。 这样,您可以在编写文件头时排除任何错误。 然后使用Audacity导入原始数据,试验不同的选项(比特深度,endian,频道),直到听到正确的音频文件(只有一个是正确的)。 你可以从File-> Import-> Raw Data ...
一旦以这种方式确定了字节格式,您只需要担心是否正确设置标题。 您可能想要参考此参考文件http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html获取文件格式。 或者在编写音频文件,Java(读取,操作和编写WAV文件或FMJ)时查看现有Java解决方案的以下链接。 虽然我猜这些可能无法在Android上使用。
如果您不得不推出自己的WAV / RIFF编写器,请记住Java的数据类型是大写字母,因此您写入文件的任何多字节基元都必须以反向字节顺序写入,以匹配RIFF的小字节顺序。
8000 ,小端, 16位PCM ,单声道做了诀窍
在最新版本的onBufferReceived中不起作用,您可以使用来自语音识别意图的录制/保存音频。
链接地址: http://www.djcxy.com/p/33863.html上一篇: Saving audio input of Android Stock speech recognition engine
下一篇: Improve performance of musical note synthesis using AudioTrack