你如何在HTC EVO(超音速)上禁用AGC?

时间:2010-06-09 02:23:04

标签: android audio-recording

我正在开发一个应用程序,需要对从麦克风捕获的原始PCM音频执行识别算法。在我测试的所有Android设备上,PCM数据都是可用的(即原始音频数据)。对于新的Sprint EVO,情况并非如此。

Sprint EVO在麦克风上有AGC(自动增益控制),它会破坏数据,使我们的识别算法不再有效。

我相信这是HTC为此设备(以及可能未来的设备)添加到操作系统中的一项功能。我已经在使用相同操作系统版本(2.1)的其他一些设备上测试了我们的应用程序,这些其他设备正常运行

不幸的是,HTC尚未发布此设备上使用的代码。我希望我可能必须使用JNI来绕过这个特定设备,我愿意这样做,但是如果没有HTC源代码,我就不知道从哪里开始。

没有办法扭转AGC的影响,所以我一直试图解决它。

更具体的信息:

我正在使用AudioRecorder来访问原始PCM数据。我尝试了一些使用MediaRecorder记录AMR数据的程序,这些记录也表现出相同的AGC属性。

我还有一件事要做,就是编写自己的例程来使用MediaRecorder并使用setAudioSource(AudioSource.VOICE_RECOGNITION)。我在这个标志上可以找到的唯一文档来自Android参考,它简单地说明“如果可用的话,调整用于语音识别的麦克风音频源,其行为就像DEFAULT”。这可能是我需要的,但需要额外的步骤来解码AMR数据以获取PCM数据(如果必须的话,我会这样做。)

如果有人知道这个新的“功能”,任何信息将不胜感激。具体来说,如果我得到以下任何问题的答案,我的生活会好得多:

  1. 这个新功能是否特定于HTC?
  2. HTC何时会发布EVO / Supersonic的代码库?
  3. 是否有其他人遇到此问题并找到解决问题的方法?
  4. AudioSource.VOICE_RECOGNITION是否实际上阻止了AGC?
  5. AudioSource.VOICE_RECOGNITION的存在是否表明这在未来的设备中会更常见,而这个标志是绕过它的规定吗?
  6. 任何其他线索,提示,提示都将不胜感激。

2 个答案:

答案 0 :(得分:6)

事实证明,我在浏览Android git depot时找到了解决方案:

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

对于运行OS 2.1及更高版本的设备,这允许您接收不受AGC影响的音频流,并且仍然是高质量的16位PCM数据流。

我的目标是我的应用程序在1.5及以上,并且在API级别7(OS 2.1)之前不支持此VOICE_RECOGNITION标志。但是,由于EVO运行v2.1并且我相对确信这对于OS 2.1之前的任何设备都不会有问题,因此简单的版本检查可以将解决方案仅限于那些需要/的设备。支持它。

答案 1 :(得分:0)

不幸的是,

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

不是一般解决方案。即使选择了MediaRecorder.AudioSource.VOICE_RECOGNITION,一些制造商也会应用AGC。他们只是忽略谷歌的“兼容性定义”。见How avoid automatic gain control with AudioRecord?