Introduction

KittenML, the team behind the CPU-friendly KittenTTS voice models, released a new family of small multilingual models on November 13: KittenTTS 2 Pico, Nano and Mini.

The three repos went up on Hugging Face at about 03:34 UTC: kitten-tts-2-pico, kitten-tts-2-nano and kitten-tts-2-mini. Loader support landed in the KittenTTS GitHub repo through pull request #192, and version 0.9.8 of the kittenml package followed about an hour later.

The smallest model is an 8 MB file. It speaks English, German, Spanish, Italian, Portuguese, Russian, Hindi and French, and it doesn't need a GPU or PyTorch. Like the tiny voices we covered from Inflect v3 and Mach-Boom, this family is built for apps, games and devices where a big speech model won't fit.

What Shipped

  • KittenTTS 2 Pico: 7.2M parameters for each language model and 8.0 MB in int8 ONNX. It covers 8 languages with 30 voices.
  • KittenTTS 2 Nano: 17M parameters for each language model and 17.4 MB in int8 ONNX. Same 8 languages, with 37 voices.
  • KittenTTS 2 Mini: a single 82M multilingual model of about 82.7 MB in int8 ONNX. It covers 16 languages: the 8 above plus Danish, Finnish, Japanese, Korean, Dutch, Swedish, Swahili and Turkish. It has 118 voices.
  • Two formats in every repo: an int8 ONNX graph that runs on CPU through ONNX Runtime, and float32 safetensors for PyTorch on CPU or GPU. You only download the files for the backend and languages you use.
  • Named voices: the English voices reuse character names from the big KittenTTS 2. Examples include Eleanor ("somber historian"), Otis ("rumbling blues musician"), Max ("energetic sports announcer") and Danny ("cheerful podcast host"). Other languages have plain Female 1 / Male 1 style voices.
  • Cross-language voices in Mini: the English character voices can also speak German, Spanish, Italian, Portuguese and Russian under the same name.
  • Output: 24 kHz mono audio, with a speed control and a streaming generator for long text.
  • License: Apache 2.0 for the models, the voice packs and the bundled grapheme-to-phoneme files.

Where to Run It Today

Any laptop or server CPU. Use Python 3.10 to 3.12:

pip install kittenml soundfile

from kittenml import KittenTTS
import soundfile as sf

m = KittenTTS("KittenML/kitten-tts-2-nano")    # or -pico / -mini
print(m.available_voices)                      # voices per language

audio = m.generate("Hello there, this runs on a CPU.", voice="Eleanor")
sf.write("hello.wav", audio, 24000)

audio = m.generate("Guten Morgen! Wie geht es dir?", language="de")  # first German voice
audio = m.generate("Guten Morgen!", voice="Paul", speed=1.1)         # the voice picks the language

GPU (optional): pass backend="torch", device="cuda" to run the float32 weights in PyTorch. Install onnxruntime-gpu if you'd rather keep the ONNX graph and run it on CUDA or ROCm.

Long text: m.generate_stream(long_text, language="fr") returns audio chunk by chunk. Text is split at sentence ends into chunks of up to 350 phonemes and joined with 0.15 seconds of silence.

Japanese (Mini only): install pip install "kittenml[ja]" to get the Japanese phonemizer.

The full loader reference is in the KittenTTS 2 tiny docs.

Numbers

From KittenML:

  • Model sizes: Pico 7.2M parameters (8.0 MB), Nano 17M (17.4 MB), Mini 82M (about 82.7 MB). All are int8 ONNX.
  • Quantization: all weights are stored as int8, with one scale per output channel, and the arithmetic stays in float32. KittenML says it tested dynamic int8 activations and rejected them because they caused audible spectral errors.
  • Training for int8: the int8 weights come from quantization-aware distillation from the float32 model. The text side and prosody predictor (durations, pitch, energy) were trained first, then the decoder.
  • int8 vs float32: KittenML reports the same Whisper character error rate, about 0.999 speaker-embedding similarity, and a median pitch difference of about 0 cents.

Our own quick test, on an 8-vCPU cloud box with the default int8 ONNX backend and kittenml 0.9.8, timed one English sentence with the Eleanor voice after a warm-up:

  • Pico: 6.45 s of audio in 0.16 s, about 40× real time.
  • Nano: 6.95 s of audio in 0.40 s, about 17× real time.
  • Mini: 6.47 s of audio in 1.09 s, about 6× real time.

That's one run on one machine, so treat it as a rough idea of speed, not a benchmark.

Caveats

  • No voice cloning in the tiny models. Pico, Nano and Mini only use their built-in voice packs. Cloning from a 5–30 second clip is still a feature of the full 1.7B KittenTTS 2, which uses a separate Stellon Labs community license rather than Apache 2.0.
  • No quality scores yet. The docs say each model card lists per-model numbers, but at launch the cards only have usage and voice lists. There are no MOS or WER comparisons against Kokoro, Piper or the older KittenTTS 0.8 models.
  • Python 3.13 doesn't work yet. On Python 3.13, pip install kittenml failed for us because its misaki phonemizer dependency only installs on Python 3.12 and older. A Python 3.12 environment installed cleanly.
  • First-run downloads. English pulls spaCy's en_core_web_sm the first time you use it. Each new language also fetches its own model file on first use, so the first German line took about 14 seconds in our test.
  • Phonemizer quality varies by language. Every language except English and Japanese goes through espeak-ng, so pronunciation of names and loanwords may need checking.
  • No announcement post yet. At the time of writing, the release is the Hugging Face cards, the GitHub merge and the PyPI package. There's no KittenML blog or X post.

Conclusion

KittenTTS 2 Pico, Nano and Mini bring the KittenTTS character voices down to 8 MB, 17 MB and 82 MB. They're under a permissive Apache 2.0 license and run faster than real time on an ordinary CPU. Pico is the one to try for embedded or in-browser-sized builds. Mini is the pick if you need 16 languages and the cross-language character voices from a single file. If you need voice cloning, you'll still have to step up to the full 1.7B model. For narrated game menus, offline readers and app voice prompts, these are worth a pip install today.

—Anabel ♡