Skip to main content

Kitten TTS

Kitten TTS

Hugging Face Demo Discord Website License

New: Free Kitten TTS API available at https://platform.kittenml.com

Kitten TTS is an open-source text-to-speech library. Its flagship model, KittenTTS 2, is a 1.7B-parameter speech language model with in-context voice cloning and expression control: give it five seconds of anyone's voice and it speaks your text in that voice.

The library also ships the original lightweight ONNX models, 15M-80M parameters, which run on CPU without a GPU. Both families load through the same KittenTTS(...) constructor.

Status: Developer preview -- APIs may change between releases.

Commercial support is available. For integration assistance, custom voices, or enterprise licensing, contact us.

Table of Contents

Features

  • Voice cloning -- Clone any speaker from 5-30 seconds of audio, no fine-tuning
  • 47 built-in voices -- Including the eight from KittenTTS 0.8 and nine non-English
  • Multilingual -- Ten languages: English, Arabic, Chinese, French, German, Hindi, Italian, Portuguese, Russian, Spanish
  • Expression control -- [emotion] tags, inline <event> tags, and (((emphasis))) spans
  • Decoding presets -- Trade stability against expressiveness per request
  • Long-form text -- Sentence-aware chunking with seamless joins
  • Text preprocessing -- Numbers, currencies, dates, units and abbreviations expanded automatically
  • 24 kHz output -- High-quality audio at a standard sample rate
  • Also runs on CPU -- Via the lightweight ONNX models, from 25 MB

Available Models

KittenTTS 2 -- speech language model, requires a GPU:

Model Parameters Size Voices Download
kitten-tts-2 1.7B 3.5 GB 47 + cloning KittenML/kitten-tts-2

Lightweight ONNX -- runs on CPU, no GPU required:

Model Parameters Size Download
kitten-tts-mini 80M 80 MB KittenML/kitten-tts-mini-0.8
kitten-tts-micro 40M 41 MB KittenML/kitten-tts-micro-0.8
kitten-tts-nano 15M 56 MB KittenML/kitten-tts-nano-0.8
kitten-tts-nano (int8) 15M 25 MB KittenML/kitten-tts-nano-0.8-int8

Note: Some users have reported issues with the kitten-tts-nano-0.8-int8 model. If you encounter problems, please open an issue.

Demo

https://github.com/user-attachments/assets/d80120f2-c751-407e-a166-068dd1dd9e8d

Try it online

Try Kitten TTS directly in your browser on Hugging Face Spaces.

Quick Start

Prerequisites

  • Python 3.9 or later
  • A CUDA GPU with roughly 8 GB free
  • About 4 GB of disk space for the model

Installation

pip install kittenml

That is the whole install. KittenTTS 2 is the default model, voice cloning is included, and no Hugging Face login is needed -- every weight the model uses ships in its own repository. It also pulls the small ONNX runtime, so the lightweight models work from the same install.

Basic usage

from kittenml import KittenTTS
import soundfile as sf

m = KittenTTS("KittenML/kitten-tts-2")

audio = m.generate("One day, a little girl named Lily found a needle in her room.",
                   voice="Bruno")
sf.write("output.wav", audio, m.sample_rate)

m.available_voices lists all 47 built-in voices, described in voices and expression. Bella, Jasper, Luna, Bruno, Rosie, Hugo, Kiki and Leo are the same speakers as in KittenTTS 0.8, so code written against the ONNX models keeps working.

# Trade stability against expressiveness
audio = m.generate("Hello, world.", voice="Luna", preset="expressive")

# Save directly to a file
m.generate_to_file("Hello, world.", "output.wav", voice="Bruno")

Voice cloning

Pass reference= instead of voice= — same method, the recording just replaces the built-in speaker. Give it 5-30 seconds of a single speaker. The transcript is part of the prompt, but you do not have to type it; Whisper fills it in when omitted.

audio = m.generate("This is my own voice, cloned.", reference="my_voice.wav")

# Supplying the transcript skips the Whisper pass
audio = m.generate("This is my own voice.", reference="my_voice.wav",
                   reference_text="what is actually said in the clip")

The reference feeds the model by two independent routes -- a speaker embedding through the model's projection head, and the clip itself as codec tokens in the prompt -- so identity survives even when one route is weak.

Measured on the built-in voices: a generated clip scores 0.49-0.72 speaker similarity against its own reference and 0.01-0.18 against the other 37, and cloning an unseen recording scores 0.81 against that recording.

Expression controls

audio = m.generate(
    "[joyful] We actually won the grant <laugh> I can (((hardly))) believe it!",
    voice="Kiki",
    preset="expressive",
)

A leading [emotion] tag, inline <event> tags and (((emphasis))) spans reach the model as markup rather than being spoken, and automatically enable its expression conditioning. Ten emotions and ten vocal events are recognised -- see voices and expression for the full lists and what is not covered.

Long text and streaming

Long input is split on sentence boundaries and synthesized chunk by chunk, then joined with silence trimming and short edge fades so the seams are inaudible. This is automatic: the model is reliable on short inputs but truncates or drifts into repetition when asked for a whole script in one pass.

To start playing before the whole thing is ready, stream it:

for chunk in m.generate_stream(long_text, voice="Luna"):
    play(chunk)          # each chunk is a numpy array at m.sample_rate

It takes the same arguments as generate, so reference= streams a cloned voice too.

Streaming is chunk-level, not token-level: a chunk is generated and vocoded in full before it is yielded, so the first chunk still costs its own generation time. On an A100, a 936-character passage yielded its first 21 s of audio after 17 s and finished 54 s of audio in 42 s of wall clock -- so playback keeps ahead of generation, but there is a real initial delay.

Two consequences worth knowing:

  • Short text does not stream. Input that fits in one chunk (under roughly 380 characters, and short trailing pieces get merged into their neighbour) yields exactly one chunk, so generate_stream behaves like generate.
  • Chunks are yielded raw. generate post-processes the seams -- trimming each segment's edge silence, adding short fades and one consistent pause -- which a streaming caller cannot do without waiting for the next chunk. Concatenating streamed chunks directly gives slightly rougher joins than generate on the same text.

Documentation

API reference Every argument to generate, streaming, and the advanced knobs
Voices and expression The 47 voices, emotion and vocal-event tags, the ten languages
Decoders How audio is decoded, and the smaller quantised decoders
Text normalization How written text becomes spoken text
Architecture What the model is, package layout, vendored components
Lightweight ONNX models The CPU models, 15M-80M parameters, and their API

System Requirements

KittenTTS 2

  • Operating system: Linux or Windows (CUDA)
  • Python: 3.9 or later
  • Hardware: CUDA GPU with roughly 8 GB free
  • Disk space: About 4 GB for the model

Lightweight ONNX models

  • Operating system: Linux, macOS, or Windows
  • Python: 3.8 or later
  • Hardware: Runs on CPU; no GPU required
  • Disk space: 25-80 MB depending on model variant

A virtual environment (conda, venv, or similar) is recommended to avoid dependency conflicts.

Roadmap

  • Release optimized inference engine
  • Release mobile SDK
  • Release higher quality TTS models (KittenTTS 2)
  • Release multilingual TTS
  • Release KittenASR
  • Need anything else? Let us know

Commercial Support

We offer commercial support for teams integrating Kitten TTS into their products. This includes integration assistance, custom voice development, and enterprise licensing.

Contact us or email info@stellonlabs.com to discuss your requirements.

Community and Support

License

This project is licensed under the Apache License 2.0.

Metadata

Release files for kittenml 0.9.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for kittenml 0.9.0
File Size Uploaded
kittenml-0.9.0.tar.gz 115.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for kittenml 0.9.0
File Interpreter ABI Platform
kittenml-0.9.0-py3-none-any.whl Python 3 none any Details

Total release size: 232.3 kB

Release files / kittenml-0.9.0.tar.gz

Download URL kittenml-0.9.0.tar.gz
Size 115.8 kB
Tags Source
SHA-256 checksum
How to use checksums
6eda759791c08e4ff8d4030d7e897bbd27b10f17fcf4f2a74d96bc25e872f85d
BLAKE2b-256 checksum
How to use checksums
f9986ce40e7cc309442f9034836ca95acba598dc1d05e8e9c0b1e856bc5e3bfe
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.7

Release files / kittenml-0.9.0-py3-none-any.whl

Download URL kittenml-0.9.0-py3-none-any.whl
Size 116.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
89ec0eb8e1844b531222c53c8a812b8301aac40e2e92392bcbcf17a6d93f68e8
BLAKE2b-256 checksum
How to use checksums
7fcb148c3cd49e145c12c10c3fb00a069b8782d36c5569186b2b200ffcefa64d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.7

Release history Release notifications | RSS feed

0.9.4

2 release files

0.9.3

2 release files

0.9.2

2 release files

0.9.1

2 release files

This release

0.9.0 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page