保存 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 语音识别引擎的音频输入的主要内容,如果未能解决你的问题,请参考以下文章

Android比较两个声音以进行语音匹配

VC++基于微软语音引擎开发语音识别总结

语音识别引擎打破命令

带有日产汽车收音机的安卓蓝牙 SCO

语音识别引擎和复选框的困难时期

微软TTS5.1语音引擎(中文).msi怎么用?