4

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

到目前为止,问题是麦克风在播放时正在录音,因此,例如,如果在播放重要内容时发送代码以停止录音,则问题将得到解决。这可以通过按键通话按钮(不太适合电话类型的情况)来实现,也可以通过一种算法来感知最大振幅并确定是在说重要的事情还是只是噪音。后者更容易使用,但在嘈杂的环境中很容易出错。

对冗长的讲座感到抱歉,但我想知道您是否有更有效/防错的方法来解决这个问题。

一般示意图

PS我在硬件方面没有足够的处理能力以数字方式消除回声,我也不知道如何去做。我确信它也可以使用某种模拟滤波器来做到这一点,但我也不知道如何做到这一点。

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

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

4

1 回答 1

3

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

您的问题已通过回声消除解决。您可以在现在较旧的Speex 音频编解码器中看到声学回声消除的数字实现示例,或者在WebRTC中实现。这些实现绝对是不平凡的。

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

如果您无法在一方(非 Android)上进行声学回声消除,另一方(Android)的体验将很差。

于 2016-01-04T22:56:09.283 回答