KleinML

Klein ML Website

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

Klein-TTS-X1.5-Flash-Lite performance evaluation

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
Safetensors
Model size
401k params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Datasets used to train klein-ml/Klein-TTS-X1.5-Flash-Lite