如何通过检测无声部分来拆分 mp3 文件?

Dri*_*Boy 23 ffmpeg mp3 audio-recording

我有一个包含更多歌曲的大 mp3 文件。有没有办法通过检测无声部分来拆分文件?我更喜欢命令行工具(例如 ffmpeg)。

尝试:

youtube-dl --ignore-errors --format bestaudio --extract-audio --audio-format mp3 --audio-quality 160K --output "%(title)s.%(ext)s" --yes-playlist

Rin*_*ind 17

您可能无法获得现成的解决方案,但需要自己创建脚本。 pydub就是为此而制作的(它在内部使用ffmpeg或 libav)并且它有一个函数,它split_on_silence()使用一些设置调用,例如keep_silence=100.

从计算器有些引用的是例子: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
)
Run Code Online (Sandbox Code Playgroud)


llo*_*gan 14

您可以使用 手动执行此操作ffmpeg,当然,如果您愿意,也可以全部编写脚本。

获取静默时间戳

使用Silencedetect 过滤器获得静音:

ffmpeg -i input.mp3 -af silencedetect -f null -
Run Code Online (Sandbox Code Playgroud)
  • 请注意,静音的默认最小长度设置为 2 秒,但可以调整。见ffmpeg -h filter=silencedetect

  • 还有一个silenceremove 过滤器

示例输出使用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
Run Code Online (Sandbox Code Playgroud)

分裂

有几种拆分方法。

段复用器

使用段复用器进行拆分的示例:

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
Run Code Online (Sandbox Code Playgroud)
  • 您将需要删除静默段。您可以对输出文件执行Bash 循环,使用 Silencedetect 查找这些段,然后删除/移动它们(如果要编写该过程的脚本)。

  • 请注意使用-c:a copywhich 启用流复制模式,因此您的 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
Run Code Online (Sandbox Code Playgroud)

…等等。

或者在一个命令中执行:

ffmpeg -i input.mp3 -to 1.20837 -c copy output_01.mp3 -ss 1.92546 -to 3.51778 -c copy output_02.mp3
Run Code Online (Sandbox Code Playgroud)

与在 segment muxer 命令中一样,这也使用流复制。


WU-*_*ANG 8

mp3splt是一个用于分割mp3的命令,我相信 mp3splt 有一个静音检测器(以及其他检测方法)......无需重新编码。安装:

sudo apt install mp3splt
Run Code Online (Sandbox Code Playgroud)

使用静音模式 ( -s) 的用法:

mp3splt -s your.mp3
Run Code Online (Sandbox Code Playgroud)

Mp3splt 将尝试使用静音检测自动检测分割点,并将分割所有使用默认参数找到的曲目。

或者

mp3splt -s -p th=-50,nt=10 your.mp3
Run Code Online (Sandbox Code Playgroud)

传递所需的参数,以 -50 dB 的阈值分割 10 个音轨(如果太多,则更少)与最可能的静音点。