给语音训练录音切片时,可以先用 librosa.effects.split 找非静音区间,再导出片段并保存原始时间位置。它按能量判断,不自动识别一句话、说话人或语义;环境噪声也可能被保留为非静音。
固定采样率与原始录音
本例按 librosa 0.11 文档使用,安装 librosa、soundfile 和 numpy,输入是获授权的 speech.wav。读取时设 sr=None 保留文件采样率,mono=True 转成单通道;多通道场景要先确定是否允许混合,不能默默丢掉独立说话人通道。

python -m pip install "librosa==0.11.0" soundfile numpy
按样本区间导出切片与索引
import json
from pathlib import Path
import numpy as np
import librosa
import soundfile as sf
y, sr = librosa.load("speech.wav", sr=None, mono=True)
if y.size == 0 or np.max(np.abs(y)) < 1e-8:
raise ValueError("录音为空或近乎全静音,先核对输入")
intervals = librosa.effects.split(y, top_db=30)
out = Path("speech_segments")
out.mkdir(exist_ok=True)
rows = []
for i, (start, end) in enumerate(intervals):
start, end = int(start), int(end)
assert 0 <= start < end <= len(y)
file = out / f"segment_{i:03d}.wav"
sf.write(file, y[start:end], sr, subtype="PCM_16")
rows.append({"file": str(file), "source": "speech.wav", "sample_rate": sr,
"start_sample": start, "end_sample": end,
"start_seconds": start/sr, "end_seconds": end/sr})
with (out / "segments.json").open("w", encoding="utf-8") as f:
json.dump(rows, f, ensure_ascii=False, indent=2)
print("切片数", len(rows), "原录音秒数", len(y)/sr)
保存为 split_audio.py,运行 python split_audio.py。top_db=30 使用相对峰值的分贝阈值,是试验起点;增大数值通常保留更低能量部分,不是“过滤更严格”。
听回原录音,检查弱语音是否漏掉
验证时根据 segments.json 的起止秒数回听原录音,再听每个切片,检查首尾音节、轻声和长停顿。区间以样本计,时间需要除以实际采样率;不能把样本编号直接当毫秒。
基于帧的能量检测不保证精确到语音音素边界。输出 WAV 使用 PCM_16,量化会影响数值,不能要求读回的浮点数组与原数组逐元素完全相等;应核对采样率、样本数与可听内容。
怎样继续制作训练片段
下一步对保留的区间增加经人工确认的上下文或边界余量,再按实际模型的片长限制二次分段,并始终保留原始样本位置。字幕或标签时间也要按切片起点平移,不能把原录音时间直接套进小文件。
本文未在真实语音训练集上测过切片质量。全静音、持续背景声、音量差异和长段连续讲话会影响结果;要分说话人或按语音活动判断时,应另选相应模型,并与此能量方案做样本对照。
资料与适用版本
以下官方资料核对于 2026 年 10 月 1 日;安装和界面以实际使用版本为准。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30707.html