gaurav-voice
Weights for a text-to-speech demo that runs entirely in a browser tab, with no server: https://gaurav.bar/things/storyteller
Two things live here.
1. A voice
onnx/english_2026-04/voices.bin is my own voice — Gaurav Singh — encoded
once, offline, from about twenty seconds of me speaking. I am publishing it
knowingly, so that the demo works for anyone who opens the page.
The file is not audio. It is the speech model's key–value cache after it has listened to that recording: 12,288 floats for every 80 ms, across six layers and sixteen attention heads. Encoding offline means the browser never needs the voice encoder (19.8 MB) or the gated cloning weights — it loads a state file, as the upstream built-in voices do.
If you use this voice, please say that it is synthetic. The demo page it was built for discloses that in its first sentence.
2. Redistributed model weights
flow_lm_*, mimi_decoder, text_conditioner, tokenizer.model and
bos_before_voice.npy are the int8 ONNX exports of
Pocket TTS (Kyutai, MIT),
mirrored from
KevinAHM/pocket-tts-onnx
so one origin serves the whole demo.
mimi_encoder is deliberately not mirrored — it is only needed to encode a
new voice, which this demo does not do.
Local change
bundle.json lists predefined_voices: ["gaurav"] rather than the upstream
eight. The runtime defaults to alba whenever it sees that name in the list and
then fails against a pack that does not contain it.
Layout
onnx/english_2026-04/
flow_lm_main_int8.onnx 72.8 MB
mimi_decoder_int8.onnx 21.6 MB
text_conditioner_int8.onnx 15.6 MB
flow_lm_flow_int8.onnx 9.5 MB
voices.bin 11.8 MB <- the voice
bundle.json, tokenizer.model, bos_before_voice.npy
About 133 MB in total, fetched once and then cached by the browser.