我有多本有声读物,存储在大型 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