mmm*_*mmx 38 audio android speech-recognition wav voice-recognition
我试图在文件中保存由android的语音识别服务监听的音频数据.
实际上我RecognitionListener按照这里的解释实现:
Android上的语音到文本
将数据保存到缓冲区中,如下所示: 捕获发送到Google语音识别服务器的音频
并将缓冲区写入Wav文件,如此处所示. Android将原始字节记录到HVEp Streaming的WAVE文件中
我的问题是如何获得适当的音频设置以保存在wav文件的标题中.事实上,当我播放wav文件时,只听到奇怪的噪音,这个参数,
short nChannels=2;// audio channels
int sRate=44100; // Sample rate
short bSamples = 16;// byteSample
Run Code Online (Sandbox Code Playgroud)
或者没有这个:
short nChannels=1;// audio channels
int sRate=8000; // Sample rate
short bSamples = 16;// byteSample
Run Code Online (Sandbox Code Playgroud)
令人困惑的是从logcat查看语音识别任务的参数我发现第一个Set 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
Run Code Online (Sandbox Code Playgroud)
然后当它播放要发送到谷歌服务器的文件时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
Run Code Online (Sandbox Code Playgroud)
那么,我怎样才能找到正确的参数来将音频缓冲区保存在一个好的wav音频文件中呢?
您没有包含实际写出PCM数据的代码,因此难以诊断,但如果您听到奇怪的噪音,那么当您编写数据或错误的数字时,您很可能会看到错误的字节序.通道.获取采样率错误只会导致音频声音变慢或变快,但如果听起来完全乱码,则可能是指定通道数或字节流的字节顺序错误.
要确切知道,只需将字节直接流式传输到没有任何标头的文件(原始PCM数据).这样,您可以在编写文件头时排除任何错误.然后使用Audacity导入原始数据,尝试不同的选项(位深度,字节序,通道),直到你得到一个听起来正确的音频文件(只有一个是正确的).您可以从文件 - >导入 - >原始数据执行此操作...
一旦您以这种方式识别了字节格式,您只需要担心是否正确设置了标题.您可能希望参考此参考http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html获取文件格式.或者在编写音频文件,Java阅读,操作和编写WAV文件或FMJ时,查看现有Java解决方案的以下链接.虽然我猜这些可能无法在Android上使用.
如果您不得不自己编写WAV/RIFF 编写器,请记住Java的数据类型是big-endian,因此您写入文件的任何多字节基元必须以反向字节顺序写入,以匹配RIFF的小端.
| 归档时间: |
|
| 查看次数: |
7239 次 |
| 最近记录: |