我正在开发一个应用程序,需要对从麦克风捕获的原始pcm音频执行识别算法。在我测试过的所有android设备上,pcm数据都是可用的(即原始音频数据)。
sprint evo在mic上有agc(自动增益控制),这会破坏数据,使我们的识别算法不再工作。
我相信这是htc为这个设备(可能还有未来的设备)添加到操作系统中的一个特性。我已经在其他一些使用相同操作系统版本(2.1)的设备上测试了我们的应用程序,这些其他设备的行为正常。
不幸的是,htc还没有发布这个设备上使用的代码。我希望我可能不得不使用jni来绕过这个特定设备,我愿意这么做,但是如果没有htc源代码的访问,我不知道从哪里开始。
没有办法逆转AGC的影响,所以我一直在努力解决它。
更具体的信息:
我使用录音机是为了获取原始的pcm数据。我尝试了一些使用mediaRecorder来记录AMR数据的程序,这些记录也显示了相同的AGC属性。
有一件事我还没有尝试过,那就是编写我自己的例程来使用mediarecorder和setaudiosource(audiosource.voice_recognition)。我能在这个标志上找到的唯一文档来自android参考,它只是简单地声明了“麦克风音频源,如果可以的话,它的行为就像默认的那样。”这可能是我需要的,但是需要解码amr数据的额外步骤才能得到pcm数据(如果需要,我会这么做。)
如果有人知道这个新的“功能”,任何信息将非常感谢。具体来说,如果我能回答以下任何一个问题,我的生活就会好得多:
这是宏达电特有的新功能吗?
HTC什么时候会发布EVO/超音速的代码库?
有没有其他人碰到这个问题,想办法解决这个问题?
音频源.语音识别真的能阻止AGC吗?
audiosource.voice_recognition的存在是否表明这在未来的设备中会更常见,并且此标志是绕过它的一个规定?
任何其他线索,提示,提示,将不胜感激。

最佳答案

事实证明,我在浏览android git仓库时找到了解决方案:

AudioRecord ar =
    new AudioRecord(MediaRecorder.AudioSource.VOICE_RECOGNITION, ...);

对于运行OS 2.1及以上版本的设备,这允许您接收不受AGC影响的音频流,并且仍然是高质量的16位PCM数据流。
我将我的应用程序设置为1.5或更高版本,直到API级别7(OS 2.1)才支持此语音识别标志。不过,由于evo运行的是v2.1版本,而且我相对有信心这对os 2.1之前的任何设备都不会有问题,所以简单的版本检查可以将解决方案限制在需要/支持它的设备上。

10-04 15:39