如何在 HTC EVO(超音速)上禁用 AGC?
Posted
技术标签:
【中文标题】如何在 HTC EVO(超音速)上禁用 AGC?【英文标题】:How do you disable AGC on the HTC EVO (Supersonic)? 【发布时间】:2010-06-09 02:23:03 【问题描述】:我正在开发一个应用程序,该应用程序需要对从麦克风捕获的原始 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 数据(如果必须,我会这样做。)
如果有人知道这个新“功能”的任何信息,我们将不胜感激。具体来说,如果我能回答以下任何问题,我的生活会好很多:
-
这个新功能是 HTC 特有的吗?
HTC 何时会发布他们的 EVO/Supersonic 代码库?
是否有其他人遇到此问题并找到解决此问题的方法?
AudioSource.VOICE_RECOGNITION 真的能阻止 AGC 吗?
AudioSource.VOICE_RECOGNITION 的存在是否表明预计这将在未来的设备中更常见,并且此标志是绕过它的规定?
任何其他线索、提示、提示将不胜感激。
【问题讨论】:
【参考方案1】:事实证明,我在浏览 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 之前的任何设备都不会出现问题,因此简单的版本检查将解决方案仅限于那些需要/支持一下。
【讨论】:
【参考方案2】:不幸的是,
AudioRecord ar =
new AudioRecord(MediaRecorder.AudioSource.VOICE_RECOGNITION, ...);
不是通用解决方案。即使选择了 MediaRecorder.AudioSource.VOICE_RECOGNITION,一些制造商也会应用 AGC。他们只是忽略了谷歌的“兼容性定义”。见How avoid automatic gain control with AudioRecord?
【讨论】:
以上是关于如何在 HTC EVO(超音速)上禁用 AGC?的主要内容,如果未能解决你的问题,请参考以下文章
HTC Evo 3D 在 Eclipse/Android Studio 中无法识别