实用指南 · PIPER TTS

从录音
到语音。

准备语音数据并训练 Piper 模型的基本步骤。Kaggle 配额可能变化,长时间训练前请确认剩余额度。

01压缩包结构

为 Piper TTS 创建 LJSpeech 数据集

LJSpeech 是 Piper 期望的标准格式。每个句子是独立的 WAV 文件,在 metadata.csv 中配有转写文本。

data.zip
├── metadata.csv   # nom_du_fichier|transcription
└── wavs/
    ├── 000001.wav
    └── ...
  1. 01

    收集音频文件

    使用允许处理和分发的录音。来源可以是游戏维基、你拥有的媒体或公开数据集。

  2. 02

    按句子切分

    每个句子准备一个 WAV 文件。自动切分或对齐可以使用以下工具:

    • audiosplitter · 自动切分
    • Montreal Forced Aligner (MFA) · 强制对齐
    • faster-whisper + VAD · 转写和时间戳
    • Audacity · 小批量手动切分
  3. 03

    创建 metadata.csv

    每个文件占一行。分隔符是竖线,文件名必须与 wavs/ 中的文件完全一致。

    000001.wav|这是一个示例句子。
    000002.wav|这是另一个训练用的句子。
  4. 04

    压缩归档

    将 metadata.csv 和 wavs/ 文件夹放在归档的根目录。

    zip -r data.zip metadata.csv wavs/
  5. 05

    上传到 Hugging Face

    创建数据集仓库,例如 user/wheatley-english-ljspeech。添加 data.zip 和包含配置的 README.md:

    ---
    configs:
    - config_name: default
      data_files:
      - split: train
        path: data.zip
    ---
  6. 06

    发布到 Piper 论坛

    在数据集和训练频道创建帖子,附上 Hugging Face 链接和合适的标签。

    打开 Discord 频道 ↗
02KAGGLE · GPU

在 Kaggle 上训练语音

GPU 配额由 Kaggle 按账户分配,可能随可用性变化。长时间会话前请查看计数器。

每周 GPU 配额30 小时 · 有时更多

Kaggle 标称每周 30 小时基准,可能因需求和资源而增加。配额在周六 00:00 UTC 重置。

最长会话时间12 小时

Kaggle 文档显示 CPU 和 GPU 会话的连续上限是 12 小时。纯 CPU 笔记本不消耗 GPU 配额,但会话时间限制仍然适用。

可用加速器T4 x2

Kaggle 在 2026 年 9 月 15 日移除了 Tesla P100。笔记本中仍提供 T4 x2;训练 Piper 时选择 T4 x2,不要跟随旧的 P100 指南。

↻

中断后恢复

完整训练通常超过 12 小时的会话限制。本项目的 Piper 笔记本从 Hugging Face 检查点恢复:超时或配额用尽后,重新运行即可从最新保存的检查点继续。

长时间训练前

  • 在笔记本设置、个人资料或加速器使用页面查看剩余配额。
  • 不使用时停止 GPU 会话。
  • 使用 T4 x2;P100 在 Kaggle 上已不可用。

Kaggle 配额、加速器和界面可能变化。训练前请务必查看账户中显示的信息。

03PIPER · LOCAL TTS

使用 Piper 语音

安装 Piper,获取所选语音的两个文件,然后在本地生成 WAV。以下命令使用 Open Home Foundation 维护的版本。

  1. 01

    安装 Piper

    Piper 以 Python 包形式分发。使用 rhasspy/piper 仓库或其二进制归档的旧指南对应的是历史版本。

    python -m pip install piper-tts
    python -m piper.download_voices en_US-lessac-medium
  2. 02

    下载语音

    从目录选择语音,下载其 ONNX 模型和对应的 JSON 配置文件。将两个文件放在一起;JSON 路径是模型路径加 .json。

    voice.onnx
    voice.onnx.json
  3. 03

    生成 WAV 文件

    先从 Piper 目录下载语音,或将以下名称替换为你的 .onnx 文件路径。

    python -m piper -m ./voice.onnx -f output.wav -- "Bonjour, ceci est un test."
  4. 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
  5. 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)
  6. 06

    与 Home Assistant 配合

    Piper 通过 Wyoming 集成到 Home Assistant。在设置 → 设备和服务中添加 Piper,然后使用 Piper TTS 实体调用 tts.speak 动作。

    在 Home Assistant 中配置 Piper ↗

    与 Node-RED 配合

    某些指南提到的 node-red-contrib-piper-tts 包在公开目录中未确认。一种方法是从内置 Exec 节点调用 Piper 命令;根据你的安装调整路径和权限。

  7. 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."
04NODE.JS · TYPESCRIPT

用 pipertts 将 Piper 集成到 Node.js 项目

pipertts 在 Node.js 中暴露 Piper,支持文件写入或内存返回音频。推荐模式是 PiperNativeTTS:进程内 100% 原生推理 (ONNX + 编译的 espeak 桥),无需 Python,比包装器快约 10 倍。语音文件 (.onnx + .onnx.json) 保持独立。

  1. 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
  2. 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);
  3. 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 });
  4. 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() 提供逐句的底层访问。

  5. 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");