android - 如何在 HTC EVO (Supersonic) 上禁用 AGC?

标签 android audio-recording

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

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

我相信这是 HTC 为此设备(可能还有 future 的设备)添加到操作系统中的一项功能。我已经在其他一些使用相同操作系统版本 (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 的存在是否表示预计这将在未来的设备中更常见并且此标志是绕过它的规定?

任何其他线索、提示、技巧将不胜感激。

最佳答案

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

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

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

我的应用目标是 1.5 及更高版本,直到 API 级别 7(操作系统 2.1)才支持此 VOICE_RECOGNITION 标志。但是,由于 EVO 运行的是 v2.1,而且我相对有信心这对于 OS 2.1 之前的任何设备都不会成为问题,因此简单的版本检查就可以将解决方案限制在那些需要/支持一下。

关于android - 如何在 HTC EVO (Supersonic) 上禁用 AGC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3002735/

相关文章:

android - 绘制带孔的路径(android)

java - 如何在没有外部库的情况下在java中按字母顺序对json数据进行排序?

android - MediaRecorder 在录制第二个音频剪辑时崩溃

javascript - 在 HTML5 中录制在 Firefox 中不起作用

android - 如何以编程方式将录制的音频文件保存在另一个文件夹中?

android - 如何在marshmallow 及以上android 版本中以编程方式启用移动热点?

android - 在webview android中输入焦点时崩溃

java - 来自 ok Retrofit 响应的图像的空模型

android - MediaRecorder 类录制音频的问题 - prepare() 给出异常 - 权限被拒绝

java - 如何根据微调器值将音频保存在SD卡中