阻止不可避免的回声的最有效方法

Most efficient way to stop an inevitable echo

我创建了一个模块化系统,可以在任何带有麦克风和扬声器和 android phone 的设备之间通过 UDP 传输语音。如果麦克风和扬声器放置的距离不远,phone 上录制的任何内容都将在扬声器上播放,同时录制并发送回 phone,从而创建一个不可避免的回声。

目前的问题是麦克风在播放时正在录音,所以如果例如在播放重要内容时发送代码以停止录音,问题就会解决。这要么通过一键通按钮(不太适合 phone-呼叫类型的情况),要么通过一种算法来实现,该算法可以感应最大幅度并决定是说重要的事情还是只是说噪音。后者更易于使用,但在嘈杂的环境中很容易出错。

抱歉讲了这么长时间,但我想知道您是否有更多 efficient/faultproof 方法来解决这个问题。

General Schematic

P.S。我在硬件方面没有足够的处理能力以数字方式消除回声,我也不知道该怎么做。我确信它也可以使用某种模拟滤波器来实现,但我也不知道该怎么做。

编辑: 感谢 mattm 我现在知道我需要像 AEC 这样的东西,尽管它可能不是最有效甚至不实用的。

我正在使用 WIFI-UART 模块 (HLK-RM04),它有一个大问题。当模块将 8 位音频样本转换为 IP 数据报时,会有非常明显的延迟。由于某种原因,当它解包从 android 发送的数据报时,这种延迟不存在 => 从 android 接收样本需要大约 50 毫秒,但从麦克风接收样本需要大约 650 毫秒。因为我使用的是 7200 的采样率,这意味着 AEC 算法必须在至少 4680 samples/sec 的数据集上工作才能保持它 "real-time"。

这个最简单的解决方案是使用耳机或电话听筒,这样一个用户的声音输出就不会反馈到同一用户的麦克风中。

您的问题已由 acoustic echo cancellation. You can see examples of digital implementations of acoustic echo cancellation in the Speex audio codec, which is older now, or the implementation in WebRTC 解决。这些实现绝对是不平凡的。

我没有模拟声学回声消除的经验。

如果一方(non-Android)不能进行声学回声消除,另一方(Android)的体验会很差。