Models and registries
The CPU image copies models-cpu.json to /app/models.json; the CUDA image copies models.json. TALKIES_ENABLED_MODELS is a comma-separated allowlist that limits both boot-time downloads and the model surface exposed by the API.
Bundled ASR models
| Slug | Registry repository | Executor | CPU | CUDA | Live ASR |
|---|---|---|---|---|---|
whisper-large-v3 | Systran/faster-whisper-large-v3 | whisper | yes | yes | bounded rolling decoder |
whisper-large-v3-turbo | deepdml/faster-whisper-large-v3-turbo-ct2 | whisper | yes | yes | bounded rolling decoder |
canary-180m-flash | nvidia/canary-180m-flash | canary_multitask | yes | yes | no |
nemotron-3.5-asr-0.6b | mudler/parakeet-cpp-gguf | parakeet_cpp | yes | yes | native |
parakeet-tdt-0.6b-v3 | nvidia/parakeet-tdt-0.6b-v3 | parakeet | no | yes | no |
canary-1b-flash | nvidia/canary-1b-flash | canary_multitask | no | yes | no |
canary-qwen-2.5b | nvidia/canary-qwen-2.5b | canary_salm | no | yes | no |
sherpa-zipformer-en-left-64 | csukuangfj/sherpa-onnx-streaming-zipformer-en-2023-06-26 | sherpa | yes | yes | native |
sherpa-zipformer-en-left-128 | csukuangfj/sherpa-onnx-streaming-zipformer-en-2023-06-26 | sherpa | yes | yes | native |
sherpa-zipformer-en-int8-left-64 | csukuangfj/sherpa-onnx-streaming-zipformer-en-2023-06-26 | sherpa | yes | yes | native |
sherpa-zipformer-en-int8-left-128 | csukuangfj/sherpa-onnx-streaming-zipformer-en-2023-06-26 | sherpa | yes | yes | native |
vosk-small-en-us-0.15 | aglaia-models/vosk-model-small-en-us-0.15 | vosk | yes | yes | native (CPU decoder) |
wav2vec2-xlsr-53-espeak | facebook/wav2vec2-xlsr-53-espeak-cv-ft | wav2vec2_phoneme | yes | yes | no |
zipa-ipa | anyspeech/zipa-small-crctc-500k | sherpa_offline_ctc | yes | yes | no |
All ASR slugs use POST /v1/audio/transcriptions. A registry may provide the default source language, target language, and task; request language wins over the source-language default. The bundled Nemotron entry uses the nemotron-3.5-asr-streaming-0.6b-q8_0.gguf file and defaults its source language to auto. Its bundled max_concurrency is two in both registries. The CPU image executes its parakeet.cpp backend on CPU. The CUDA image installs the SHA-256-pinned upstream v0.5.0 CUDA 12 binary bundle for GPU offload and keeps the bundle’s CUDA libraries isolated from the Python ML stack.
The registry declares English for Canary-180M, English/German/French/Spanish for Canary-1B, English for Canary-Qwen, and auto plus 23 named language codes for Nemotron; the three Canary entries default their source language to English. The Whisper and Parakeet-TDT entries do not pin a registry language. canary-qwen-2.5b also declares Qwen/Qwen3-1.7B as a dependent snapshot.
Sherpa-ONNX and Vosk choices
The four Sherpa slugs are English Zipformer transducer variants. left-64 and left-128 select the model’s left-context configuration; the int8 choices use quantized weights. Select exactly the trade-off you want with TALKIES_ENABLED_MODELS; the entrypoint downloads only that slug’s tokens and matching encoder, decoder, and joiner files, not all four variants. The FP32 model files are substantially larger than their INT8 counterparts.
Sherpa uses CPU in the CPU image and its native CUDA provider in the CUDA image when Talkies runs with --gpus all. vosk-small-en-us-0.15 is English-only and always decodes on CPU, including in the CUDA image. All five models support the live WebSocket API and the OpenAI-compatible file-transcription API. See Streaming for protocol and file-route details.
Phoneme recognition
wav2vec2-xlsr-53-espeak and zipa-ipa recognize phones rather than words. They run no language model and no lexicon, so the output is the phones the acoustic model heard, not the nearest dictionary word: a mispronunciation stays visible instead of being corrected away. Both use POST /v1/audio/transcriptions like every other ASR slug, and neither does live streaming.
The text field is a space-separated IPA phone stream. zipa-ipa returns one segment per file; wav2vec2-xlsr-53-espeak returns one segment per VAD region when the audio is long enough to be chunked. A verbose_json request lists each phone as a words entry with start and end in seconds; srt and vtt are built from the segments. timestamp_granularities[] alone does not add timings to a json or text response. language is accepted and echoed but does not steer decoding; both models are language-neutral. Translation and task modes do not apply.
wav2vec2-xlsr-53-espeak is the wav2vec2 XLSR-53 checkpoint fine-tuned on CommonVoice phonemes. It emits eSpeak-style IPA over a 392-symbol vocabulary, the same alphabet the Kokoro G2P path uses. Code and weights are Apache-2.0, the repository is ungated, and the download is 1.3 GB. It needs no extra image dependency because Wav2Vec2ForCTC already ships with the bundled transformers. Audio longer than TALKIES_VAD_CHUNK_THRESHOLD is VAD-chunked before decoding, since the model uses full self-attention.
zipa-ipa is the ZIPA (Zipformer IPA) small CTC checkpoint, served through the sherpa-onnx runtime already in the images via the sherpa_offline_ctc executor. The download is a 71 MB int8 model plus its token table, and it decodes a whole file in one pass at tens of times realtime on CPU. The weights repository carries no license tag; the training code and checkpoint lineage are permissive (MIT and Apache-2.0), and the weights download at runtime rather than shipping in the image.
Bundled TTS models
| Slug | Registry repository | Executor (mode) | CPU | CUDA | Default voice |
|---|---|---|---|---|---|
kokoro-82m | hexgrad/Kokoro-82M | kokoro | yes | yes | af_heart |
kokoro-82m-nvidia | nvidia/kokoro-82M-onnx-opt | kokoro_nvidia | yes | yes | af_heart |
qwen3-tts-0.6b | Qwen/Qwen3-TTS-12Hz-0.6B-Base | qwen3_tts (base) | no | yes | alloy |
qwen3-tts-1.7b | Qwen/Qwen3-TTS-12Hz-1.7B-Base | qwen3_tts (base) | no | yes | alloy |
qwen3-tts-0.6b-custom | Qwen/Qwen3-TTS-12Hz-0.6B-CustomVoice | qwen3_tts (custom_voice) | no | yes | Vivian |
qwen3-tts-1.7b-custom | Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice | qwen3_tts (custom_voice) | no | yes | Vivian |
qwen3-tts-1.7b-design | Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign | qwen3_tts (voice_design) | no | yes | design |
chatterbox-turbo | ResembleAI/chatterbox-turbo | chatterbox | no | yes | builtin |
GET /v1/audio/voices is the source of truth for a model’s valid voices. Qwen3 base voices are .wav files below /opt/talkies/qwen3-voices or /data/custom-voices, named without the extension. A sibling .txt is its reference transcript and a sibling .lang changes its language label. Custom voices shadow built-ins of the same name.
For custom_voice, voice is a built-in speaker name. The 1.7B model accepts instructions as an emotion/style prompt; the 0.6B checkpoint ignores it. For voice_design, the valid voice is design and instructions must be a non-empty voice description. Qwen3 produces 24 kHz mono PCM and can stream it with response_format="pcm"; see Speech.
Chatterbox Turbo
English-only, 24 kHz mono, buffered (no PCM streaming). voice is either builtin, the speaker shipped inside the checkpoint, or the name of a .wav below /data/custom-voices, extension stripped, nested paths preserved. Unlike Qwen3 no reference transcript is needed, but the clip must be longer than 5 seconds; shorter clips are rejected with a 400. speed has no effect and is ignored.
Emotion and non-verbal sounds are written inline in input as bracketed tags. They are real tokens in the model’s tokenizer, so only these 19 work:
[angry] [fear] [surprised] [whispering] [advertisement] [dramatic] [narration] [crying] [happy] [sarcastic] [clear throat] [sigh] [shush] [cough] [groan] [sniff] [gasp] [chuckle] [laugh]
{
"model": "chatterbox-turbo",
"voice": "builtin",
"input": "Oh, that's hilarious. [chuckle] Anyway [sigh] back to work."
}
Every waveform this model produces carries Resemble AI’s PerTh neural watermark. The upstream package applies it unconditionally, so Talkies substitutes a passthrough when TALKIES_CHATTERBOX_WATERMARK is false. It defaults to true, and the backend logs an info line when it is off. See Configuration.
The checkpoint is MIT-licensed and ungated, so the entrypoint downloads it without a Hugging Face token. Only the files the model loads are fetched; the repository also ships a 1 GB s3gen.safetensors that this backend never reads.
Use a custom registry
docker run --rm -it \
-p 127.0.0.1:8000:8000 \
-v "$PWD/talkies-data:/data" \
-v "$PWD/my-models.json:/app/my-models.json:ro" \
-e TALKIES_MODELS_FILE=/app/my-models.json \
-e TALKIES_ENABLED_MODELS=my-asr \
psyb0t/talkies:latest
A registry is a JSON object with a non-empty models object that maps each slug to an entry. Every entry needs a repo. executor defaults to whisper and must be one of whisper, parakeet, parakeet_cpp, canary_multitask, canary_salm, kokoro, kokoro_nvidia, qwen3_tts, sherpa, sherpa_offline_ctc, vosk, chatterbox, or wav2vec2_phoneme. The entrypoint downloads a selected repository into /data/models/<slug>. A missing repo, an unknown executor or an invalid max_concurrency on any entry stops the server at startup, even when that slug is not enabled.
| Field | Used by | Meaning |
|---|---|---|
repo | all | Hugging Face repository to download; required |
executor | all | Backend that runs the model; default whisper |
revision | all | Branch, tag or commit passed to the snapshot download; pin an immutable commit for reproducible contents |
download_patterns | all | Non-empty array of file patterns that limits the download, useful when one repository holds several variants |
max_concurrency | all | Integer from 1 to 1024; active inference requests admitted across every API |
dependencies | all | Extra repositories prefetched into the standard Hugging Face cache, such as Qwen/Qwen3-1.7B for canary-qwen-2.5b |
default_source_lang | ASR | Source language used when a request sends no language |
default_target_lang | ASR | Target language passed to the backend; defaults to the source language |
default_task | ASR | Task passed to the backend, asr by default; ast reports translate in verbose_json |
gguf_file | parakeet_cpp | The GGUF file to download and load from the repository |
sherpa_config | sherpa, sherpa_offline_ctc | Required recognizer file paths and options; see Streaming |
recognizer_factory | sherpa | Sherpa-ONNX online recognizer constructor; default from_transducer |
qwen3_mode | qwen3_tts | base, custom_voice or voice_design; default base |
default_language | qwen3_tts | Language label used when a request sends none; default English |
The bundled registries also carry languages, default_voice and modality on some entries. The server does not read them; the backend decides the default voice and GET /v1/models derives the modality.
Concurrency is an admission limit, not a promise that a backend executes all admitted requests simultaneously. A backend may serialize access to a shared native context; parakeet.cpp currently does this for feed and finalize calls.
The authoritative bundled entries are models-cpu.json and models.json.