保存Android股票语音识别引擎的audioinput
我正在试图保存在一个文件的audio数据收听android的语音识别服务。
其实我实现RecognitionListener
这里解释: 在Android上的语音到文本
将数据保存到缓冲区,如下所示: 捕获发送到Google语音识别服务器的audio
并将缓冲区写入一个Wav文件,如在这里。 Android将Http Streaming的原始字节logging到WAVE文件中
我的问题是如何得到适当的audio设置保存在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
那么,怎样才能find合适的参数将audio缓冲区保存在一个好的wavaudio文件中呢?
你没有把你的代码写入PCM数据,所以很难诊断,但是如果你听到奇怪的噪声,那么看起来很可能你在写数据的时候是错误的endian ,或者错误的数字通道。 获取采样率错误只会导致audio声音变慢或变快,但如果听起来完全乱码,则可能是在指定字节stream的通道数或字节数时出错。
要知道肯定,只是直接将您的字节stream到一个文件没有任何头(原始PCM数据)。 通过这种方式,您可以在编写文件头时排除任何错误。 然后使用Audacity导入原始数据,试验不同的选项(比特深度,endian,频道),直到听到正确的audio文件(只有一个是正确的)。 你可以从File-> Import-> Raw Data …
一旦以这种方式确定了字节格式,您只需要担心是否正确设置标题。 您可能需要参考此参考文件http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html获取文件格式。; 或者在编写audio文件, Java(读取,操作和编写WAV文件或FMJ)时查看现有Java解决scheme的以下链接。 虽然我猜这些可能不适用于Android。
如果您不得不推出自己的WAV / RIFF编写器,请记住Java的数据types是big-endian,因此您写入文件的任何多字节基元都必须以相反的字节顺序写入,以匹配RIFF的小端。
8000 ,小端, 16位PCM ,单声道做的伎俩
在最新版本的onBufferReceived不起作用的情况下,您可以使用录音/保存来自语音识别意图的audio 。