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

标签 android voip audiorecord audiotrack aec

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

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

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

General Schematic

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

编辑: 感谢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/

相关文章:

Android AudioRecord 缓冲区在有意义的值之前以多个 0 开头

android - 无效的 JNI 引用(从 C++ 调用 Java 方法)

android - 根据 JSON 响应添加文本

sms - Twilio 可编程自定义语音通话

c++ - C++中的IAX注册程序

Android 强制 AudioRecord 使用耳机麦克风

android - 解释 Android 内存信息

android - 可以将 Beta 版应用程序作为 .apk 分发给亲朋好友进行测试并获得反馈吗?

python - Raspberry Pi 上的 VoIP 服务器/客户端

android - AudioRecord 总是创建失败