今天我要和大家分享一个非常酷的 Python 工具,它叫做 Audio Slicer。这个小工具的主要功能是利用沉默检测技术来切割音频文件。在最新的 2.0 版本中,它的速度有了显著的提升(比之前的版本快了 400 倍!),并且切割逻辑也得到了改进,错误率大大降低。如果你对 1.0 版本感兴趣,可以在 GitHub 上找到旧版本的代码库。此外,还有一个带有图形用户界面的版本,让操作更加方便。
Audio Slicer 使用均方根(RMS)来衡量音频的安静程度并检测沉默部分。它会计算每个帧(帧长度设置为 hop size
)的 RMS 值,并将 RMS 值低于 阈值
的所有帧视为沉默帧。
当自上次切割以来有效的(有声)部分达到 最小长度 min_length
,并且检测到一段长于 最小间隔 min_interval
的沉默部分时,音频将被切割,除了沉默区域内 RMS 值最低的帧之外。较长的沉默部分可能会被删除。
如果你打算使用 Python API,你需要安装 numpy:
pip install numpy
如果你打算使用命令行界面(CLI),你需要安装 librosa 和 soundfile:
pip install librosa
pip install soundfile
或者,你可以一次性安装所有的依赖:
pip install -r requirements.txt
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保存切割后的音频文件。
你可以通过下面的命令行运行脚本:
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
默认为音频所在的相同目录,其他选项的默认值如上文参数部分所列。
在 Intel i7 8750H CPU 上,这个脚本的速度比实时快 400 倍以上。速度可能会因你的 CPU 和磁盘而异。尽管 Slicer
是线程安全的,但由于输入/输出瓶颈,多线程似乎没有必要。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。