Klein-TTS-X1.5-Flash-Lite
0.40M parameters | 3 languages | 0.0066 real-time factor on a CPU | 4.28 UTMOS on unseen text
Flash Lite is the smallest model of the Klein-TTS X1.5 family: a 0.40M-parameter (400,856) generator that turns phonemes into 24 kHz speech in English, French and Italian, with 3 voices. The weights take 1.6 MB in float32. It was trained by distillation on synthetic speech, with a GAN and a WavLM feature loss, exactly like the larger models.
On 300 held-out web sentences it scores 4.28 UTMOS, 4.32 SCOREQ and a 2.86% word error rate (Whisper small). That is ahead of Kitten TTS Nano 0.8 (14M, 35 times larger) and SupraTTS 1.0 Preview (1.0M, 2.5 times larger) on UTMOS, and level with Piper (lessac medium, 15.7M) on the TTS Index. On a CPU it runs about 150 times faster than real time.
- Architecture: the same StyleTTS 2 / ISTFTNet-style generator as Flash and Pro, scaled down. A shared-weight text encoder predicts durations, then frame-level pitch and energy, then an AdaIN decoder with a harmonic source and an inverse-STFT output head writes the waveform. Most of the parameters (about 245K) are in the decoder.
- Training data: synthetic speech from the 3 release voices at speaking speeds of 0.9 / 1.0 / 1.1. The text is web text from FineWeb (English) and FineWeb-2 (French, Italian), in 1 to 3 sentence units.
- Training: log-mel L1, multi-resolution STFT, LSGAN with feature matching (multi-period and multi-resolution discriminators, from step 10,000), WavLM feature matching, duration, pitch and energy L1, and a silence term. AdamW, LR 4e-4 with cosine decay, bf16, 150,000 steps.
- This checkpoint is the final step-150,000 weights. See Benchmarks.
Model Overview
| Item | Specification |
|---|---|
| Parameters | 0.40M generator |
| Output | 24 kHz mono, 300 samples (12.5 ms) per model frame |
| Input | 178-symbol IPA phoneme vocabulary. English via misaki, French / Italian via espeak-ng |
| Languages | American English, French, Italian |
| Voices | 3 voices: Sarah, Camille, Giulia (see Voices) |
| Speed control | A speed value divides the predicted durations. Trained on 0.9 to 1.1 |
| Text encoder | 1 shared transformer block applied 4 times (d = 48, 4 heads, FFN 128, RoPE) + 3 conv layers |
| Duration predictor | 1 style-conditioned transformer block; duration = sum of 50 sigmoid gates / speed |
| Prosody | Frame-level F0 and log-energy heads, conditioned on the voice (style size 32) |
| Decoder | AdaIN residual blocks (56 channels), harmonic + noise source, upsampling 10x and 6x, iSTFT head |
| Checkpoint | Step 150,000 (final) |
| License | Apache-2.0 (see LICENSE) |
Quickstart
Transformers (no library needed)
The repository ships custom model code, so plain Transformers is enough:
from transformers import AutoModel
repo = "klein-ml/Klein-TTS-X1.5-Flash-Lite"
model = AutoModel.from_pretrained(repo, trust_remote_code=True).eval()
out = model.tts("Hello from Klein TTS. This is a very small model that speaks three languages.", voice="Sarah")
model.save_wav("hello.wav", out.waveform, out.sample_rate)
print(model.voices("en-us")) # voices per language: "en-us", "fr", "it"
The Transformers path carries its own compact English text-to-phoneme code and dictionaries (no spaCy), so only three
small packages are needed: regex, phonemizer-fork and espeakng-loader (espeak-ng handles French and Italian, and
English words that are not in the dictionary). They install themselves the first time you give the model text; set
KLEINTTS_NO_AUTO_INSTALL=1 to get the pip command instead. On 400 English test sentences this compact front-end gives
the same phonemes as the full one in 97% of the sentences, and the rest differ by the pronunciation of a single word
(typically words like "read" or "use", whose sound depends on the part of speech). Use the kleintts package below for
the exact front-end the model was trained with.
kleintts package
pip install kleintts # uses the full misaki + spaCy text front-end, the one used for training
from kleintts import KleinTTS
tts = KleinTTS.from_pretrained("klein-ml/Klein-TTS-X1.5-Flash-Lite") # a Hugging Face repo id or a local folder
out = tts.tts("Bonjour, ceci est un court test.", voice="Camille", speed=1.0, seed=0)
tts.save_wav("bonjour.wav", out.waveform, out.sample_rate)
kleintts "Ciao, questa è una prova." --voice Giulia -o ciao.wav
kleintts --list-voices
Node.js
Flash Lite also ships inside the Node.js package @kleinml/kleintts
(ONNX, CPU), so it works offline right after install (select it with the model name flash-lite):
npm install @kleinml/kleintts
npx kleintts "Hello from Klein TTS." -m flash-lite -v Sarah -o hello.wav
Options
| Argument | Meaning |
|---|---|
voice |
A voice name from the table below (not case sensitive). The text is read in the language of the voice |
voice2, mix |
Blend two voices of the same language: (1 - mix) * voice + mix * voice2. This checkpoint was not trained on blends, so treat them as experimental |
speed |
Speaking speed, 1.0 is normal. Trained on 0.9 to 1.1 |
seed |
Fixes the small random noise in the vocoder, for repeatable output |
pause |
Seconds of silence between sentence chunks, default 0.12 |
phonemes |
Skip the text front-end and pass phonemes (the model's 114-symbol IPA set) directly |
Voices
| Voice | Language | Gender |
|---|---|---|
| Sarah | American English (en-us) |
female |
| Camille | French (fr) |
female |
| Giulia | Italian (it) |
female |
model.voices() lists them, and model.voices("fr") filters by language.
Long text is split into sentence chunks (about 250 characters each) and joined. The output is 24 kHz mono.
Files
| File | Content |
|---|---|
model.safetensors |
the 0.40M-parameter generator |
config.json |
architecture, the phoneme vocabulary, the voice table and which voices are recommended |
modeling_klein_tts.py, configuration_klein_tts.py |
the Transformers remote code |
lexicon_us.json.gz, lexicon_gb.json.gz |
English pronunciation dictionaries for the Transformers path (from misaki, Apache-2.0; see NOTICE-misaki.txt) |
generate.py |
a minimal example |
onnx/ |
the generator exported to ONNX for CPU runtimes (encoder.onnx, decoder.onnx, model.json), used by the Node.js package @kleinml/kleintts |
Benchmarks
Same protocol as the other Klein-TTS X1.5 cards: UTMOS, DNSMOS OVRL and SCOREQ (1 to 5, higher is better) and WER (Whisper small, lower is better), default voice and settings, raw output. The public set is 300 English FineWeb sentences, the private set 97 unpublished English sentences.
| Benchmark | Klein-TTS X1.5-Flash-Lite | Klein-TTS X1.5-Flash | Kitten TTS Nano 0.8 | SupraTTS 1.0 Preview |
|---|---|---|---|---|
| Parameters | 0.40M | 1.70M | 14.0M | 1.03M |
| UTMOS, public | 4.28 | 4.36 | 4.05 | 3.93 |
| UTMOS, private | 4.32 | 4.39 | 4.03 | 3.94 |
| DNSMOS OVRL, public | 3.44 | 3.41 | 3.39 | 3.44 |
| DNSMOS OVRL, private | 3.42 | 3.41 | 3.40 | 3.44 |
| SCOREQ, public | 4.32 | 4.42 | 4.34 | 3.98 |
| SCOREQ, private | 4.37 | 4.46 | 4.32 | 4.02 |
| WER, public | 2.86% | 2.36% | 2.11% | 2.55% |
| WER, private | 0.67% | 0.18% | 0.36% | 0.24% |
| Quality score (weighted) | 80.3 | 83.1 | 80.4 | 77.8 |
| TTS Index (Elo) | 1013 | 1113 | 820 | 774 |
| RTF, GPU | 0.0016 | 0.0018 | n/a | n/a |
| RTF, CPU | 0.0066 | 0.013 | 0.035 | 0.0040 |
The TTS Index is the Klein ML leaderboard's anchored Elo (Piper lessac medium = 1000); see the Flash or Pro card for how it is computed. Speed is measured as on the other cards (Klein: generator only; Kitten end to end through its ONNX runtime; SupraTTS model time on the CPU).
Reading these numbers. The quality scores are predictions of listener opinion, so treat gaps of a few hundredths as ties. Flash Lite's word error rate is its weak point: it is the highest of the four models here, so expect an occasional slurred or swallowed word. Only English was benchmarked.
Checkpoint choice. On 150 held-out sentences UTMOS / SCOREQ rose to 4.27 / 4.27 at step 120,000 and then levelled off (4.28 / 4.32 at 130,000, 4.28 / 4.31 at 150,000), so the final weights are used.
Limitations
- Pronunciation is less exact than Flash's. Its word error rate is the highest in the family.
- Three voices, one per language, all female. No British English and no Spanish.
- Expressiveness is limited to the voice and speed; there is no emotion or style control.
- Long inputs are split into sentence chunks automatically. Training clips were at most 30 seconds.
Data Attribution
- Text: FineWeb and FineWeb-2 (HuggingFaceFW), licensed under ODC-By 1.0 and subject to CommonCrawl's Terms of Use.
- English pronunciation dictionaries and the compact English text-to-phoneme code in the Transformers path are adapted from
misaki (Apache-2.0); the license text is included as
NOTICE-misaki.txt.
Citation
@techreport{klein-tts-x1.5,
title = {Klein-TTS X1.5: small multilingual text-to-speech models},
author = {Klein ML},
year = {2026},
month = {October},
url = {https://kleinml.com}
}
- Downloads last month
- 32