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.

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for lineofflight/pocket-tts-onnx

Quantized
(64)
this model