sox:在静音时分割音频但保持静音

Lug*_*axx 8 sox

我有多个存储在大型 mp3 中的有声读物。我正在尝试将这些大型 mp3 拆分为多个较小的文件。

我找到了一种工具,可以检测音频文件中的静音并根据此“分隔符”拆分音频文件。

下面是一个例子:

sox -V3 audiobook.mp3 audiobook_part_.mp3 \
silence 1 0.5 0.1% 1 0.5 0.1% : newfile : restart
Run Code Online (Sandbox Code Playgroud)

这将基本上分裂audiobook.mp3audiobook_part_001.mp3audiobook_part_002.mp3,...其中沉默> = 0.5秒。

现在的问题是,这个命令不仅会拆分文件,还会消除静音。

因此,当您在播放列表中播放新文件时,曲目/段落听起来会挤在一起。

那么你如何告诉sox只拆分文件但保持静音(在每个轨道的末尾)?

meu*_*euh 13

您可以通过一些小的更改保留拆分部分中的所有静音。从您的原始命令开始:

silence 1 0.5 0.1%   1 0.5 0.1% 
Run Code Online (Sandbox Code Playgroud)

第一个三元组值意味着在开始时消除静音(如果有),直到 0.5 秒以上的声音超过 0.1%。第二个三连音表示在 0.1% 以下有至少 0.5 秒的静音时停止。其余的命令 ,: newfile : restart然后启动一个新的输出文件,并在开始时再次开始寻找声音。所以第一个文件在静音开始时结束,第二个文件将在静音结束时开始。

可用于改进这一点的最简单选项是silence -l. 它将保留触发文件结束的 0.5 秒静音。不幸的是,任何更长的静音都将被删除,因为它是下一个文件的开始。保持更长差距的一种简单方法是结合-l更长的检测时间,例如 2 秒:

silence -l  1 0.5 0.1%   1 2.0 0.1%
Run Code Online (Sandbox Code Playgroud)

你现在只会在至少有 2 秒的沉默时分裂,但你会保留间隙的前 2 秒。为避免失去所有静音,只需在开始时移除静音检测。您需要用单个替换三元组0

silence -l  0   1 2.0 0.1%
Run Code Online (Sandbox Code Playgroud)

如果你想玩简单的声音文件来看看如何sox处理情况,你可以很容易地创建两个声音文件,一个由 1 秒的音调组成,一个由 1 秒的静音组成,然后在呈现之前根据需要将它们组合在一起结果作为silence效果的输入。例如,创建:

sox -n gap.wav   trim 0 1
sox -n tone.wav  synth 1.001t sine C5
Run Code Online (Sandbox Code Playgroud)

然后加入 gap-tone-gap-tone 并out.wav使用您的效果创建并聆听结果:

sox gap.wav tone.wav gap.wav tone.wav out.wav silence 1 0.5 0.1%
play out.wav
Run Code Online (Sandbox Code Playgroud)