最近用了SoX库的Silence,发现官方的教程读得我是云里雾里,所以特地写一个教程学习一下。

我生成了一个60ms白噪声的音频文件,随后把其中几个部分做成静音,生成的音频如下:

SoX中的Silence的用法_linux

 

例子1.切除音频中开始的静音

sox in.wav out1.wav silence 1 0.1 1%

 above-period 参数放在silence参数之后,如果你想使用这个过滤器,首先要设置1。这个例子大致翻译为:调整静音(任何小于1%音量的声音),直到我们遇到持续时间超过0.1秒的声音。上面命令的输出是:

SoX中的Silence的用法_linux_02

我们发现该命令已经把最开始的静音剪掉了。

例子2. 忽略噪声爆发

sox in.wav out2.wav silence 1 0.3 1%

通过把duration的参数设置为0.3,我们告诉SoX在音频的最开始的时候忽略噪声爆发。

SoX中的Silence的用法_静音_03

通过调整此持续时间参数,我们可以忽略短弹出和音频点击。

例子3. 未检测到声音时停止录制

sox in.wav out3.wav silence 1 0.3 1% 1 0.3 1%

现在介绍below-period 的各个参数,跟above-period参数一样,设置为1表示使用该过滤器,上面的命令可以翻译为:

直到我们检测至少0.3秒的噪声,我们才裁剪静音。

SoX中的Silence的用法_静音_04

这个操作返回了前4秒的噪音。

例子4. 裁剪所有的静音

sox in.wav out4.wav silence 1 0.1 1% -1 0.1 1%

通过把below-period参数设置为-1,我们可以通过允许过滤器在检测到指定持续时间的噪声后,重新启动来修剪剪辑中间的静音实例。

SoX中的Silence的用法_参数设置_05

 

但是在这个例子中,不可能检测到过去的静音。

例子5. 忽略短暂的静音

sox in.wav out5.wav silence 1 0.1 1% -1 0.5 1%

和例子2相同,我们可以告诉SoX来忽略小片段的静音(在这个例子里为0.5)。

例子5. 基于静音来分割音频

sox in.wav out.wav silence 1 0.5 1% 1 5.0 1% : newfile : restart

使用SoX’s newfile pseudo-effect 允许我们基于静音的片段来切割一个音频。在这个例子中,当前检测到超过5秒的静音以后,SoX会切割,切割的结果会得到out001.wav,out002,.....

其中包括在移动到下一个效果链之前开始写入新输出文件的newfile和将移动回第一个效果链的restart,

必须将Pseudo-effects指定为链中的第一个效果和链中的唯一效果(它们必须在指定之前和之后具有:)

 

参考文献

[1]. The SoX of Silence. ​​https://digitalcardboard.com/blog/2009/08/25/the-sox-of-silence/comment-page-2/​

[2]. Stripping silence with sox. ​​https://stackoverflow.com/questions/41273701/stripping-silence-with-sox​

[3]. rec(1) - Linux man page. ​​https://linux.die.net/man/1/rec​