获取静默时间戳

获取静默时间戳

我有一个很大的 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 的一些参考资料,其中包含示例:3772541645526996 来自创造者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 来分割此类文件,但有时会得到我不想要的分割结果。)

以下是 Audacity 手册的相关部分

相关内容