Skip to main content

Speak text

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

clika-modelverse ResembleAI/chatterbox-flash speak \
"The install works. Pick a model from the catalog." \
--voice reference.wav --output hello.wav
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 "$(clika-modelverse <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: 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).

clika-modelverse 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:

curl -s http://127.0.0.1:8000/v1/voices -F name=reference -F file=@reference.wav
{"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):

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 is the natural smoke test: speak a sentence, transcribe the wav, and compare the text. Sizing lives in Model requirements.