使用 ffmpeg 降低背景噪音并优化音频片段中的语音

使用 ffmpeg 降低背景噪音并优化音频片段中的语音

我从视频文件中提取音频片段用于语音识别。这些视频来自移动/其他手工制作的设备,因此包含大量噪音。我想降低音频的背景噪音,以便我传递给语音识别引擎的语音清晰。我正在使用 ffmpeg 来完成所有这些工作,但停留在降噪阶段。

到目前为止我已经尝试过以下过滤器:

ffmpeg-20140324-git-63dbba6-win64-static\bin>ffmpeg -i i nput.wav -filter_complex "highpass=f=400,lowpass=f=1800" out2.wav

ffmpeg -i i nput.wav -af "equalizer=f=1000:width_type=h:width=900:g=-10" output.wav

ffmpeg -i i nput.wav -af "bandreject=f=1200:width_type=h:width=900:g=-10" output.wav

但结果非常令人失望。我的理由是,由于语音属于 300-3000 hz 范围,我可以过滤掉所有其他频率以抑制任何背景噪音。我遗漏了什么?

此外,我读到了关于可用于语音增强的维纳滤波器的文章,并发现但不确定如何使用它。

答案1

如果您希望隔离可听语音,请尝试将低通滤波器与高通滤波器组合使用。对于可用的音频,我注意到,过滤掉 200hz 及以下的频率,然后过滤掉 3000hz 及以上的频率,可以很好地保持可用的语音音频。

ffmpeg -i <input_file> -af "highpass=f=200, lowpass=f=3000" <output_file>

在此示例中,首先添加高通滤波器以削减较低频率,然后使用低通滤波器削减较高频率。如果需要,您可以多次运行文件以清理削减频率范围内的较高 db 频率。

答案2

FFmpeg 现在有 3 个原生过滤器来处理噪音背景:

  • afftdn: 使用 FFT 对音频样本进行降噪
  • anlmdn:使用非局部均值算法降低音频样本中的宽带噪声
  • arnndn:使用循环神经网络降低语音噪音。可以找到要加载的模型文件示例这里

此外,从某个时候起,人们可以将ladspa(寻找噪声抑制器)和/或lv2(寻找语音去噪器)过滤器与 FFmpeg 一起使用。

答案3

更新:FFmpeg 最近添加了afftdn使用下面描述的噪声阈值每 FFT 箱方法,并提供了各种选项用于动态调整/找出适当的阈值。

anlmdn(非局部均值)是一种对视频很有效的技术;我还没有尝试过音频过滤器。

以上任何一种都应该很多比高通/低通更好,除非你唯一的噪音是 60Hz 的嗡嗡声或类似的东西。(人类的语音在相当窄的带通中仍然可以听起来不错,但有更好的方法来清除宽带噪音背景嘶嘶声。)


ffmpeg 没有内置任何可用于降低噪音的音频过滤器。Audacity 有一个相当有效的 NR 过滤器,但它设计用于 2 次操作,先对噪音进行采样,然后对输入进行采样。

顶部的评论https://github.com/audacity/audacity/blob/master/src/effects/NoiseReduction.cpp解释它是如何工作的。(基本上:抑制低于阈值的每个 FFT 箱。因此,只有当信号比该频带中的本底噪声大时,它才会让信号通过。它可以做神奇的事情而不会造成问题。它就像一个适应信号的带通滤波器。由于噪声的能量分布在整个频谱上,因此只让几个窄带通过将大大降低总噪声能量。

也可以看看音频降噪:Audacity 与其他选项相比如何?以了解其工作原理的更多细节,并且以某种方式对 FFT 箱进行阈值处理也是典型的商业降噪滤波器的基础。

将该过滤器移植到 ffmpeg 会有点尴尬。也许将其实现为具有 2 个输入的过滤器,而不是 2 通过滤器,效果会更好。由于它只需要几秒钟就可以获得噪声配置文件,因此它不必读取整个文件。而且无论如何,您不应该将整个音频流作为噪声样本输入它。它需要看到仅包含噪声的样本来设置每个 FFT 箱的阈值。

所以是的,第二个输入,而不是 2pass,是有意义的。但这使得它比大多数 ffmpeg 过滤器更难使用。你需要一堆带有流分割/时间范围提取的巫术。当然,你需要手动干预,除非你在单独的文件中有一个适合多个输入文件的噪声样本。(来自同一麦克风/设置的一个噪声样本应该适用于该设置的所有剪辑。)

答案4

去完成用户564335的回答

这: -af arnndn=m=cb.rnnn 可能是我用过的最好的噪音过滤器ffmpeg(基于人工智能)。

像这样:

ffmpeg -i <input_file> -af arnndn=m=cb.rnnn <output_file>

无需频带滤波器。训练模型 ( files.rnnn)可在此处获得(您需要下载并使用其中一个文件)。

cb( )模型conjoined-burgers是我发现的最令人印象深刻loudnorm而且用途广泛。我还发现这个过滤器非常高效(例如,它似乎没有比过滤器占用更多的 CPU )。


此外,自 ffmpeg 5.0 起,有一个新的噪声过滤器:韋特恩

如果我没记错的话,我尝试过它,但在我看来它不如上面训练过的神经网络那么有效。

相关内容