I distilled Kokoro-82M into a single-voice audiobook engine for MLX, reducing it to about 10M active parameters from 82M. The vocoder is now a source-filter head over an exact-phase harmonic template, swapped in on cycle 107 for the per-bin complex mask it started as. The vocoder stays at frame rate. On an M2 MacBook with 16GB, a 163-second chapter renders in 0.271s on the student-fast preset: a real-time factor of 622, and 53x faster than stock Kokoro. That factor is measured against the roughly 168 seconds of audio the preset actually emits, because its durations drift.
The final student-fast preset reports 4.97% mean duration drift and 50.30% worst-case drift on the frozen evaluation set. The worst case uses adversarial, punctuation-dense text. The weights page reports 0–8% on narration. Use the slower student preset when matching teacher durations matters.
ASR intelligibility is comparable to the teacher: 5.46% WER against 5.65%, speaker cosine similarity is 0.98, and the new vocoder head scores 4.180 UTMOS against the teacher's 4.477. The student preset is slower at 1.117s but keeps durations bit-exact against the teacher. Weights are about 51MB, Apache-2.0, in the repo and mirrored on Hugging Face . I finished this research phase on 4 August 2026 after 113 cycles.
Final student-fast preset; model card evaluation dated August 1, 2026. Source-reported measurements, not a new benchmark.
- chapter render
- 0.271s
- real-time factor
- ×622
- WER, teacher 5.65%
- 5.46%
- active params
- ~10M
Instrumenting my stack against the PyTorch reference turned up five places where the MLX port of Kokoro diverges from it, so I wrote them up and sent a patch upstream to mlx-audio . One difference caused a constant 2.5 dB attenuation: the inverse STFT divided by the sum of the window instead of its square, which for this configuration is exactly 0.75x. Another was a one-frame misalignment in the upsample path that sits directly in the pitch contour, where predicted F0 went from 0.134 relative RMSE against the reference to 0.0000. Across a 55-utterance battery, MCD 7.29 to 4.09 dB and F0 error 11.5 to 5.1 Hz. It merged on 5 August 2026.
target not met quality limits
In direct A/B listening, the audio sounds less clear than Kokoro. Mel-cepstral distortion measures 13.89 against a 3.98 pass bar, and speaker similarity measures 0.981 mean, 0.874 worst, against a 0.998 gate. Both quality gates fail. The frozen zero-loss battery remains unpassed, as the README states.
These measurements come from the repository. The independent audit re-timed the same preset at 0.340s and reproduced the speedup as 40x. It ran on 29 July 2026 against the build before the compile round, and docs/history/REPORT.md logs what closed the gap after it: mx.compile with fixed-shape padding across the student stages, 0.333s down to 0.239s. The source-filter head adds 8% to chapter rendering time, bringing it to 0.271s. The audit and model-card timings refer to different optimization stages of the same engine. The audit also confirms that 1000x wasn't reached, and the configuration that does pass the gates, ship-q8, is roughly 1x. That preset is still the default provider, and Kestrel remains opt-in while the quality gap remains.
weights on Hugging Face · every figure above is in docs/MODEL_CARD.md