我创建了一个模块化系统,可以在任何带有麦克风和扬声器的设备与 Android 手机之间通过 UDP 传输语音。如果麦克风和扬声器放置的距离不太远,手机上录制的任何内容都会在扬声器上播放,同时录制并发送回手机,从而不可避免地产生回声。
到目前为止,问题是麦克风在播放时正在录音,所以如果例如在播放重要内容时发送代码以停止录音,问题就会解决。这要么通过一键通按钮(不太适合电话调用类型的情况),要么通过一种算法来实现,该算法可以感应最大幅度并决定是在说重要的事情还是只是噪音。后者更易于使用,但在嘈杂的环境中很容易出错。
抱歉讲了这么长时间,但我想知道您是否有更有效/防错的方法来解决这个问题。
附言我在硬件方面没有足够的处理能力以数字方式消除回声,我也不知道该怎么做。我确信也可以使用某种模拟滤波器来做到这一点,但我也不知道该怎么做。
编辑: 感谢mattm我现在知道我需要像 AEC 这样的东西,尽管它可能不是最有效甚至最实用的。
我正在使用 WIFI-UART 模块 (HLK-RM04),它有一个大问题。当模块将 8 位音频样本转换为 IP 数据报时,会有非常明显的延迟。由于某种原因,当它解压缩从 android 发送的数据报时,这种延迟不存在 => 从 android 接收样本需要 ~50ms,但从麦克风接收样本需要 ~650ms。因为我使用的是 7200 的采样率,这意味着 AEC 算法必须处理至少 4680 个样本/秒的数据集才能保持“实时”。
最佳答案
这个最简单的解决方案是使用耳机或电话听筒,这样一个用户的声音输出就不会反馈到同一用户的麦克风中。
您的问题已通过 acoustic echo cancellation 解决.您可以在 Speex audio codec 中查看声学回声消除的数字实现示例。 ,现在较旧,或 WebRTC 中的实现.这些实现绝对是不平凡的。
我没有模拟声学回声消除的经验。
如果你不能在一方(非 Android)上进行声学回声消除,另一方(Android)的体验就会很差。
关于android - 阻止不可避免的回声的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34600967/