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.pt、pilot_tts_instruct.pt 和 tokenizer/。
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
致谢
- CosyVoice — Flow-matching 与声码器
- Qwen3 — LLM 骨干网络
- Matcha-TTS — Flow matching 框架
- MaskGCT — wav2vec2bert 特征统计
许可证
Apache-2.0