从麦克风输入中删除已知音频输出

Posted

技术标签:

【中文标题】从麦克风输入中删除已知音频输出【英文标题】:Remove known audio output from microphone input 【发布时间】:2014-03-14 19:02:02 【问题描述】:

我正在尝试学习如何以尽可能多的不同方式处理音频。

给定一个已知的音频流(我们称之为stream1)和一个未知的音频流(stream2),它们混合成一个单一的流(mix1)。

现在假设我们事先知道 stream1 但不知道 stream2,是否可以使用 stream1 将其自身从 mix1 中消除,从而为我们提供具有最小噪声/干扰的 stream2?

为了给它一个真实的世界环境,假设你的计算机有麦克风和扬声器(不是耳机),并且因为计算机提前知道(好吧,只有几毫秒,但仍然)输出到扬声器可以从来自麦克风的混音中消除该声音。在这个真实世界的情况下,已知的流并不是完全已知的,因为传输和接收之间可能存在一些失真。

假设这是可能的,有人可以建议一些有关所涉及算法的阅读吗?

【问题讨论】:

我也对此感兴趣。我找到了“声学回声消除”这个短语,但该技术(顾名思义)只是消除了麦克风输入流中的回声,而不考虑计算机产生的声音。 或许这是正确的短语? svconline.com/proav/… @Thomas,从您粘贴的链接来看,您似乎是对的,它的术语是“声学回声消除”。我将对其进行更多研究,如果没有其他人回答,我会找到更多信息,我将在此处添加。谢谢 只是粗略地环顾四周,我发现似乎是 matlab 代码的示例:mathworks.co.uk/help/dsp/examples/… 现在我对所涉及的思考有点厌倦了,所以我要看看明天通过它 - 只是想你可能会感兴趣。 【参考方案1】:

是的,这是可能的。两种方法:

时域

如果您可以保证混合音频与原始流 1 的时序是样本精确的,那么您可以简单地否定原始流 1 并将其添加到混合中。现在,您可能需要稍微缩放该波形,因为通常在混合音频时,它们的电平会降低。

如果对音频进行了其他处理(例如电平压缩),那么这会影响您干净地进行这种声音减法的能力。

频域

虽然正常的 PCM 编码音频只是每秒多次采样压力,但这并不是完全感知声音的方式。我们听到不同的频率。如果您使用傅立叶变换(通常使用 FFT 算法完成),您可以将音频样本从时域转换到频域,从而在此过程中为您提供各种频率段中的声音级别。

如果将流 1 和混音都转换到频域,从混音中减去流 1,然后再转换回时域进行输出,则可以有效地从混音中去除大部分流 1。您使用的频率桶越多,所需的 CPU 就越多,但这种删除将越准确。请注意,虽然这意味着您不必非常精确地采样,但它通常会损害混音的声音质量。

许多音频编辑程序使用这种方法来消除背景噪音。

【讨论】:

【参考方案2】:

声音只是一条曲线 - 通常它会随着时间的推移在零上下波动(16 位音频有 2^16 个可能的整数可用,因此原始 PCM 音频只是 +- 32768 范围内的整数流) - 一次这种格式 - 只需切换 stream1 整数的符号 (+-),然后将其添加到相应的混合整数中,因为您遍历两个 stream1 的数据并一次混合一个整数,然后重新归一化回 +- 32768 以重新获得您的音量 - 这有效地从您的混音中删除 stream1 - 音频工具 Audacity 为您提供此选项

【讨论】:

以上是关于从麦克风输入中删除已知音频输出的主要内容,如果未能解决你的问题,请参考以下文章

EZAudio 中的音频输入源

从浏览器中的麦克风获取音频输入并提取特征

如何在 Delphi 中使用 TMediaPlayer 从麦克风输入中录制音频?

Java:从 2 个不同的麦克风输入中独立捕获音频

如何将系统麦克风音频流传输到附加设备的麦克风音频流

在 iOS 中通过蓝牙播放时从内置麦克风录制