# Kyutai TTS

[kyutai/tts-1.6b-en_fr](https://huggingface.co/kyutai/tts-1.6b-en_fr)
— Kyutai's flagship streaming TTS (1.6B params, EN/FR bilingual,
trained on 2.5M hours), served via the
[NillPointer/Kyutai-TTS-Server](https://github.com/NillPointer/Kyutai-TTS-Server)
community OpenAI-compatible wrapper.

## Why this stack exists

Kyutai's claim is the **lowest streaming latency in this size class**:
220 ms in solo setup; up to 32 simultaneous streams under 350 ms on
a single L40-class GPU. Worth bench-comparing against:

| | claimed latency | use case |
|---|---|---|
| **Kyutai TTS** | **~220 ms** | streaming EN/FR, conversational dialogue heritage |
| Kokoro | ~26 ms TTFB measured | low-latency English, fixed voice library |
| Chatterbox Turbo | ~1.2 s TTFB measured | English w/ cloning + 9 paralinguistic tags |
| Fish Audio S2-Pro | ~150 ms claimed | richest paralinguistic English |
| Voxtral | ~70 ms model latency | multilingual EN/FR/DE/ES/IT/PT/NL/HI |

## Deployment notes

Kyutai's official deployment path is **Rust + websockets only** (no
HTTP, no OpenAI-compat). That doesn't fit the OpenAI-`/v1/audio/speech`
contract the rest of our TTS fleet uses. The
NillPointer/Kyutai-TTS-Server community wrapper bridges Kyutai's
native streaming to the OpenAI HTTP shape, which lets us slot it
into the same bench harness as the others.

**Tradeoff**: the wrapper adds Python overhead on the request path,
so measured latency on this stack will be *higher* than Kyutai's
220 ms claim (which is for the bare Rust server). If we measure
~400-500 ms TTFB end-to-end, the wrapper is the floor — Kyutai itself
is hitting its target.

## Architecture heritage

Kyutai's TTS shares the **Mimi** neural codec + **Moshi** dialogue
modeling framework. Both target full-duplex conversational AI (Moshi
is their flagship speech-text foundation model). The TTS-only model
is the "synthesis half" of the stack, distilled for low-latency
streaming.

Trained on **2.5M hours** — a different scaling regime from the
others (CosyVoice 5k, Fish 10M, Voxtral undisclosed).

## API

OpenAI-compat at `http://10.100.79.3:8198`:

```bash
# Single-shot synthesis.
curl -fsS -X POST http://10.100.79.3:8198/v1/audio/speech \
  -H 'Content-Type: application/json' \
  -d '{"model":"tts-1.6b-en_fr","input":"Hello there.","voice":"default","response_format":"wav"}' \
  > out.wav

# Streaming.
curl -fsS -X POST http://10.100.79.3:8198/v1/audio/speech \
  -H 'Content-Type: application/json' \
  -d '{"model":"tts-1.6b-en_fr","input":"long passage…","voice":"default","stream":true}' \
  | mpv --no-cache -

# Built-in voices.
curl http://10.100.79.3:8198/v1/audio/voices
```

## Deploy

```bash
scripts/elway irv-ml1 --playbook playbooks/deploy-kyutai-tts.yaml
```

First boot pulls the kyutai/tts-1.6b-en_fr checkpoint (~3-6 GB) into
the HF cache.

## Hardware footprint

- **VRAM**: ~4-6 GB practical. Pinned to GPU 0 (RTX 3090) by default
  — the A6000 is hosting the heavier Fish S2-Pro / Voxtral.
- **Disk**: ~6 GB for the checkpoint + HF cache.
