PilotTTS: A Disciplined Modular Recipe for Competitive Speech Synthesis
June 1, 2026 Ā· View on GitHub
English Ā |Ā äøę
š Paper Ā |Ā š¤ HuggingFace Ā |Ā š¤ ModelScope Ā |Ā š§ Demos
News š
- [Coming Soon] Expanding support for 14+ dialects, with model weights to be released soon
- [2026.05] Release Pilot-TTS base and instruct model weights
Highlight š„
PilotTTS is an LLM-based text-to-speech (TTS) system that builds an intentionally simplified architecture with fully open-source components and achieves competitive performance through rigorous data engineering.
Key Features
- A fully open-source data processing pipeline: We design a multi-stage pipeline that incorporates quality assessment and enhancement, annotation, and quality filtering, where all operators are implemented using publicly available tools. This pipeline converts large-scale Internet audio into clean training data with rich annotation, achieving high-quality data generation while substantially reducing costs.
- Content Consistency and Speaker Similarity Control: On the Seed-TTS test set, our model achieves state-of-the-art speaker similarity (0.862) and highly competitive content accuracy (CER 0.87%).
- Emotion and Paralinguistic Control: Supports controllable synthesis for 11 emotion categories (Happy, Sad, Fear, Angry, Contempt, Serious, Surprise, Blue, Concern, Disgust, Psychology) and 4 paralinguistic categories (LAUGH, BREATH, CRY, COUGH).
- Dialect Control: Supports 14 Chinese dialects and enables cross-dialect synthesis, with particular strength in synthesizing from Mandarin Chinese to the target dialect.
Installation āļø
Clone and install
git clone https://github.com/xxx/pilot-tts.git
cd pilot-tts
Environment setup
conda create -n pilot-tts python=3.10 -y
conda activate pilot-tts
pip install -r requirements.txt
Model download
1. Pilot-TTS models (our weights)
# ModelScope
from modelscope import snapshot_download
snapshot_download('AmapVoice/PilotTTS', local_dir='pretrained_models/')
# HuggingFace
from huggingface_hub import snapshot_download
snapshot_download('AmapVoice/PilotTTS', local_dir='pretrained_models/')
This includes: pilot_tts.pt, pilot_tts_instruct.pt, and tokenizer/.
2. Third-party open-source models
Download the following dependencies from their respective open-source projects:
```python
from huggingface_hub import snapshot_download
# w2v-bert-2.0 (audio feature extractor)
snapshot_download('facebook/w2v-bert-2.0', local_dir='pretrained_models/w2v-bert-2.0')
Note:
wav2vec2bert_stats.pt(from MaskGCT) is included in the Pilot-TTS model package.
Final directory structure
pretrained_models/
āāā pilot_tts.pt # Base model (zero-shot voice cloning)
āāā pilot_tts_instruct.pt # Instruct model (emotion, paralanguage, dialect)
āāā Qwen3-0.6B/ # LLM backbone (from Qwen)
āāā w2v-bert-2.0/ # Audio feature extractor (from Meta)
āāā wav2vec2bert_stats.pt # Feature normalization stats (from MaskGCT)
āāā CosyVoice3-0.5B/ # Flow-matching vocoder (from FunAudioLLM)
Quick Start š
Run all inference demos with a single command:
python demo.py
Inference
Python API
from demo import load_engine, synthesize
# Zero-shot voice cloning (base model)
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")
# Load instruct model (emotion, paralanguage, dialect)
engine_instruct = load_engine(
config_path="configs/infer_pilot_tts_instruct.yaml",
checkpoint="pretrained_models/pilot_tts_instruct.pt",
)
# Emotion synthesis
synthesize(engine_instruct, text="ä»å¤©å¤©ę°ē儽åļ¼",
prompt_wav="assert/prompt.wav",
emotion="happy", output_path="output/happy.wav")
# Paralanguage
synthesize(engine_instruct, text="čæå¤Ŗå„½ē¬äŗ<|LAUGH|>åäøäøę„",
prompt_wav="assert/prompt.wav",
output_path="output/laugh.wav")
# Dialect (Henan)
synthesize(engine_instruct, text="äøäøäøåļ¼å±äæ©äøååæå»åč”辣汤å§",
prompt_wav="assert/prompt.wav",
language="zh-henan", output_path="output/henan.wav")
Command Line
# Zero-shot voice cloning (base model)
python inference.py \
--checkpoint pretrained_models/pilot_tts.pt \
--prompt-wav assert/prompt.wav \
--text "éč¦åęēē®ę ęę¬" \
--output output/zeroshot.wav
# Emotion synthesis (instruct model)
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
# Paralanguage (instruct model)
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
# Dialect synthesis (instruct model)
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
Supported Controls
| Feature | Usage | Model |
|---|---|---|
| Voice Cloning | Provide prompt audio | Both |
| Emotions | --emotion <tag> | Instruct |
| Paralanguage | Insert tags in text | Instruct |
| Dialects | --language <dialect> | Instruct |
Emotions:
| Tag | ę ę | Tag | ę ę |
|---|---|---|---|
happy | å¼åæ | sad | ę²ä¼¤ |
angry | ę¤ę | surprise | ęč®¶ |
fear | ęę§ | disgust | åę¶ |
serious | äø„č | concern | å ³å |
blue | åæ§é | disdain | č½»č |
neutral | äøę§/å¹³é | psychology | åæēę“»åØ |
unknown | äøęå®ę ę |
Paralanguage tags:
| Tag | Description |
|---|---|
<|LAUGH|> | ē¬å£° |
<|BREATH|> | å¼åøå£° |
<|COUGH|> | å³å½ |
<|CRY|> | å泣声 |
<|LAUGH_SPAN|>...<|/LAUGH_SPAN|> | å 裹ē¬å£°ęę¬ |
Dialects:
| Tag | ę¹čØ | Tag | ę¹čØ |
|---|---|---|---|
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
Launch a Gradio-based interactive interface:
python webui.py --port 9000
Project Structure
pilot-tts/
āāā configs/ # Inference configurations (per checkpoint)
āāā demo.py # Complete demo (all inference modes)
āāā inference.py # CLI inference entry
āāā webui.py # Gradio WebUI
āāā asset/ # Example prompt audio
āāā pilot_voice/ # Core model code
ā āāā engine.py # InferenceEngine pipeline
ā āāā model.py # AR model (Qwen3 backbone + audio tokens)
ā āāā sampling.py # RAS sampling (from VALL-E 2)
ā āāā utils.py # Utilities
ā āāā modules/ # Conformer + Perceiver modules
ā āāā tools/ # Audio & text processing
āāā third_party/
ā āāā cosyvoice/ # Flow-matching vocoder
ā āāā Matcha-TTS/ # Flow matching dependency
āāā tokenizer/ # Custom tokenizer with special tokens
āāā pretrained_models/ # Model weights (not in git)
āāā requirements.txt
Acknowledgements
- CosyVoice ā Flow-matching & Vocoder
- Qwen3 ā LLM backbone
- Matcha-TTS ā Flow matching framework
- MaskGCT ā wav2vec2bert feature statistics
Citation
@article{pilottts2026,
title={PilotTTS: A Disciplined Modular Recipe for Competitive Speech Synthesis},
author={Bowen Li and Shaotong Guo and Zhen Wang and Yang Xiang and Mingli Jin and Yihang Lin and Jiahui Zhao and Weibo Xiong and Dongrui Li and Keming Chen and Yunze Gao and Yuze Zhou and Zeyang Lin and Yue Liu},
year={2026},
journal={arXiv preprint arXiv:2605.27258}
}
License
Apache-2.0