今天我要和大家分享一个非常酷的 Python 工具,它叫做 Audio Slicer。这个小工具的主要功能是利用沉默检测技术来切割音频文件。在最新的 2.0 版本中,它的速度有了显著的提升(比之前的版本快了 400 倍!),并且切割逻辑也得到了改进,错误率大大降低。如果你对 1.0 版本感兴趣,可以在 GitHub 上找到旧版本的代码库。此外,还有一个带有图形用户界面的版本,让操作更加方便。
工作原理
沉默检测
Audio Slicer 使用均方根(RMS)来衡量音频的安静程度并检测沉默部分。它会计算每个帧(帧长度设置为 hop size)的 RMS 值,并将 RMS 值低于 阈值 的所有帧视为沉默帧。
音频切割
当自上次切割以来有效的(有声)部分达到 最小长度 min_length,并且检测到一段长于 最小间隔 min_interval 的沉默部分时,音频将被切割,除了沉默区域内 RMS 值最低的帧之外。较长的沉默部分可能会被删除。
使用要求
如果你打算使用 Python API,你需要安装 numpy:
代码语言:bash复制pip install numpy如果你打算使用命令行界面(CLI),你需要安装 librosa 和 soundfile:
代码语言:shell复制pip install librosa
pip install soundfile或者,你可以一次性安装所有的依赖:
代码语言:shell复制pip install -r requirements.txt使用方法
使用 Python API
代码语言:python代码运行次数:0复制import librosa # 可选。使用你喜欢的任何库来读取音频文件。
import soundfile # 可选。使用你喜欢的任何库来写入音频文件。
from slicer2 import Slicer
音频, 采样率 = librosa.load('example.wav', sr=None, mono=False) # 使用librosa加载音频文件。
slicer = Slicer(
sr=采样率,
threshold=-40,
min_length=5000,
min_interval=300,
hop_size=10,
max_sil_kept=500
)
chunks = slicer.slice(音频)
for i, 片段 in enumerate(chunks):
if 片段.shape.length > 1:
片段 = 片段.T # 如果音频是立体声的,交换轴。
soundfile.write(f'clips/example_{i}.wav', 片段, 采样率) # 使用soundfile保存切割后的音频文件。使用 CLI
你可以通过下面的命令行运行脚本:
代码语言:bash复制python slicer2.py 音频 [--out OUT] [--db_thresh DB_THRESH] [--min_length MIN_LENGTH] [--min_interval MIN_INTERVAL] [--hop_size HOP_SIZE] [--max_sil_kept MAX_SIL_KEPT]其中 音频 是指要切割的音频文件,--out 默认为音频所在的相同目录,其他选项的默认值如上文参数部分所列。
参数
- sr:输入音频的采样率。
- db_threshold:以分贝(dB)表示的 RMS 阈值。所有 RMS 值低于此阈值的区域将被视为静音。如果你的音频噪声较大,可以增加这个值。默认值为 -40。
- min_length:每个切割音频片段所需的最小长度,以毫秒为单位。默认值为 5000。
- min_interval:要被切割的沉默部分的最小长度,以毫秒为单位。如果你的音频只包含短间隙,请将此值设置得更小。这个值越小,脚本生成的切割音频片段可能越多。请注意,这个值必须小于 min_length 且大于 hop_size。默认值为 300。
- hop_size:每个 RMS 帧的长度,以毫秒为单位。增加这个值将提高切割的精度,但会减慢处理速度。默认值为 10。
- max_silence_kept:围绕切割音频保留的最大沉默长度,以毫秒为单位。根据需要调整此值。请注意,设置此值并不意味着切割后的音频中的沉默部分恰好具有给定的长度。算法将如上文所述寻找最佳切割位置。默认值为 1000。
性能
在 Intel i7 8750H CPU 上,这个脚本的速度比实时快 400 倍以上。速度可能会因你的 CPU 和磁盘而异。尽管 Slicer 是线程安全的,但由于输入/输出瓶颈,多线程似乎没有必要。


