CPU TTS benchmark with UTMOS MOS scoring: Kokoro, Supertonic, Inflect-Nano, and Kyutai's new Pocket TTS [P]
Sharing a CPU TTS benchmark with objective MOS scores in case it's useful for anyone evaluating small TTS models. Adding this because Kyutai's Pocket TTS is architecturally different from the others in the field and I hadn't seen a head-to-head with it yet.
Models:
- Kokoro 82M (PyTorch and ONNX Runtime, StyleTTS2-inspired)
- Supertonic 3 at 2 and 5 flow-matching steps (Vector Estimator backbone)
- Inflect-Nano-v1 (4.6M param FastSpeech-style, tiny end of the spectrum)
- Pocket TTS (~100M param streaming LM over Kyutai's Mimi neural audio codec)
Setup: Intel Xeon 8272CL, 4 cores, 15.6GB RAM. CUDA disabled at env level. ONNX sessions pinned to CPUExecutionProvider. Six configs, six text lengths (12 to 1712 chars), five timed reps per cell after a discarded warmup. 180 total runs. Every saved WAV scored with UTMOS (utmos22_strong) for objective MOS.
Aggregate results:
| Config | Mean RTF | UTMOS |
|---|---|---|
| Supertonic 3 (2-step) | 0.121 | 1.53 |
| Inflect-Nano-v1 | 0.145 | 3.48 |
| Supertonic 3 (5-step) | 0.240 | 4.32 |
| Kokoro 82M (ONNX) | 0.641 | 4.44 |
| Kokoro 82M (PyTorch) | 0.665 | 4.46 |
| Pocket TTS | 0.714 | 4.10 |
Findings I think are actually interesting:
1. Streaming LM architecture produces flat RTF scaling. Pocket TTS's RTF is 0.69 to 0.76 across the entire text length range. Because it emits audio tokens autoregressively at a steady rate, cost is linear in output length with no fixed overhead to amortize. Compare to Kokoro PyTorch, which climbs from 0.49 on tiny to 0.83 on long inputs, or Supertonic which goes the other way (0.36 on tiny down to 0.20 on medium) because of high per-call fixed overhead. If you're budgeting worst-case latency for an interactive system, flat is worth a lot.
2. UTMOS has a known failure mode on small vocoders. Inflect-Nano-v1 scored 3.48, which reads mid-pack. By ear it's buzzy and robotic. This is a documented issue: UTMOS rewards HiFi-GAN outputs for being clean even when they lack prosodic naturalness. Pocket TTS scored similarly (4.10) but sounds legitimately natural. The point isn't that UTMOS is broken, it's that a single quality number can't distinguish "clean and mechanical" from "clean and natural" on small models. Worth pairing with human listening or a naturalness-specific metric like NISQA.
3. Inflect-Nano has an undocumented ~15s output cap. The model config sets max_frames = 1400, which caps synthesis at ~14.93s regardless of input text length. Its RTF and throughput on long/paragraph/extended inputs are inflated because it's doing less work than the models it's compared against. Real comparison for that model is on tiny/short/medium only.
4. Kokoro ONNX vs PyTorch results reverse from the previous run. I ran an earlier version of this benchmark on AMD EPYC and PyTorch beat ONNX in aggregate. On this Xeon, ONNX is faster (0.641 vs 0.665). Same code, different silicon. AMD vs Intel kernel optimization differences at CPU inference are apparently real enough to flip the ranking. If anyone has replicated this on ARM I'd be curious.
Zero-shot voice cloning as a capability that doesn't fit the benchmark axes:
Pocket TTS can clone a voice from ~5 seconds of reference audio, zero-shot, on CPU. No other model in this field does this. I pinned it to a preset voice for the speed/quality comparison to be fair, so the cloning capability isn't reflected in the numbers. This is a real limitation of RTF-and-MOS-based comparisons: they can't capture capabilities that only one model has. Might want a separate speaker-similarity evaluation for a v2.
Limitations:
- Single hardware platform
- English only
- UTMOS is one MOS predictor; NISQA or a listening panel would strengthen the quality claims
- Voice cloning quality was not evaluated
- No batched inference tested
Disclosure: The benchmark harness was written by an AI engineering agent (Neo) from a prompt I specified. I chose the methodology, validated the outputs, and reviewed the audio. Mentioning it because it's relevant to how you'd want to weight the code.
All code, raw CSVs (180 rows), MOS CSV (36 rows), and WAV samples are in the repo mentioned in the comments below 👇
Feedback on the protocol welcome, especially on the MOS methodology and what a proper voice-cloning eval would look like.
[link] [comments]
Want to read more?
Check out the full article on the original site