ribt
Real-time, In-Body Talk. A 54M-parameter English voice for robots that have to answer while you're still in the room. First audio 17.6 ms after the text arrives, 37ร faster than real time, and the same compiled programs run on Metal, CUDA, OpenCL, C and WebGPU.
Try it in your browser โ ยท Code ยท Paper
Listen
Shipped defaults, seed 0, first take.
| Hi, I'm right here. What do you need? | |
| Ope, let me just grab that bag for you. | |
| Your package ships on March 3rd, and it's $42.50. | |
| Did you want the lights off, or just dimmed? | |
| I'm a little warm after that walk, but give me a minute and I'll be ready to help with the dishes. |
What it is
A conversation leaves a robot about 200 ms between your last word and its first sound, and speech recognition and the reply have to fit in that too. So ribt is built to make the first sample cheap, not just to be fast on average.
| stage | what it does | params |
|---|---|---|
| lilt | letters to phonemes: a Rust port of misaki (99.86% word parity, 274k words/s, streams word by word) | tables |
| acoustic | how long to hold each sound, where the pitch goes, and a rough 100-band spectrogram | 18.65M |
| flow | one step of flow matching that adds the detail a 16-step teacher would | 21.88M |
| vocoder | spectrogram to 24 kHz waveform (Vocos, imported into ribt's graph) | 13.5M |
Every network is a program in tang's tensor IR, trained in that IR with no PyTorch in the loop.
Files
| file | what | sha256 |
|---|---|---|
acoustic.safetensors |
acoustic model, f32 | 23b98126a0b5a39180f7660ab95fa2fec6acbbbd8845ae6d3a9526d23cd508d6 |
norm.txt |
pitch and energy normalisation for the acoustic model | 2caa07fe6ecbbfd256b56deba9959ff8cbddb3ee75ad0ffba71b89ceb840006d |
flow.safetensors |
one-step flow student, f32 | bf0fb3cd5ca4111ac5c197c6c4f402e5ae23a2a50eb4315d2332a7ca3ff47927 |
flow_norm.txt |
flow normalisation | 5b50240542f6d61fd580a1ebde2011b2ed29551d5608f9d5310c23a2b165ea88 |
vocoder.safetensors |
Vocos 24 kHz, f32 | a91e8da6dc6a93b40171657c857007d42f288f403b6039e400c3fb5f60206ad0 |
ref.wav |
speaker reference, 8.1 s | 589471b3415cdfda6b82d7b780e5e39564a7ad90155cdee15674680bd039d867 |
web/ |
the browser build: WGSL plans per shape bucket and fp16 weights, checksums in web/manifest.json |
|
release.toml |
every component, checksum, synthesis default and eval number |
Use
git clone https://github.com/muni-works/ribt && cd ribt
cargo build --release # Metal; CUDA, wgpu, OpenCL and CPU builds are in the repo README
hf download municipal-robotics/ribt --local-dir ribt-weights
W=ribt-weights
target/release/ribt-tts synth --run $W --ckpt acoustic.safetensors \
--flow $W/flow.safetensors --nfe 1 --shortcut --temp 0.3 \
--voc $W/vocoder.safetensors --ref $W/ref.wav \
--seed 0 --pitch 1 --accent minnesota \
--text "Hi, I'm right here. What do you need?" --out-dir out/
Use stream instead of synth for chunked playback. In the browser, web/build.sh in the repo turns
these weights into the build that runs on ribt.dev.
Evaluation
M4 Max, batch 1, warm, seed 0. Word error rate from Whisper small.en, naturalness from UTMOS (utmos22_strong), speaker similarity as WavLM-base-plus-SV cosine to 121 held-out af_heart clips.
| ribt | Kokoro af_heart | |
|---|---|---|
| Time to first audio | 17.6 ms (streaming) | 349 ms (whole sentence, CPU) |
| Real-time factor | 0.027 | 0.093 |
| Naturalness, UTMOS | 4.39 | 4.52 |
| Word error rate, WER-50 | 2.71% | 2.61% |
| Word error rate, held-out 50 | 1.73% | 1.73% |
| Speaker similarity | 0.987 | 0.990 |
Kokoro still sounds a little better, by about 0.13 UTMOS. The WebGPU build matches the native build on the same weights to within 6e-5 relative RMS.
Limitations
- English (US) only, and one voice.
- Naturalness trails its teacher. The paper reports the attempts to close the gap and where they stopped.
- The browser build needs WebGPU and downloads about 140 MB the first time.
Where the voice comes from
ribt's voice is distilled from Kokoro-82M's af_heart
voice (Apache-2.0). We rendered 135 hours of af_heart, from LibriTTS-R transcripts and templated
conversational lines, and trained our own acoustic and flow models on them. No Kokoro weights are in
ribt. Kokoro's own training data included synthetic audio from closed commercial TTS providers, so the
voice inherits that lineage. The vocoder is Vocos by Hubert
Siuzdak (MIT), trained on LibriTTS.
Cite
@misc{pedersen2026ribt,
title = {Real-time, In-Body Talk: a small streaming voice, trained in one tensor IR},
author = {Pedersen, Cam},
year = {2026},
howpublished = {Municipal Robotics},
url = {https://muni.works/research/ribt}
}
License
MIT. Vocos weights: MIT (Siuzdak 2023). Built by Municipal Robotics.
