用于语音增强的 FFmpeg 音频过滤器管道

信息处理 过滤器 演讲 语音
2022-01-01 21:43:53

使用ffmpeg,我正在用半远距离麦克风录制一个谈话,它的音频。用最通用的术语来说,在一定程度上提高语音清晰度、减少背景静电和环境噪声等是有意义的。

我最好建议使用哪种ffmpeg 音频过滤器组合来增强录制的语音?

我目前正在使用

highpass-frequency=300,
lowpass-frequency=4000,

因为那是说话声音最突出的范围

bass=frequency=100:gain=-50,
bandreject=frequency=200:width_type=h:width=200,

额外衰减低音频率,以及

compand=attacks=.05:decays=.05:points=-90/-90 -70/-90 -15/-15 0/-10:soft-knee=6:volume=-70:gain=10

应用动态范围压缩并据说使较柔和的通道(高于-70dB)更响亮,更响亮的通道更均匀。

我知道数字滤波器不是魔法,但我正在寻找更多来自ffmpeg(或LADSPA的)曲目的东西,以进一步增强声音,使其对噪音、零星咳嗽、也许失去获得的金属余音更有弹性......

我用来测试的 Linux 命令行:

filters='
...above filter lines, in sequence...
'

arecord -q -r 11025 -f s32_le -c 1 -t wav - |
    ffmpeg -f wav -i - -af "$filters" -f wav - |
    aplay
3个回答

我刚刚看到一篇与可能有用的 compand 命令相关的文章(以防万一寻求帮助的人看到这篇文章)。

来自文章:

为了测试这一点,以及我对 的理解compand,我添加了一个非常简单的过滤器,通过显着降低音量来移除音频的安静部分:

ffmpeg -i in.mp3  -filter_complex \
  "compand=attacks=0:points=-30/-900|-20/-20|0/0|20/20" \
  out.wav

Attack=0表示我想测量绝对音量,而不是在短时间内(或长时间)平均声音。当扬声器突然大喊大叫,或与麦克风外的人来回交谈时,我希望立即调整音量。缺点是您可能会听到音量被钳制。

points是实际的体积映射函数,我将逐步介绍它:

我添加了 -30/-900 的映射,这意味着原始输入轨道中低于 -30db 的音量将转换为 -900db(完全静音)。

在此处输入图像描述

第一个提到的教程https://medium.com/@jud.dagnall/dynamic-range-compression-for-audio-with-ffmpeg-and-compand-621fe2b1a892是一个很好的介绍,过滤器文档还添加了一些示例。

http://www.ffmpeg.org/ffmpeg-filters.html#toc-compand

如果您设置为近场或远场,它非常依赖于情况,但通常语音命令通常是主要范围,并且只是将背景噪声降至最低,而不会对感兴趣的语音信号产生太大影响。

因此,可能只需要一个简单的噪声门来降低低于其给定增益的低电平噪声进行归一化。

上面 2 个和 ffmpeg 过滤器链一样是很好的信息来源,但通过自己修改和测试设置,您可能会获得更好的效果。

man ffmpeg-filters中,有几个可能感兴趣的例子:

制作适合在嘈杂环境中聆听的安静和响亮段落的音乐:

compand=.3|.3:1|1:-90/-60|-60/-40|-40/-30|-20/-20:6:0:-90:0.2

另一个带有耳语和爆炸部分的音频示例:

compand=0|0:1|1:-90/-900|-70/-70|-30/-9|0/-3:6:0:0:0 

和许多其他人。