使用 ffmpeg 减少背景噪音并优化音频剪辑中的语音

Sud*_*udh 52 audio noise voice speech-recognition 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
Run Code Online (Sandbox Code Playgroud)

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

此外,我阅读了有关可用于语音增强的韦纳过滤器并发现了这一点,但我不确定如何使用它。

小智 48

如果您希望隔离可听语音,请尝试将低通滤波器与高通滤波器结合使用。对于可用音频,我注意到过滤掉 200hz 及以下然后过滤掉 3000hz 及以上在保持可用语音音频方面做得非常好。

ffmpeg -i <input_file> -af "highpass=f=200, lowpass=f=3000" <output_file>
Run Code Online (Sandbox Code Playgroud)

在这个例子中,首先添加高通滤波器来削减较低的频率,然后使用低通滤波器来削减较高的频率。如果需要,您可以多次运行文件以清除截止频率范围内的更高分贝频率。

  • 您可以使用 `ffplay &lt;input file&gt; -af lowpass=3000,highpass=200` 预览您的过滤器 (10认同)
  • 就我而言,原始音频非常糟糕,几乎无法听到声音,因为背景中有一些落水噪音。我使用了以下内容。它的质量不是很好,但比原版好 1000 倍。`-af“高通=f=200,低通=f=1000”` (6认同)
  • Bjorn 的建议很棒,因为您可以浏览整个页面并快速尝试以不同的顺序链接不同的过滤器。例如,通过这种方式,我找到了一个很好的组合过滤器: `-af lowpass=3000,highpass=200,afftdn=nf=-25` (2认同)

小智 29

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

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

此外,一段时间以来,人们可以将ladspa(寻找噪声抑制器)和/或lv2(寻找语音降噪器)滤波器与 FFmpeg 一起使用。


Pet*_*des 16

更新:最近添加了 FFmpeg afftdn,它使用下面描述的每个 FFT-bin 的噪声阈值方法,并提供各种选项来即时调整/找出适当的阈值。

anlmdn(非本地方式)是一种适用于视频的技术;我没有试过音频过滤器。

无论这些应该是比的高通/低通更好的,除非你的唯一的噪音是60Hz的嗡嗡声或东西。(人类语音在非常窄的带通中听起来仍然可以,但有更好的方法来清除宽带噪声背景嘶嘶声。)


ffmpeg 没有内置任何像样的降噪音频过滤器。 Audacity 有一个相当有效的 NR 过滤器,但它被设计用于 2-pass 操作,只有噪声样本,然后是输入。

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

另请参阅音频降噪:大胆与其他选项相比如何?有关其工作原理的更多详细信息,并且以一种或另一种方式对 FFT bin 进行阈值处理也是典型商业降噪滤波器的基础。

将该过滤器移植到 ffmpeg 会有点尴尬。也许将它实现为具有 2 个输入的滤波器,而不是 2 通滤波器,效果最好。因为它只需要几秒钟就可以得到一个噪声配置文件,所以它不必通读整个文件。无论如何,您不应该将整个音频流作为噪声样本提供给它。它需要查看一个 JUST 噪声样本来为每个 FFT bin 设置阈值。

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


小智 10

我有一个带有各种糟糕背景噪音的视频。我设法以这种方式修复:我使用以下命令进行了两次传递:

ffmpeg -i input.mp4 -af "afftdn=nf=-25" file1.mp4

ffmpeg -i file1.mp4 -af "afftdn=nf=-25" file2.mp4
Run Code Online (Sandbox Code Playgroud)

比我用来澄清说话的

ffmpeg -i file2.mp4 -af "highpass=f=200, lowpass=f=3000" file3.mp4
Run Code Online (Sandbox Code Playgroud)

最后增加了音量:

ffmpeg file3.mp4 -af "volume=4" finaloutput.mp4
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我设法获得了相当不错的音频。无论如何,声音是主观的,对我有益的可能对其他人不利。希望能帮助到你。毫米

  • 谢谢!这个命令效果很好。此外,我使用 `-c:v copy` 对视频进行了流复制,以使其运行速度更快,并且不会以任何方式更改视频(我正在清理 mov 文件的音频)。`ffmpeg -i myvideo.mov -af "afftdn=nf=-25" -c:v 复制 myvideo_clean.mov` (2认同)

小智 5

低通和高通滤波器与 afftdn 的组合令人印象深刻,我已经成功地使用此配置清除了旧 vhs 视频中的白噪声:

-af "highpass=200,lowpass=3000,afftdn"

Run Code Online (Sandbox Code Playgroud)