Kaggle 标称每周 30 小时基准,可能因需求和资源而增加。配额在周六 00:00 UTC 重置。
实用指南 · PIPER TTS
从录音
到语音。
准备语音数据并训练 Piper 模型的基本步骤。Kaggle 配额可能变化,长时间训练前请确认剩余额度。
为 Piper TTS 创建 LJSpeech 数据集
LJSpeech 是 Piper 期望的标准格式。每个句子是独立的 WAV 文件,在 metadata.csv 中配有转写文本。
data.zip
├── metadata.csv # nom_du_fichier|transcription
└── wavs/
├── 000001.wav
└── ...- 01
- 02
按句子切分
每个句子准备一个 WAV 文件。自动切分或对齐可以使用以下工具:
- audiosplitter · 自动切分
- Montreal Forced Aligner (MFA) · 强制对齐
- faster-whisper + VAD · 转写和时间戳
- Audacity · 小批量手动切分
- 03
创建 metadata.csv
每个文件占一行。分隔符是竖线,文件名必须与 wavs/ 中的文件完全一致。
000001.wav|这是一个示例句子。 000002.wav|这是另一个训练用的句子。 - 04
压缩归档
将 metadata.csv 和 wavs/ 文件夹放在归档的根目录。
zip -r data.zip metadata.csv wavs/ - 05
上传到 Hugging Face
创建数据集仓库,例如 user/wheatley-english-ljspeech。添加 data.zip 和包含配置的 README.md:
--- configs: - config_name: default data_files: - split: train path: data.zip --- - 06
在 Kaggle 上训练语音
GPU 配额由 Kaggle 按账户分配,可能随可用性变化。长时间会话前请查看计数器。
Kaggle 文档显示 CPU 和 GPU 会话的连续上限是 12 小时。纯 CPU 笔记本不消耗 GPU 配额,但会话时间限制仍然适用。
Kaggle 在 2026 年 9 月 15 日移除了 Tesla P100。笔记本中仍提供 T4 x2;训练 Piper 时选择 T4 x2,不要跟随旧的 P100 指南。
中断后恢复
完整训练通常超过 12 小时的会话限制。本项目的 Piper 笔记本从 Hugging Face 检查点恢复:超时或配额用尽后,重新运行即可从最新保存的检查点继续。
长时间训练前
- 在笔记本设置、个人资料或加速器使用页面查看剩余配额。
- 不使用时停止 GPU 会话。
- 使用 T4 x2;P100 在 Kaggle 上已不可用。
Kaggle 配额、加速器和界面可能变化。训练前请务必查看账户中显示的信息。
使用 Piper 语音
安装 Piper,获取所选语音的两个文件,然后在本地生成 WAV。以下命令使用 Open Home Foundation 维护的版本。
- 01
安装 Piper
Piper 以 Python 包形式分发。使用 rhasspy/piper 仓库或其二进制归档的旧指南对应的是历史版本。
python -m pip install piper-ttspython -m piper.download_voices en_US-lessac-medium - 02
下载语音
从目录选择语音,下载其 ONNX 模型和对应的 JSON 配置文件。将两个文件放在一起;JSON 路径是模型路径加 .json。
voice.onnx
voice.onnx.json - 03
生成 WAV 文件
先从 Piper 目录下载语音,或将以下名称替换为你的 .onnx 文件路径。
python -m piper -m ./voice.onnx -f output.wav -- "Bonjour, ceci est un test." - 04
从文件读取文本
python -m piper -m ./voice.onnx -f output.wav --input-file mon_texte.txt直接输出原始音频
采样率取决于语音。检查 voice.onnx.json,必要时替换 22050。
echo "Bonjour." | python -m piper -m ./voice.onnx --output-raw | aplay -r 22050 -f S16_LE -c 1 -t raw - 05
从 Python 使用
import wave from piper import PiperVoice voice = PiperVoice.load("./voice.onnx") with wave.open("output.wav", "wb") as wav_file: voice.synthesize_wav("Bonjour le monde.", wav_file) - 06
与 Home Assistant 配合
Piper 通过 Wyoming 集成到 Home Assistant。在设置 → 设备和服务中添加 Piper,然后使用 Piper TTS 实体调用 tts.speak 动作。
在 Home Assistant 中配置 Piper ↗与 Node-RED 配合
某些指南提到的 node-red-contrib-piper-tts 包在公开目录中未确认。一种方法是从内置 Exec 节点调用 Piper 命令;根据你的安装调整路径和权限。
- 07
调整输出
质量取决于训练数据和所选语音。较高的 length-scale 值会减慢语速;较低的值会加快。noise-scale 和 noise-w 修改生成的变化。
python -m piper -m ./voice.onnx --length-scale 1.5 --noise-scale 0.667 --noise-w 0.8 -f lent.wav -- "Texte lent." python -m piper -m ./voice.onnx --length-scale 0.7 --noise-scale 0.667 --noise-w 0.8 -f rapide.wav -- "Texte rapide."
用 pipertts 将 Piper 集成到 Node.js 项目
pipertts 在 Node.js 中暴露 Piper,支持文件写入或内存返回音频。推荐模式是 PiperNativeTTS:进程内 100% 原生推理 (ONNX + 编译的 espeak 桥),无需 Python,比包装器快约 10 倍。语音文件 (.onnx + .onnx.json) 保持独立。
- 01
安装依赖
文档要求 Node.js 18+ 和 TypeScript 5+。原生模式无需其他依赖,执行 npm install 即可。传统包装器模式 (PiperTTS 通过 python3 -m piper) 还需要 Python 和 Piper 模块。通过目录 ID 选择可以将模型和配置下载到 models/。
npm install pipertts # mode wrapper uniquement : python3 -m pip install piper-tts - 02
从目录语音开始
import { PiperNativeTTS, resolveModelPathFromOptions } from "pipertts"; import * as fs from "node:fs"; const modelPath = await resolveModelPathFromOptions({ model: "en_US-lessac-medium", modelsDir: "./models", }); const tts = await PiperNativeTTS.load({ modelPath }); const { audio } = await tts.synthesize("Hello from Piper."); fs.writeFileSync("./hello.wav", audio); - 03
使用本地模型
对于手动下载的语音,传递 ONNX 文件路径。对应的 .onnx.json 文件应放在旁边;如果位置不同,可以指定 configPath。
import { PiperNativeTTS } from "pipertts"; const tts = await PiperNativeTTS.load({ modelPath: "./models/my-voice.onnx", }); const { audio, sampleRate } = await tts.synthesize("Hello.", { speakerId: 0 }); - 04
API 和格式
synthesize() 返回 audio (Buffer)、sampleRate 和 text;outputFile 还写入磁盘。选项:speakerId (多语音和多风格)、lengthScale (> 1 减慢,< 1 加快)、noiseScale、noiseWScale、sentenceSilence、normalizeAudio、volume 和 outputFormat (wav、raw、mp3、ogg 或 opus)。mp3 和 opus 有纯 JS 实现;ogg 需要 FFmpeg。phonemize() 和 synthesizeChunks() 提供逐句的底层访问。
- 05
传统包装器 (PiperTTS)
PiperTTS 启动 python3 -m piper,每次合成一个进程;慢约 10 倍,仅适用于原生引擎无法运行的环境。需要 Python 和 Piper 模块。
import { PiperTTS } from "pipertts"; const tts = await PiperTTS.create({ modelPath: "./models/en_US-lessac-medium.onnx", }); await tts.synthesizeToFile("Hello from the legacy wrapper.", "./hello.wav");
