2011-11-27 96 views
6

我已经编程了一个语音识别程序,并且我在听电脑的麦克风上播放音乐时遇到问题。我需要的软件可以滤除离开扬声器的声音进入麦克风。有源噪声消除

是否有软件或组件(德尔福),将解决我的问题?

+0

您需要在fft监视器中捕获噪声配置文件(例如,它会将带36,67,123,...定义为需要减少xdb的带宽),使用此配置文件制作一个fft过滤器并将其应用于您的信号。我不喜欢,因为这有点偏离主题。你需要一个没有初步工作的软件或组件。也许它更适合质量保证网站'信号处理'? – az01

+0

作为提示,为了消除噪音,您可以在相位颠倒的情况下播放它。 –

+0

我一直在寻找一段时间,所有我发现是无意义的!那么这个。这是实际情况!请问,它是如何为你工作的? – Fardin

回答

7

你需要捕获:

  1. 计算机输出
  2. 麦克风。输入

然后,你需要找到两个参数,这取决于你的话筒。位置和音响系统延迟。这两个参数是n延迟和k放大。

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

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

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

真的很喜欢这个整洁的解决方案。该等式中的“n”取决于音频输出的缓冲器大小,即输出的等待时间。 – Alex

+0

在发送到音频输出缓冲区本身之前,您可以根据需要通过创建自己的'x'个样本帧缓冲区来了解'n'。这很好,但它可能会让最终用户无法忍受延迟时间。 – Alex

+4

这不会很好,因为系统的脉冲响应不可能是单个延迟抽头。由于房间里有反射声,扬声器相位响应等,声音会及时传播。 – hotpaw2

6

我想你想要做什么noise canceling microphones做。这些系统使用至少一个额外的麦克风来计算“周围噪音”与直接针对麦克风(它必须注册的语音)的噪音之间的差异。我不认为你可以通过纯软件解决方案获得同样的效果。

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

+1

-1:你的评论,而不是答案。该请求是针对软件解决方案从其收到的声音中去除计算机产生的声音的。 – Argalatyr

+0

@ Argalatyr但是,这是有效的一点,如果没有额外的信息,噪声消除是非常困难的,而噪声消除麦克风具有。 – Harriv

+0

@Argalatyr我明白你的观点,我在回答和评论之间犹豫了一段时间。然而,这个问题很难在软件中正确解决,而且硬件解决方案的难以置信的简单性(第二个麦克风,或现成的噪声消除成本不高)使我决定将其作为答案这个问题。但我同意它有点朦胧.. – fvu

1

我觉得Speex的预处理器有回声消除功能。您需要将所录制的音频数据以及要取消的音频提供给它,并尝试将其删除。

的主要问题是找出哪些音频您的计算机播放。不知道是否有一个好的API。

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

5

退房的AsioVST库。

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

Examples\Plugins\Crosstalk Cancellation\你会发现插件的源代码可能会做你想要的。

Screenshot

魔术发生在DAV_DspCrosstalkCancellation.pas

1

您需要估计扬声器和室等的脉冲响应,其可以与精确扬声器和麦克风的定位和尺寸与房间的内容等,以及知道改变/估计系统延迟。

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

一旦您估计了脉冲响应,就可以将其与输出信号进行卷积并尝试从话筒输入中减去延迟版本的结果,直到可以将语音输入的无声部分置零。互相关可能对估计延迟有用。