我创建了一个模块化系统,可以通过麦克风和扬声器以及Android手机在任何网络之间传输语音。如果麦克风和扬声器的放置距离不远,手机上录制的任何内容都将在扬声器上播放,同时录制并发送回手机,从而产生不可避免的回声。
到目前为止,问题在于麦克风正在播放时进行录制,因此如果例如在发生重要播放时发送了代码以停止录制,则问题将得到解决。这可以通过按键通话按钮(不太适合电话呼叫类型的情况)来实现,或者通过算法来感知最大振幅并决定是重要的是说什么还是只是噪声。后者更容易使用,但在嘈杂的环境中很容易出错。
对于长时间的讲座感到抱歉,但我想知道你是否有更有效/更准确的解决方法。
P.S。我没有足够的处理能力在硬件方面以数字方式移除回声,也不知道如何。我确定它可以使用某种模拟滤波器,但我也不知道如何做到这一点。
编辑: 感谢mattm我现在知道我需要像AEC这样的东西,尽管它可能不是最有效甚至是实用的。
我使用的是WIFI-UART模块(HLK-RM04),它有一个很大的问题。当模块将8位音频样本转换为IP数据报时,存在非常显着的延迟。出于某种原因,当它解包从android =>发送的数据报时,这种延迟并不存在。从android接收样本需要大约50ms,但从麦克风接收一个需要大约650ms。因为我使用7200的采样率,这意味着AEC算法必须在至少4680个样本/秒的数据集上工作,以保持"实时"。
答案 0 :(得分:3)
这个最简单的解决方案是使用耳机或电话听筒,因此一个用户的声音输出不会反馈到同一个用户的麦克风中。
acoustic echo cancellation解决了您的问题。您可以在Speex audio codec中查看声学回声消除的数字实现示例,现在已经过时了,或WebRTC中的实现。这些实现绝对不是一件容易的事。
我没有模拟声学回声消除的经验。
如果您无法在一方(非Android)上进行声学回声消除,则对方(Android)的体验将会很差。