我有一个很大的 mp3 文件,里面有很多歌曲。有没有办法通过检测静音部分来分割文件?我更喜欢命令行工具(例如 ffmpeg)。
尝试过:
youtube-dl --ignore-errors --format bestaudio --extract-audio --audio-format mp3 --audio-quality 160K --output "%(title)s.%(ext)s" --yes-playlist
答案1
您可以使用 手动完成此操作ffmpeg
,当然,如果您愿意,也可以编写脚本。
获取静默时间戳
获得沉默silentdetect 过滤器:
ffmpeg -i input.mp3 -af silencedetect -f null -
请注意,默认的静音最小长度设置为 2 秒,但可以调整。请参阅
ffmpeg -h filter=silencedetect
。还有一个静音移除过滤器。
使用以下示例输出awk
:
$ ffmpeg -i input.mp3 -af silencedetect=d=0.5 -f null - |& awk '/silencedetect/ {print $4,$5}'
silence_start: 1.20837
silence_end: 1.92546
silence_start: 3.51778
silence_end: 4.0881
silence_start: 6.40315
silence_end: 7.7922
分裂
有几种分割方法。
段复用器
拆分示例段复用器:
ffmpeg -i input.mp3 -f segment -segment_times 1.20837,1.92546,3.51778,4.0881,6.40315,7.7922 -reset_timestamps 1 -map 0:a -c:a copy output_%03d.mp3
您需要删除静音片段。您可以执行Bash 循环在输出文件上,使用 silentdetect 找到这些段,然后如果您想编写该过程的脚本,请删除/移动它们。
注意使用
-c:a copy
哪个可以流复制模式,这样您的 MP3 就不会被重新编码,从而避免生成损失。
-ss
和-t
或-to
使用这些选项将省略静默段,但需要做更多工作来执行命令:
ffmpeg -i input.mp3 -to 1.20837 -c copy output_01.mp3
ffmpeg -i input.mp3 -ss 1.92546 -to 3.51778 -c copy output_02.mp3
…等等。
或者用一个命令执行:
ffmpeg -i input.mp3 -to 1.20837 -c copy output_01.mp3 -ss 1.92546 -to 3.51778 -c copy output_02.mp3
与段复用器命令一样,这也使用流复制。
答案2
您可能不会得到现成的解决方案,而需要自己创建脚本。
pydub是为此而制作的(它使用ffmpegsplit_on_silence()
或内部使用 libav),它具有通过一些设置调用的函数,如keep_silence=100
。
来自 stackoverflow 的一些参考资料,其中包含示例:37725416和45526996 来自创造者pydub。
从第一个链接开始有趣的部分:
# Load your audio.
song = AudioSegment.from_mp3("your_audio.mp3")
chunks = split_on_silence (
# Use the loaded audio.
song,
# Specify that a silent chunk must be at least 2 seconds or 2000 ms long.
min_silence_len = 2000,
# Consider a chunk silent if it's quieter than -16 dBFS.
# (You may want to adjust this parameter.)
silence_thresh = -16
)
答案3
mp3splt是一个用于分割 mp3 的命令,我相信 mp3splt 有一个静音检测器(以及其他检测方法)...无需重新编码。要安装:
sudo apt install mp3splt
使用静音模式 ( -s
) 时:
mp3splt -s your.mp3
Mp3splt 将尝试通过静音检测自动检测分割点,并使用默认参数分割找到的所有音轨。
或者
mp3splt -s -p th=-50,nt=10 your.mp3
传递所需参数,分割 10 条音轨(如果太多则更少),最可能的静音点在 -50 dB 的阈值处。
答案4
我知道您更喜欢命令行工具,我也不怪您。同时,如果您正在做我认为您可能正在做的事情,Audacity 是更好的选择。它可以让您以更高的精度分割文件,并且减少反复试验。
(我曾尝试使用 ffmpeg 来分割此类文件,但有时会得到我不想要的分割结果。)