【问题标题】:Active noise cancellation主动降噪
【发布时间】:2023-10-06 17:45:01
【问题描述】:

我编写了一个语音识别程序,但我无法通过计算机播放音乐来让麦克风听到我的声音。我需要能够从进入麦克风的声音中滤除离开扬声器的声音的软件。

是否有软件或组件(用于 Delphi)可以解决我的问题?

【问题讨论】:

  • 您需要在一种 fft 监视器中捕获噪声配置文件(例如,它将定义频带 36、67、123,...,需要减少 x db)进行使用此配置文件过滤 fft 并将其应用于您的信号。我投了反对票,因为这有点离题。您要求一个没有前期工作的软件或组件。也许它更适合 QA 站点“信号处理”?
  • 作为提示,要消除噪音,您可以在其自身顶部播放,并颠倒相位。
  • 我已经搜索了一段时间,我发现的都是废话!然后这个。这是实际情况!请问,你的效果如何?

标签: delphi audio noise cancellation


【解决方案1】:

我认为你想做noise canceling microphones 所做的事情。这些系统至少使用一个额外的麦克风来计算“周围噪音”和直接针对麦克风的噪音(它必须记录的语音)之间的差异。我认为您无法通过纯软件解决方案可靠地获得相同的效果。

第一步显然是关闭音乐:-)

【讨论】:

  • -1:您的评论是评论,而不是答案。要求提供一种软件解决方案,以消除计算机接收到的声音中产生的声音。
  • @Argalatyr 但这是有道理的一点,如果没有额外的信息,降噪是非常困难的,而降噪麦克风具有。
  • @Argalatyr 我明白你的意思,我在回答和评论之间犹豫了一段时间。然而,这个问题很难在软件中正确解决,再加上硬件解决方案极其简单(第二个麦克风,或现成的噪音消除一个成本不高的麦克风),这一事实让我决定将其作为一个答案问题。但我同意这有点朦胧..
  • 语音识别程序是用来控制iTunes的。所以关掉音乐不是什么好选择。
  • 虽然拾取环境噪音的麦克风是 /ideal/,但拥有环境噪音的 SOURCE(通过扬声器发出的声音)将允许显着(如果不完美)消除。这不是一个不合理的要求。
【解决方案2】:

我认为 speex 预处理器具有回声消除功能。您需要向其提供您录制的音频数据以及您想要取消的音频,它会尝试将其删除。

主要问题是找出您的计算机播放的音频。不确定是否有好的 API。

它还具有降噪功能和语音活动检测功能。你可以把它编译成dll,然后写一个delphi头文件。

【讨论】:

    【解决方案3】:

    你需要捕获:

    1. 电脑输出
    2. 麦克风。输入

    然后您需要找到两个参数,具体取决于您的麦克风。位置和音响系统延迟。这两个参数是n-delay和k-amplify。

    Stream1[t+n]*k=Stream2[t]
    

    其中 t = 时间。当你找到这个参数然后你的结果流,只说话麦克风。输入将是

    Stream2[t]-Stream1[t+n]*k=MusicReductionStream[t]
    

    【讨论】:

    • 真的很喜欢这个简洁的解决方案。此等式中的n 取决于音频输出的缓冲区大小,即输出的延迟。
    • 您可以通过在发送到音频输出缓冲区本身之前创建自己的 x 样本帧数量的缓冲区来消除了解 n 的需要。这会很好,尽管它可能会使最终用户无法忍受延迟时间。
    • 这不会很好地工作,因为系统的脉冲响应不太可能是单个延迟抽头。由于房间内的反射、扬声器相位响应等,声音会适时传播。
    • 确实,这有点幼稚。在不变的环境中给定正确的 n 和 k,您可能可以摆脱大部分反馈,但在现实生活中,仅此公式不会像您习惯的反馈取消那样起作用在 Skype 或您的手机上。
    【解决方案4】:

    查看 AsioVST 库。

    • 100% 开源 Delphi 代码
    • 免费
    • 非常完整
    • 活动(例如,正在添加对 xe2 / x64 的支持)

    Examples\Plugins\Crosstalk Cancellation\ 下,您会找到一个插件的源代码,它可能满足您的需求。

    奇迹发生在DAV_DspCrosstalkCancellation.pas

    【讨论】:

      【解决方案5】:

      您需要估计扬声器和房间等的脉冲响应,这可能会随着扬声器和麦克风的精确定位以及房间的大小和内容等而变化,以及了解/估计系统延迟。

      如果人或麦克风是可移动的,则需要不断地重新估计脉冲响应和延迟。

      估计脉冲响应后,您可以将其与输出信号进行卷积,并尝试从麦克风输入中减去延迟版本的结果,直到您可以将语音输入的无声部分归零。互相关可能有助于估计延迟。

      【讨论】: