关于 piper-tts-training
用于为 Piper 轻量级 ONNX 运行时训练定制语音的技能,涵盖语料准备、音频验证、训练和导出,也包括澳大利亚、新西兰及英国英语的本地化步骤。
主要功能
- 01准备覆盖多种音素的训练语料
- 02生成或录制 22050Hz 单声道音频
- 03使用 Whisper 验证样本
- 04微调或从头训练
- 05将模型导出为 ONNX
- 06本地化地区英语语音
适用场景
- 01构建定制 Piper TTS 语音
- 02核对训练音频与预期文本
- 03训练澳大利亚、新西兰或英国英语语音
- 04导出训练模型用于部署
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ sammcj/ agentic-coding --skill piper-tts-training安装后在 Claude Code 中输入/piper-tts-training确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/american_spellings.jsonlocalisation.mdscripts/convert_spelling.py详细介绍
Piper TTS 语音训练
训练与 Piper 轻量级 ONNX 运行时兼容的自定义文本转语音语音。
概述
Piper 可生成快速、离线的 TTS,适用于嵌入式设备。训练包括:
- 语料准备(文本覆盖语音音素范围)
- 音频生成或录制
- 通过 Whisper 转录进行质量验证
- 基于现有检查点微调(推荐)或从头训练
- 导出 ONNX 以供部署
微调与从头训练:
- 微调:约 1,300 条短句 + 1,000 个训练轮次(使用中等配置的 GPU 需要数天)
- 从头训练:约 13,000 条以上短句 + 2,000 个以上训练轮次(需要数周或数月)
工作流
1. 语料准备
收集 1,300-1,500 条以上短句,覆盖广泛的语音音素范围:
- 使用 piper-recording-studio 语料作为基础
- 添加适用于你的使用场景的领域专用短句
- 包含不同结构和长度的句子
非美式英语的重要事项: 确保语料使用正确的地区拼写。参见本地化。
2. 音频生成
生成或录制采样率为 22050Hz 的单声道 WAV 训练音频。
如果使用语音克隆(例如 Chatterbox TTS):
- 以源采样率生成(通常为 24kHz)
- 转换为 22050Hz:
sox -v 0.95 input.wav -r 22050 -t wav output.wav -v 0.95可防止重采样期间发生削波
录音要求:
- 麦克风位置和室内声学环境保持一致
- 尽量减少背景噪音
- 采用自然的语速(不要像朗读一样)
3. 使用 Whisper 进行质量验证
自动执行质量检查,而不是手动收听:
import whisper
from piper_phonemize import phonemize_text
model = whisper.load_model("base")
def validate_sample(audio_path, expected_text):
result = model.transcribe(audio_path)
transcribed = result["text"].strip()
# Compare phonemically to handle spelling/punctuation differences
expected_phonemes = phonemize_text(expected_text, "en-gb")
transcribed_phonemes = phonemize_text(transcribed, "en-gb")
return expected_phonemes == transcribed_phonemes
对失败的样本最多重试 3 次。目标是覆盖数据集的 95% 以上。
4. 数据集格式(LJSpeech)
按以下结构整理数据集:
dataset/
├── metadata.csv
└── wavs/
├── sample_0001.wav
├── sample_0002.wav
└── ...
metadata.csv 格式: {id}|{text}(以竖线分隔,无标题行)
sample_0001|The quick brown fox jumps over the lazy dog.
sample_0002|Pack my box with five dozen liquor jugs.
5. 预处理
转换为 PyTorch 张量:
python3 -m piper_train.preprocess \
--language en-gb \
--input-dir dataset/ \
--output-dir piper_training_dir/ \
--dataset-format ljspeech
澳大利亚、新西兰和英国口音使用 en-gb(espeak-ng 音素集)。
6. 训练
微调(推荐):
python3 -m piper_train \
--dataset-dir piper_training_dir/ \
--accelerator gpu \
--devices 1 \
--batch-size 12 \
--max_epochs 3000 \
--resume_from_checkpoint ljspeech-2000.ckpt \
--checkpoint-epochs 100 \
--quality high \
--precision 32
关键参数:
--batch-size:如果 VRAM 有限,请调低(8GB 显存可使用 12)--resume_from_checkpoint:从高质量的 LJSpeech 检查点开始--precision 32:比混合精度更稳定--validation-split 0.0 --num-test-examples 0:小型数据集可跳过验证
使用 TensorBoard 监控:观察 loss_disc_all 是否收敛。
7. 导出 ONNX
python3 -m piper_train.export_onnx checkpoint.ckpt output.onnx.unoptimized
onnxsim output.onnx.unoptimized output.onnx
根据训练用的 config.json 创建元数据文件 output.onnx.json。
澳大利亚、新西兰和英国英语的本地化
Piper 使用 espeak-ng 进行音素转换。训练数据中的美式发音会导致口音偏移。
语料准备:
- 训练前对语料文本运行
scripts/convert_spelling.py - 使用
en-gb或en-auespeak-ng 语音进行音素转换 - 检查生成的音素中是否有美式英语特征
常见拼写转换:
| 美式拼写 | 澳大利亚/英国拼写 |
|---|---|
| -ize | -ise |
| -or | -our |
| -er | -re |
| -og | -ogue |
| -ense | -ence |
音素注意事项:
- /r/ 连读和插入模式有所不同
- "dance"、"bath"、"castle" 等单词中的元音发音
- 词尾 -ile 的发音(hostile、missile)
完整的单词列表和语音细节,请参见 references/localisation.md。
验证: 使用 Whisper 并设置 language="en",确认转录结果符合预期的地区表达。
依赖项
固定版本以避免 API 变更导致的问题:
pytorch-lightning==1.9.3
torch<2.6.0
piper-phonemize
onnxruntime-gpu
onnxsim
建议使用 Docker 容器化以确保可复现性。
硬件要求
最低配置(微调):
- 8GB VRAM GPU(Pascal 或更新架构)
- 8GB 系统 RAM
- 使用 Tesla P4 训练 1,000 个轮次约需 5 天
从头训练: 耗时约为上述情况的 200 倍。
故障排除
| 问题 | 解决方案 |
|---|---|
| CUDA OOM | 调低 batch-size(尝试 8 或 4) |
| 无法加载检查点 | 检查 pytorch-lightning 版本是否与检查点匹配 |
| 输出杂乱 | 训练轮次不足或数据集太小 |
| 口音错误 | 检查 espeak-ng 语言代码和语料拼写 |