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

FeatureUsageModel
Voice CloningProvide prompt audioBoth
Emotions--emotion <tag>Instruct
ParalanguageInsert tags in textInstruct
Dialects--language <dialect>Instruct

Emotions:

TagꃅꄟTagꃅꄟ
happyå¼€åæƒsad悲伤
angryꄤꀒsurprise惊讶
fearꁐꃧdisguståŽŒę¶
seriousäø„č‚ƒconcern关切
blue忧郁disdain轻蔑
neutral中性/平静psychologyåæƒē†ę“»åŠØ
unknownäøęŒ‡å®šęƒ…ę„Ÿ

Paralanguage tags:

TagDescription
<|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