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

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

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

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

这是一个例子:

sox -V3 audiobook.mp3 audiobook_part_.mp3 \
silence 1 0.5 0.1% 1 0.5 0.1% : newfile : restart

这基本上会分为audiobook.mp3, audiobook_part_001.mp3, audiobook_part_002.mp3... 其中静音 >= 0.5 秒。

现在的问题是,这个命令不仅分割文件,而且还消除了静默。

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

那么你如何告诉sox只分割文件但保持沉默(在每个曲目的末尾)?

答案1

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

silence 1 0.5 0.1%   1 0.5 0.1% 

第一个三元组值表示在开始时消除静音(如果有),直到 0.5 秒声音高于 0.1%。第二个三连音表示当静默时间至少有 0.5 秒低于 0.1% 时停止。命令的其余部分,: newfile : restart然后启动一个新的输出文件,并再次开始在开头查找声音。因此,第一个文件在静音开始时结束,第二个文件将在静音结束时开始。

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

silence -l  1 0.5 0.1%   1 2.0 0.1%

现在,只有在至少有 2 秒沉默的情况下,您才会分裂,但您将保留间隙的前 2 秒。为了避免失去所有静音,只需在开始时删除对静音的检测即可。您需要将三元组替换为单个0

silence -l  0   1 2.0 0.1%

如果您想玩简单的声音文件以了解如何sox处理情况,您可以轻松创建 2 个声音文件,一个包含 1 秒的音调,另一个包含 1 秒的静音,然后在演示之前将它们组合在一起结果作为silence效果的输入。例如,创建:

sox -n gap.wav   trim 0 1
sox -n tone.wav  synth 1.001t sine C5

然后加入间隙音间隙音并out.wav使用您的效果进行创建并聆听结果:

sox gap.wav tone.wav gap.wav tone.wav out.wav silence 1 0.5 0.1%
play out.wav

答案2

我会使用 sox pad 在每个分割文件的开头和结尾添加静音。最后,它不会是一个单一的 sox 命令一次性完成所有操作,但它更加直接,并为您提供了一些额外的控制,例如选择填充静音的长度。

这个答案关于如何使用袜垫。例如

files="*.wav"
for f in $files
do
  sox "$f" "${f%.*}-pad.wav" pad 2 3
done

相关内容