About Kitten TTS: Open-source (Apache 2.0) by KittenML. ONNX-based, CPU-first. v0.8.1. Perfect for container deployment.
Why Docker?
Docker provides isolated, reproducible deployment. Kitten TTS is lightweight enough to run in minimal containers.
Dockerfile
FROM python:3.11-slim-bookworm
RUN apt-get update && apt-get install -y libsndfile1 && rm -rf /var/lib/apt/lists/*
WORKDIR /app
RUN pip install soundfile
RUN pip install https://github.com/KittenML/KittenTTS/releases/download/0.8.1/kittentts-0.8.1-py3-none-any.whl
COPY tts_server.py .
CMD ["python3", "tts_server.py"]
docker-compose.yml
version: "3.8"
services:
kittentts:
build: .
container_name: kitten-tts
volumes:
- ./output:/app/output
- ./models:/root/.cache/kittentts
environment:
- MODEL_NAME=KittenML/kitten-tts-mini-0.8
- DEFAULT_VOICE=Jasper
restart: unless-stopped
Build & Run
docker compose build
docker compose up -d
docker compose logs -f
Example tts_server.py
import os
from flask import Flask, request, jsonify, send_file
from kittentts import KittenTTS
import soundfile as sf
import time
app = Flask(__name__)
model = KittenTTS(os.getenv("MODEL_NAME", "KittenML/kitten-tts-mini-0.8"))
default_voice = os.getenv("DEFAULT_VOICE", "Jasper")
@app.route("/tts", methods=["POST"])
def tts():
data = request.get_json()
text = data.get("text", "")
voice = data.get("voice", default_voice)
audio = model.generate(text, voice=voice)
path = "output/tts_%s.wav" % int(time.time())
sf.write(path, audio, 24000)
return send_file(path, mimetype="audio/wav")
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8080)
Environment Variables
| Variable | Default | Description |
|---|---|---|
MODEL_NAME | KittenML/kitten-tts-mini-0.8 | Model to load |
DEFAULT_VOICE | Jasper | Default voice |
Model Cache
Persistent cache: Mount
~/.cache/kittentts as a volume to avoid re-downloading models on container restart.Troubleshooting
Out of memory: Use
kitten-tts-nano-0.8 (15M) for containers with less than 512 MB RAM.