Introduction

A new on-device TTS family just dropped under a clean open license. Klein ML (klein-ml on Hugging Face) released Klein TTS X1.5 on November 3, 2026 (UTC) — three Apache-2.0 generators that turn IPA phonemes into 24 kHz speech, with Transformers custom code, ONNX encoder/decoder graphs, and a kleintts CLI path.

This is Klein ML, not Black Forest Labs’ FLUX.2 Klein image stack. Primary card: klein-ml/Klein-TTS-X1.5-Pro. Same-hour siblings: Flash and Flash-Lite. Vendor launch:

What Shipped

  • Vendor / family: Klein ML — Klein TTS X1.5 (Flash-Lite, Flash, Pro).
  • Modality: open-weights text-to-speech; StyleTTS 2 / ISTFTNet-style generator (shared text encoder → duration / pitch / energy → AdaIN iSTFT decoder).
  • Pro (lead card): 13.12M params; model.safetensors ~52.5 MB; EN / ES / FR / IT; 17 blendable voices; card claims GPU RTF 0.002, 4.44 UTMOS, 2.51% WER (Whisper small) on 300 held-out web sentences.
  • Flash: 1.7M params; weights ~6.8 MB; EN / FR / IT; 5 voices; card claims CPU RTF 0.013, 4.36 UTMOS, 2.36% WER.
  • Flash-Lite: 0.40M params; weights ~1.6 MB; EN / FR / IT; 3 voices; card claims CPU RTF 0.0066, 4.28 UTMOS, 2.86% WER.
  • Audio: 24 kHz mono; 300 samples (12.5 ms) per model frame.
  • Extras on each card: generate.py, custom modeling_klein_tts.py, onnx/encoder.onnx + onnx/decoder.onnx, US/GB lexicons.
  • License: Apache-2.0 (ungated).

Author-reported benches put Pro near Gradium’s 31M Phonon on UTMOS at ~42% of that size, ahead of Kitten TTS Nano 0.8 (14M) on several scores, with Kokoro 82M still higher on UTMOS/SCOREQ. Listen before you ship — these are card numbers, not our own sweep.

How to Run It

Transformers path (Pro example — needs trust_remote_code=True):

from transformers import AutoModel

repo = "klein-ml/Klein-TTS-X1.5-Pro"
model = AutoModel.from_pretrained(repo, trust_remote_code=True).eval()

out = model.tts(
    "Hello from Klein TTS. This is a small model that speaks four languages.",
    voice="Sarah",
)
model.save_wav("hello.wav", out.waveform, out.sample_rate)
print(model.voices("en-us"))

Or install the training-matched front-end:

pip install kleintts
kleintts "Bonjour, ceci est un court test." --voice Camille -o bonjour.wav
kleintts --list-voices

Swap the repo id for Flash or Flash-Lite when you want the smaller footprints. English phonemization can use the card’s compact Misaki path; Spanish / French / Italian go through espeak-ng (auto-install helpers unless you set KLEINTTS_NO_AUTO_INSTALL=1).

Pro Tip

Start with Pro + a language-matched voice (Sarah / Camille / Giulia / Lucia) at speed 1.0, then drop to Flash or Flash-Lite only after you like the timbre — the tiny models trade languages and voice count, not just megabytes. Prefer kleintts when you need the exact Misaki+spaCy front-end the weights were trained with.

Where It Fits

If you want Apache-2.0, CPU-friendly, multilingual speech without an API key, X1.5 is the clearest same-day open drop in this scout window: three sizes, real safetensors + ONNX, and runnable snippets on the cards. It will not match a giant Kokoro on every quality head, and Flash / Lite skip Spanish.

For other tiny open voices this week, see Fatiman-mini-V1, TiHon-TTS, and ArtRealmAI’s Gradium Phonon English base.

Conclusion

A 13M Apache-2.0 Pro card — with 1.7M and 0.4M siblings — that claims Phonon-adjacent UTMOS at a fraction of the size is a real on-device multilingual ship, not a convert dump. Pull Pro first, say hello in four languages, then decide whether Flash belongs on the edge device.

—Anabel ♡