如何使用 SoX 或 ffmpeg 提取声音文件的包络

如何使用 SoX 或 ffmpeg 提取声音文件的包络

我需要取出信封来自 Wav 声音文件。

有没有办法使用 SoX 或 ffmpeg 从命令行实现这一点?

答案1

这可以用 SoX 来近似。包络检测器基本上需要对信号进行整流(即取每个样本的绝对值,“折叠”信号的负向侧,使其变为正向),然后在其上运行非常剧烈的低通滤波器,提取接近原始信号幅度包络的低频正向信号。

主要的障碍是 SoX 没有给我们提供一种简单的方法来执行纠正步骤。我将介绍几种解决这个问题的方法。

首先,我们不用对信号进行整流,而是通过dcshift两次应用滤波器来丢弃信号的负向部分。这种方法并不完美,但可以为大多数音频输入提供足够准确的输出。

sox $infile out.wav dcshift -1 dcshift +1 lowpass 20

(您将会看到类似的内容sox WARN dcshift: dcshift clipped 123987 samples; decrease volume?,但是剪辑样本正是我们想要它做的事情。)

我们可以使用的第二个技巧是构建平方律检测器(也称为乘积检测器)而不是整流包络检测器。对于这种检测器,检测到的包络和输入信号之间的关系是不同的,因此您必须确认哪种方式更适合您。在平方律检测器中,输入信号与自身相乘而不是整流,我们可以通过 SoX 通过使用 指定相同的输入两次来实现这一点--combine multiply

sox --combine multiply $infile $infile out.wav lowpass 20

无论哪种情况,您都可以进行调整20以控制低通的截止频率,并控制检测到的包络跟踪输入的紧密程度/保留多少高频内容。

如果您想要将信封可视化,使用 ffmpeg 很容易就能做到,例如:

ffmpeg -i out.wav -filter_complex "showwavespic=s=640x120" -frames:v 1 out.png

有趣的是,这个 ffmpeg 可视化似乎将信号显示为以 0 为中心的双极信号,尽管它现在实际上是 0..+1 范围内的单极信号。我认为 ffmpeg 在处理此视觉效果时会默默地删除任何 DC 偏移。

相关内容