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

pne*_*tle 4 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的存在是否表明这在未来的设备中会更常见,而这个标志是绕过它的规定吗?

任何其他线索,提示,提示将不胜感激.

pne*_*tle 6

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

AudioRecord ar = 
    new AudioRecord(MediaRecorder.AudioSource.VOICE_RECOGNITION, ...);
Run Code Online (Sandbox Code Playgroud)

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

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