我有多个存储在大型 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.mp3
成audiobook_part_001.mp3
,audiobook_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)