AudioRecord 同时播放音频 - 访问输出播放数据

AudioRecord while also playing audio - accessing output playback data

我在我的应用程序中使用语音命令的自定义模型 - 我让它可以很好地录制和处理来自 AudioRecord 的输入音频,并且我通过文本到语音向用户提供反馈。

我遇到的一个问题是,我希望即使在播放音频时也能正常工作——无论是通过我自己的文本转语音还是通过在后台播放的其他内容(例如音乐)。我意识到这将是一个非常重要的问题,但如果我能以某种方式访问​​音频输出数据(phone 正在播放的内容)并将其与我的 microphone 输入相匹配数据,我想我至少可以为此调整我的模型+改进我的结果。

但是,根据 Android - Can I get the audio data for playback from the audio mixer? ,这听起来是不可能的。

两个问题:

1) 我是否缺少任何方法来通过 android api 或 android 的任何选项访问预期的音频 output/playback 数据api 规定处理这个问题(音频输出和输入之间的反馈循环)?

2) 除了停止所有其他播放或等待其他播放完成之外 - 是否有其他方法可以解决此问题?如果用户正在使用扬声器 phone,我会假设一些呼叫应用程序有办法处理这个问题 phone,我只是想念如何自己做

谢谢

1 和 2 的答案:您想要 AcousticEchoCanceler

关于为什么 "deleting the speaker audio from the microphone input" 输入是一项需要大量信号处理知识的不平凡任务的简短讲座:它比仅仅稍微时移扬声器音频并从麦克风输入中减去它更复杂.事实是,音频的频谱即使在离开扬声器时也会发生巨大变化(大多数微型扬声器都有 very peaky response centered around 3-4KHz). The audio may bounce off multiple objects (walls, etc.) before it gets back to the mic (multipath interference)。不同的频率分量以不同的、无法预测的方式干扰 microphone,极大地改变了音频的频谱。顺便说一句——如果房间里有任何东西移动,比如说,如果你把手放在 phone 附近——一切都会改变。这就是为什么您不想尝试编写自己的回声消除过滤器的原因。 Android 已经为您提供了一个,因此您可以编写很酷的扬声器phone 应用等。