---
title: Speak text
description: Text-to-speech from the command line and over HTTP, with voice references and the synthesis knobs.
---

<!-- CERTIFICATION: the speak command ran on cpu and cuda against the pinned release with the jfk.wav voice reference at --seed 7 (whisper-large-v3-turbo
     transcribes the cuda wav as "The install works! Pick a model from the catalog."); the HTTP registration response and the speech call's audio/wav are the pinned server's. -->

A text-to-speech family turns text into a waveform. The catalog's runnable TTS families (Chatterbox, Qwen3-TTS) provide `speak`: the model synthesizes, the wav lands on disk, and the payload on stdout is the file's path, ready to pipe into the next command. The runnable Chatterbox checkpoint is `ResembleAI/chatterbox-flash` (the original `ResembleAI/chatterbox` snapshot ships a flow estimator the runtime does not serve, and the tool's refusal names the served one). CSM is cataloged for identity resolution today (`info` recognizes it); its runnable path is not shipped yet.

## From the command line

```bash
clikart-cli ResembleAI/chatterbox-flash speak \
    "The install works. Pick a model from the catalog." \
    --voice reference.wav --output hello.wav
```

```text
hello.wav
```

Play it with anything; the file is 16-bit PCM at 24 kHz. The flags:

- `--output PATH`: the wav path (`speech.wav` by default). The path is the stdout payload, so `aplay "$(clikart-cli <model> speak "..." )"` works as a one-liner.
- `--voice PATH`: REQUIRED for Chatterbox, a reference voice whose timbre the model matches (the family ships no default voice; `speak` without it refuses and says so). Where a family ships named voices, `--voices-dir` points at the set.
- The synthesis knobs are the family's own (`<model> speak --help` lists them); Chatterbox exposes `--exaggeration` (expressiveness), `--steps` (decode steps, quality against speed) and `--temperature`.
- The load knobs apply unchanged: `--device`, `--cache-dir`, `--offline`.

## Over HTTP

The same model serves `POST /v1/audio/speech` (text in, waveform out) behind a voice registry, rows in [the route table](serve-openai-compatible.md): `POST /v1/voices` registers a reference clip under a name, `GET /v1/voices` lists the registered voices, `DELETE /v1/voices/<name>` frees a slot, and a speech request names one of them. Chatterbox ships no default voice, so a speech request before any registration is refused (`voice 'default' is not registered; POST /v1/voices first`).

```bash
clikart-cli ResembleAI/chatterbox-flash serve --port 8000
```

Register the reference clip once, as a multipart upload with `name` (the voice id) and `file` (the audio); the reply names the clip's decoded rate and duration:

```bash
curl -s http://127.0.0.1:8000/v1/voices -F name=reference -F file=@reference.wav
```

```text
{"name":"reference","sample_rate":16000,"duration_seconds":11.0}
```

Then ask for speech in that voice; the reply body is the wav itself (`audio/wav`, 16-bit PCM at 24 kHz):

```bash
curl -s http://127.0.0.1:8000/v1/audio/speech \
  -H "Content-Type: application/json" \
  -d '{"input": "The install works.", "voice": "reference"}' \
  -o hello.wav
```

OpenAI SDK clients use their `audio.speech.create(...)` call against the base URL with `voice` set to a registered name; the server's built-in web page for a TTS model is a speech console rather than a chat window.

The round trip with [Transcribe audio](transcribe-audio.md) is the natural smoke test: speak a sentence, transcribe the wav, and compare the text. Sizing lives in [Model requirements](../model-requirements.md).
