PilotTTS / README_zh.md
yunshenlibowen's picture
Upload folder using huggingface_hub
ed4885c verified
|
Raw
History Blame Contribute Delete
9.37 kB

PilotTTS: A Disciplined Modular Recipe for Competitive Speech Synthesis

English  |  中文

📑 论文  |  🤗 HuggingFace  |  🤖 ModelScope  |  🎧 演示样例

最新动态 📝

  • [2026.05] 发布 Pilot-TTS 基础模型和指令模型权重

亮点 🔥

PilotTTS 是一个基于大语言模型(LLM)的文本到语音(TTS)系统。它采用全开源模型构建极简化架构,并在严格的数据工程实践下实现了具有竞争力的性能。

关键特性:

  • 一个由全开源算子构建的数据处理流水线: 我们设计了一个多阶段的、涵盖质量评估与增强、标注以及质量过滤能力的、且全部算子都建立在公开可用工具之上的数据处理流水线。该流水线将负责互联网音频转化为干净且富有标注信息的训练数据,在显著降低成本的同时实现高质量数据产出。
  • 内容一致性与说话人相似度情感控制: 我们的模型在 Seed-TTS 测试集上,获得了极高的说话人相似度(0.862)以及极具竞争力的内容准确性(CER 0.87%),达到业界领先水平。
  • 情感和副语言控制: 支持11 类情感(Happy、Sad、Fear、Angry、Contempt、Serious、Surprise、Blue、Concern、Disgust、Psychology)的控制合成以及4类副语言(LAUGH、BREATH、CRY、COUGH)控制合成。
  • 方言合成: 支持14种中文方言,并且支持跨方言合成,尤其擅长中文普通话到目标方言的合成。

安装 ⚙️

克隆仓库

git clone https://github.com/xxx/pilot-tts.git
cd pilot-tts

环境配置

conda create -n pilot-tts python=3.10 -y
conda activate pilot-tts
pip install -r requirements.txt

模型下载

1. Pilot-TTS 模型(我们的权重)

# ModelScope
from modelscope import snapshot_download
snapshot_download('xxx/Pilot-TTS', local_dir='pretrained_models/')

# HuggingFace
from huggingface_hub import snapshot_download
snapshot_download('xxx/Pilot-TTS', local_dir='pretrained_models/')

包含:pilot_tts.ptpilot_tts_instruct.pttokenizer/

2. 第三方开源模型

从各自的开源项目下载以下依赖:

from modelscope import snapshot_download

# Qwen3-0.6B(LLM 骨干网络)
snapshot_download('Qwen/Qwen3-0.6B', local_dir='pretrained_models/Qwen3-0.6B')

# CosyVoice3(flow-matching 声码器,包含 campplus.onnx)
snapshot_download('FunAudioLLM/Fun-CosyVoice3-0.5B-2512', local_dir='pretrained_models/CosyVoice3-0.5B')
from huggingface_hub import snapshot_download

# w2v-bert-2.0(音频特征提取器)
snapshot_download('facebook/w2v-bert-2.0', local_dir='pretrained_models/w2v-bert-2.0')

注:wav2vec2bert_stats.pt(来自 MaskGCT)已包含在 Pilot-TTS 模型包中。

最终目录结构

pretrained_models/
├── pilot_tts.pt              # 基础模型(零样本声音克隆)
├── pilot_tts_instruct.pt     # 指令模型(情感、副语言、方言)
├── Qwen3-0.6B/              # LLM 骨干网络(来自 Qwen)
├── w2v-bert-2.0/            # 音频特征提取器(来自 Meta)
├── wav2vec2bert_stats.pt    # 特征归一化统计(来自 MaskGCT)
└── CosyVoice3-0.5B/        # Flow-matching 声码器(来自 FunAudioLLM)

快速开始 📖

一键运行所有推理示例:

python demo.py

推理

Python API

from demo import load_engine, synthesize

# 零样本声音克隆(基础模型)
engine = load_engine(
    config_path="configs/infer_pilot_tts.yaml",
    checkpoint="pretrained_models/pilot_tts.pt",
)
synthesize(engine, text="你好,世界!",
           prompt_wav="assert/prompt.wav",
           output_path="output/clone.wav")

# 加载指令模型(情感、副语言、方言)
engine_instruct = load_engine(
    config_path="configs/infer_pilot_tts_instruct.yaml",
    checkpoint="pretrained_models/pilot_tts_instruct.pt",
)

# 情感合成
synthesize(engine_instruct, text="今天天气真好啊!",
           prompt_wav="assert/prompt.wav",
           emotion="happy", output_path="output/happy.wav")

# 副语言
synthesize(engine_instruct, text="这太好笑了<|LAUGH|>停不下来",
           prompt_wav="assert/prompt.wav",
           output_path="output/laugh.wav")

# 方言(河南话)
synthesize(engine_instruct, text="中不中啊,咱俩一块儿去吃胡辣汤吧",
           prompt_wav="assert/prompt.wav",
           language="zh-henan", output_path="output/henan.wav")

命令行

# 零样本声音克隆(基础模型)
python inference.py \
    --checkpoint pretrained_models/pilot_tts.pt \
    --prompt-wav assert/prompt.wav \
    --text "需要合成的目标文本" \
    --output output/zeroshot.wav

# 情感合成(指令模型)
python inference.py \
    --config configs/infer_pilot_tts_instruct.yaml \
    --checkpoint pretrained_models/pilot_tts_instruct.pt \
    --prompt-wav assert/prompt.wav \
    --text "今天天气真好啊,我们去公园玩吧!" \
    --emotion happy \
    --output output/emotion.wav

# 副语言(指令模型)
python inference.py \
    --config configs/infer_pilot_tts_instruct.yaml \
    --checkpoint pretrained_models/pilot_tts_instruct.pt \
    --prompt-wav assert/prompt.wav \
    --text "这个笑话太好笑了<|LAUGH|>我真的忍不住" \
    --output output/paralang.wav

# 方言合成(指令模型)
python inference.py \
    --config configs/infer_pilot_tts_instruct.yaml \
    --checkpoint pretrained_models/pilot_tts_instruct.pt \
    --prompt-wav assert/prompt.wav \
    --text "中不中啊,咱俩一块儿去吃胡辣汤吧" \
    --language zh-henan \
    --output output/dialect.wav

支持的控制功能

功能 用法 所需模型
声音克隆 提供参考音频 两者均可
情感 --emotion <标签> 指令模型
副语言 在文本中插入标签 指令模型
方言 --language <方言> 指令模型

情感标签:

标签 情感 标签 情感
happy 开心 sad 悲伤
angry 愤怒 surprise 惊讶
fear 恐惧 disgust 厌恶
serious 严肃 concern 关切
blue 忧郁 disdain 轻蔑
neutral 中性/平静 psychology 心理活动
unknown 不指定情感

副语言标签:

标签 说明
<|LAUGH|> 笑声
<|BREATH|> 呼吸声
<|COUGH|> 咳嗽
<|CRY|> 哭泣声
<|LAUGH_SPAN|>...<|/LAUGH_SPAN|> 包裹笑声文本

方言标签:

标签 方言 标签 方言
zh-dongbei 东北话 zh-shandong 山东话
zh-henan 河南话 zh-shan1xi 山西话
zh-minnan 闽南语 zh-gansu 甘肃话
zh-ningxia 宁夏话 zh-shanghai 上海话
zh-chongqing 重庆话 zh-hubei 湖北话
zh-hunan 湖南话 zh-jiangxi 江西话
zh-guizhou 贵州话 zh-yunnan 云南话

WebUI

启动基于 Gradio 的交互式界面:

python webui.py --port 9000

项目结构

pilot-tts/
├── configs/                     # 推理配置(按 checkpoint 区分)
├── demo.py                      # 完整示例(全部推理模式)
├── inference.py                 # 命令行推理入口
├── webui.py                     # Gradio WebUI
├── asset/                       # 示例参考音频
├── pilot_voice/                 # 核心模型代码
│   ├── engine.py                # InferenceEngine 推理流水线
│   ├── model.py                 # AR 模型(Qwen3 骨干 + 音频 token)
│   ├── sampling.py              # RAS 采样(源自 VALL-E 2)
│   ├── utils.py                 # 工具函数
│   ├── modules/                 # Conformer + Perceiver 模块
│   └── tools/                   # 音频与文本处理工具
├── third_party/
│   ├── cosyvoice/               # Flow-matching 声码器
│   └── Matcha-TTS/              # Flow matching 依赖
├── tokenizer/                   # 含特殊 token 的自定义分词器
├── pretrained_models/           # 模型权重(不在 git 中)
└── requirements.txt

致谢

许可证

Apache-2.0