Pocket TTS for ONNX Runtime
Kyutai's Pocket TTS exported to ONNX: the 6-layer Dutch, the 6-layer French, English 2026-10, and Kyutai's newer 6-layer Spanish, Portuguese, German and Italian. They are the bundles voice, a speech tool for coding agents, speaks through on Linux and Windows.
Each bundle has the layout of KevinAHM/pocket-tts-onnx, which has no Dutch, no 6-layer French and no English 2026-10, and Kyutai's April 2026 models of Spanish, Portuguese, German and Italian. Each runs with its pocket_tts_onnx.py.
What's here
onnx/<bundle>/
bundle.json sample rate, frame size, and the FlowLM's and Mimi's state layout
tokenizer.model Kyutai's SentencePiece model for the language
bos_before_voice.npy the latent before a voice's prompt, float32 [1, 1, 1024]
text_conditioner.onnx token ids to text embeddings
flow_lm_main_int8.onnx the transformer, int8 weights
flow_lm_flow.onnx one flow step, float32
mimi_decoder.onnx latents to 24 kHz audio, float32
voices/<bundle>/
<voice>.safetensors a KV-cache snapshot for the bundle's model of each of the 8 voices not in Kyutai's repository
| Bundle | Kyutai model | Size |
|---|---|---|
dutch |
languages/dutch, 6 layers |
173 MB |
french |
languages/french, 6 layers |
173 MB |
english_2026-10 |
languages/english_2026-10, 6 layers |
173 MB |
spanish |
languages/spanish, 6 layers |
173 MB |
portuguese |
languages/portuguese, 6 layers |
173 MB |
german |
languages/german, 6 layers |
173 MB |
italian |
languages/italian, 6 layers |
173 MB |
english_2026-10 is Kyutai's english_2026-09_2 training recipe retrained with a loader fix for an unaligned last word, so it reads sentence-final numbers. At the revision below it is also Kyutai's languages/english.
spanish, portuguese, german and italian are the models Kyutai has published under those names since October 2026, with their own tokenizers and voice snapshots.
Kyutai's voices are not here. Each is Kyutai's own snapshot, languages/<bundle>/embeddings/<voice>.safetensors in the repository below, the same file the Core ML packs carry. The 8 here are the voices Kyutai's repository does not have, under voices/<bundle>/<voice>.safetensors (see Voices).
FILES.txt lists every file with its sha256 and size.
Where it comes from
The weights are Kyutai's, from kyutai/pocket-tts-without-voice-cloning at revision a7056f505a4a8ca72d8b5fb1440071d6f1a35739, fetched with curl and checked against the sha256 the repository lists:
| File | sha256 |
|---|---|
languages/dutch/model.safetensors |
59b5c3249ab05e8b5fcb0a296e9b0cb0c0a20da5e1fd28c04bb90b2175612aeb |
languages/french/model.safetensors |
56366cfed6c25bfcd3bf4c61e66e06efaf52e78a5d06e1dcade1c588495bc699 |
languages/english_2026-10/model.safetensors |
4c56cbd171c63e8a26ea61f5d48b8a0cd8f3c51f4652c0ab9a19bfcced8c931d |
languages/spanish/model.safetensors |
c4988ff376692f2ab1e85b17350755b08f16e49c0b5f0de8b271efa9abd71de7 |
languages/portuguese/model.safetensors |
28e20f32515ba8bd0eaec69671f11f8921414fcdc375aa072fa09f46cc1057c5 |
languages/german/model.safetensors |
9fe42605604832349e3f495177bde56b77ae8fee73b2ed4b63236092ccde7621 |
languages/italian/model.safetensors |
16365c43eaabee9b222cd414d6a48f0976b4800a21fe5d55253f645eff7eeb1f |
The exporter is lomotron/pocket-tts-onnx-export (MIT) at commit 8f52199533098963fe1cbd90bed35bb20d871b5e, which names KevinAHM/pocket-tts-onnx as its published output. It ran with torch 2.9.1, onnx 1.23.2, onnxscript 0.7.2 and onnxruntime 1.31.0. It quantizes with onnxruntime's quantize_dynamic on MatMul.
As a check, the same exporter on Kyutai's english_2026-04 rebuilt KevinAHM's onnx/english_2026-04. bundle.json, tokenizer.model, bos_before_voice.npy and flow_lm_main_int8.onnx came out byte for byte the same. The other three differ only in the producer string, pytorch 2.9.1 for 2.11.0, with the same nodes, the same weights and the same outputs.
The exporter vendors an older pocket-tts, which uses exact GELU where Kyutai's package has used the tanh approximation since 3.1.0. The difference is about 1e-3 in the transformer's output.
The commands
git clone https://github.com/lomotron/pocket-tts-onnx-export.git
cd pocket-tts-onnx-export
git checkout 8f52199533098963fe1cbd90bed35bb20d871b5e
python3.12 -m venv .venv
.venv/bin/pip install torch==2.9.1 onnx onnxruntime onnxscript beartype scipy soundfile \
sentencepiece safetensors einops pydantic typer pyyaml requests numpy typing_extensions huggingface_hub
Then a config for each bundle in pocket_tts/config/<bundle>.yaml, with weights_path and tokenizer_path pointing at the fetched files. For Dutch, French and English 2026-10 it is a copy of the exporter's german.yaml (remove_semicolons: true kept for French only, as Kyutai's configs have it). Spanish, Portuguese, German and Italian have their own there, changed only in those 2 paths. Then:
for b in dutch french english_2026-10 spanish portuguese german italian; do
HF_HUB_OFFLINE=1 .venv/bin/python export.py --language $b --quantize --output_dir out
done
Every export passed the exporter's own check of each ONNX file against PyTorch. Each bundle here is 7 of the files in out/<bundle>/, as listed above.
Checked
Through KevinAHM's runtime, at temperature 0.3 with 1 flow step, Parakeet v3 heard the bundles say:
| Bundle | Voice | Said | Heard |
|---|---|---|---|
dutch |
daan | Ik heb de bug gevonden en de tests slagen weer. | Ik heb de bug gevonden en de test slagen weer. |
french |
estelle | J'ai trouvé le bug et les tests passent à nouveau. | J'ai trouvé le bug et les tests passent à nouveau. |
english_2026-10 |
charles | The suite now runs in 42 seconds, down from 3 minutes, and the last release went out on March 3, 2026. | The suite now runs in forty two seconds, down from three minutes, and the last release went out on march third, twenty twenty six. |
spanish |
lola | Encontré el error y las pruebas vuelven a pasar. | Encontré el error y las pruebas vuelven a pasar. |
portuguese |
charles | Encontrei o erro e os testes voltam a passar. | Encontrei o erro e os testes voltam a passar. |
german |
juergen | Ich habe den Fehler gefunden, und die Tests laufen wieder durch. | Ich habe den Fehler gefunden und die Tests laufen wieder durch. |
italian |
giovanni | Ho trovato l'errore e i test passano di nuovo. | Ho trovato l'errore e i test passano di nuovo. |
Voices
| Voice | Source | License |
|---|---|---|
| emma | Kokoro-82M's bf_emma (hexgrad), synthetic speech, cloned with Kyutai's model |
Apache-2.0 (Kokoro); the state made with Kyutai's CC BY 4.0 model |
| heart, bella, nicole | Kokoro-82M's af_heart, af_bella and af_nicole (hexgrad), English, synthetic speech, cloned with Kyutai's model |
Apache-2.0 (Kokoro); the states made with Kyutai's CC BY 4.0 model |
| siwis | Kokoro-82M's ff_siwis (hexgrad), French, synthetic speech of a voice Kokoro trained on the SIWIS French Speech Synthesis Database, cloned with Kyutai's model |
Apache-2.0 (Kokoro); SIWIS is CC BY 4.0 (Yamagishi, Honnet, Garner and Lazaridis, University of Edinburgh); the state made with Kyutai's CC BY 4.0 model |
| alex, dora, sara | Kokoro-82M's em_alex (Spanish), pf_dora (Portuguese) and if_sara (Italian) (hexgrad), synthetic speech, cloned with Kyutai's model |
Apache-2.0 (Kokoro); the states made with Kyutai's CC BY 4.0 model |
The 8 voices from Kokoro-82M are clones of its bf_emma, af_heart, af_bella, af_nicole, ff_siwis, em_alex, pf_dora and if_sara, made the way pocket_tts's get_state_for_audio_prompt makes a state, from a prompt of Kokoro's own output in the voice's language (its sentences 0.4 s apart) through Kyutai's voice-cloning model, the gated kyutai/pocket-tts at the revision each bundle's config in pocket_tts names (db04f0e6 for english_2026-10, 3e82814a for the rest). Those gated files differ from the open ones only in Mimi's 42 encoder tensors, checked tensor by tensor before the clone, so their states are states of the model these bundles are. emma's prompt is 20 s and the others' 10 s, cut at a pause: from a 20 s prompt Kyutai's Spanish model stops at a semicolon, and its Portuguese one at times, where from 10 s, about the length of Kyutai's own voices, it does not, so emma's spanish and portuguese states are made from the first 10 s of her prompt. Her other states are 249 positions; the rest are 103 to 126, Kyutai's voices' about 126. Kokoro's weights and voicepacks are Apache-2.0; its card names no real speaker behind any of them but ff_siwis, whose training data it gives as the SIWIS database, under CC BY 4.0. The gated weights themselves are not here. Each state is the same file in both of lineofflight's repositories, so the Core ML packs carry them too.
License
Pocket TTS is Kyutai's, under CC BY 4.0, and so are these exports of it: see kyutai/pocket-tts. Kyutai's model card sets these terms:
Prohibited use: Use of our model must comply with all applicable laws and regulations and must not result in, involve, or facilitate any illegal, harmful, deceptive, fraudulent, or unauthorized activity. Prohibited uses include, without limitation, voice impersonation or cloning without explicit and lawful consent; misinformation, disinformation, or deception (including fake news, fraudulent calls, or presenting generated content as genuine recordings of real people or events); and the generation of unlawful, harmful, libelous, abusive, harassing, discriminatory, hateful, or privacy-invasive content. We disclaim all liability for any non-compliant use.
The exporter is MIT, as is the Pocket TTS code it carries.
Model tree for lineofflight/pocket-tts-onnx
Base model
kyutai/pocket-tts