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

VariableDefaultDescription
MODEL_NAMEKittenML/kitten-tts-mini-0.8Model to load
DEFAULT_VOICEJasperDefault 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.