mcpField
P
piper-tts-training

piper-tts-training

github.com/sammcj创意与媒体16764 次安装2 天前更新
代码仓库

关于 piper-tts-training

用于为 Piper 轻量级 ONNX 运行时训练定制语音的技能,涵盖语料准备、音频验证、训练和导出,也包括澳大利亚、新西兰及英国英语的本地化步骤。

主要功能

  1. 01准备覆盖多种音素的训练语料
  2. 02生成或录制 22050Hz 单声道音频
  3. 03使用 Whisper 验证样本
  4. 04微调或从头训练
  5. 05将模型导出为 ONNX
  6. 06本地化地区英语语音

适用场景

  1. 01构建定制 Piper TTS 语音
  2. 02核对训练音频与预期文本
  3. 03训练澳大利亚、新西兰或英国英语语音
  4. 04导出训练模型用于部署

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/sammcj/agentic-coding --skill piper-tts-training

安装后在 Claude Code 中输入/piper-tts-training确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
american_spellings.json
localisation.md
scripts/
convert_spelling.py

详细介绍

Piper TTS 语音训练

训练与 Piper 轻量级 ONNX 运行时兼容的自定义文本转语音语音。

概述

Piper 可生成快速、离线的 TTS,适用于嵌入式设备。训练包括:

  1. 语料准备(文本覆盖语音音素范围)
  2. 音频生成或录制
  3. 通过 Whisper 转录进行质量验证
  4. 基于现有检查点微调(推荐)或从头训练
  5. 导出 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-au espeak-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 语言代码和语料拼写

评论

支持 Markdown