保存 Android Stock 语音识别引擎的音频输入
Posted
技术标签:
【中文标题】保存 Android Stock 语音识别引擎的音频输入【英文标题】:Saving audio input of Android Stock speech recognition engine 【发布时间】:2012-01-24 21:16:18 【问题描述】:我正在尝试将android语音识别服务收听的音频数据保存在一个文件中。
实际上我实现了RecognitionListener
,如下所述:
Speech 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 音频文件中呢?
【问题讨论】:
您找到解决方案了吗? 似乎你在这方面已经走得最远了。 mmmx,你能解决这个问题吗? 【参考方案1】:您尚未包含实际写出 PCM 数据的代码,因此很难诊断,但如果您听到奇怪的噪音,那么您在写入数据时很可能是错误的endian,或错误的频道数。错误的采样率只会导致音频听起来更慢或更快,但如果听起来完全乱码,则可能是指定通道数或字节流的字节序错误。
要确定,只需将字节直接流式传输到没有任何标题的文件(原始 PCM 数据)。这样您就可以在编写文件头时排除任何错误。然后使用Audacity 导入原始数据,尝试不同的选项(位深度、字节序、通道),直到你得到一个听起来正确的音频文件(只有一个是正确的)。您可以从 File->Import->Raw Data...
执行此操作一旦您以这种方式确定了您的字节格式,您只需要担心您是否正确设置了标题。对于文件格式,您可能需要参考此参考 http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html。或者查看以下有关编写音频文件的现有 Java 解决方案的链接,Java - reading, manipulating and writing WAV files 或 FMJ。虽然我猜这些可能无法在 Android 上使用。
如果您必须使用自己的 WAV/RIFF 编写器,请记住 Java 的数据类型是 big-endian,因此您写入文件的任何多字节原语都必须写入 reverse byte order 以匹配 RIFF 的小端序。
【讨论】:
【参考方案2】:8000,小端序,16 位 PCM,单声道就可以了
【讨论】:
FWIW,以上信息适用于三星 GS2 的音频【参考方案3】:在最新版本 onBufferReceived 不起作用,您可以使用record/save audio from voice recognition intent 代替。
【讨论】:
以上是关于保存 Android Stock 语音识别引擎的音频输入的主要内容,如果未能解决你的问题,请参考以下文章