CtrlSpeech
Checkpoints for CtrlSpeech β expressive speech synthesis with coarse-to-fine latent control. Code, CLI and interactive demo: https://github.com/zszheng147/CtrlSpeech
CtrlSpeech is a zero-shot TTS model you can steer after generating. It exposes the pitch contour, loudness contour and phoneme boundaries of any utterance, lets you edit one of them, and resynthesises following the edit while leaving the others alone. Prosody is conditioned per phoneme token, so a single word can be stretched while the rest of the sentence keeps its timing.
Contents
| Path | Params | Prosody control | Notes |
|---|---|---|---|
control-600m/ |
692 M | pitch Β· loudness Β· duration | Default |
control-150m/ |
150 M | pitch Β· loudness Β· duration | Smaller |
base-600m/ |
689 M | β | Ablation baseline, no control |
base-150m/ |
148 M | β | Ablation baseline, no control |
svae/ |
β | β | SVAE (DAC + BigVGAN) 16 kHz codec, 40 Hz latents |
shared/campplus.onnx |
β | β | CAM++ speaker embedding |
shared/vocab.json |
β | β | Phoneme vocabulary (ARPAbet) |
Each model folder holds model.safetensors, a training-free config.yaml, and
the qwen_config.json describing the AR backbone architecture. The fine-tuned
backbone weights are inside the checkpoint; no Qwen weights are redistributed
and none are downloaded at load time.
Usage
pip install git+https://github.com/zszheng147/CtrlSpeech
from ctrlspeech import CtrlSpeech, shift_pitch_semitones
tts = CtrlSpeech.from_pretrained("control-600m") # downloads on first use
baseline = tts.from_audio("clip.wav", "the transcript of that clip")
tts.regenerate(baseline, pitch=shift_pitch_semitones(baseline.gen_f0, 5)) \
.save("higher.wav")
Duration editing and adopting your own recording require
Montreal Forced Aligner with
the english_us_arpa acoustic model and dictionary.
Control representation
Analysis runs at 100 frames/s (16 kHz, hop 160).
- Pitch β 128 mel-spaced bins; bin 0 is unvoiced.
- Loudness β 64 A-weighted dB bins, about 1.05 bins per dB.
- Duration β per-phoneme frame counts, at most 191 frames (1.91 s) per phoneme; an edited timeline is capped at 2001 frames (20 s).