YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
Kokoro 82M β Apple Neural Engine Core ML chain
Seven-stage Core ML conversion of hexgrad/Kokoro-82M (Apache-2.0) for on-device text-to-speech entirely on Apple's Neural Engine, adapted from laishere/kokoro-coreml (Apache-2.0).
Consumed by Vox as the
kokoro-82m-ane TTS engine. Benchmark (M1 Pro): 19β22.6Γ realtime flat,
75β850 ms time-to-first-chunk.
Layout
KokoroAlbert.mlmodelc,KokoroPostAlbert.mlmodelc,KokoroAlignment.mlmodelc,KokoroProsody.mlmodelc,KokoroNoise.mlmodelc,KokoroVocoder.mlmodelc,KokoroTail.mlmodelcβ compiled Core ML stages. All seven must load with.cpuAndNeuralEngine("strict" placement): mixed placement costs 2β4Γ, and Prosody on.allsegfaults on macOS 27 (mps.expand_dims invalid axis). Static shapes: ALBERT β€ 510 phonemes, vocoder β€ 2000 frames.vocab.jsonβ Kokoro phonemeβtoken map.voices/*.binβ raw fp32[510, 256]voice embeddings (row = token count β 1; first 128 dims timbre, last 128 style). Converted from the upstreamvoices/*.pttensors; the conversion is byte-identical to the iOSDemo's referenceaf_heart.bin.
Noise-stage fix (2026-10-20)
KokoroNoise.mlmodelc/model.mil is patched (weights unchanged); noise-phase-fix.json
marks the fixed revision. The conversion spelled atan2 as atan(im/re) plus quadrant
terms with no case for im == 0, re < 0, so the DC and Nyquist STFT bins of the harmonic
source got phase 0 where torch.angle gives +Ο, and it replaced the source's Gaussian
noise (noise_amp Γ N(0, 1)) with a constant. Together these lifted 5β10 kHz by up to
2.8 dB against the MLX port. The fix makes the +Ο branch take im >= 0 and restores the
draw with random_normal (seed β1: the same draw on every load, so output stays
deterministic). Measured in Vox's VoiceBench (16 cells Γ 3 takes, M1 Pro): the long-term
spectrum is within 0.1 dB of MLX Kokoro from 160 Hz to 10 kHz (was 2.8 dB), centroid
+2 Hz (was +195 Hz). The previous revision is e16ab079.
Noise stage v2 (2026-10-20)
KokoroNoise.mlmodelc is rebuilt from kokoro-v1_0.safetensors with the phase fix and
the noise draw built in; noise-stage-v2.json marks this revision. The harmonic source and
the STFT stay fp32; the noise branch (convs, Snake, AdaIN) is fp16, and the weights are not
palettized. The stage runs on the CPU in about half the time (33 ms against 72β76 ms for a
370-frame input, M1 Pro). VoiceBench: every quality budget passes, as with the patched stage;
time to first audio p50 dropped 35% in a paired A/B. The previous revision is 3ddd693.
Voices (English launch set)
American: af_alloy, af_aoede, af_bella, af_heart, af_jessica, af_kore, af_nicole, af_nova, af_river, af_sarah, af_sky, am_adam, am_echo, am_eric, am_fenrir, am_liam, am_michael, am_onyx, am_puck, am_santa. British: bf_alice, bf_emma, bf_isabella, bf_lily, bm_daniel, bm_fable, bm_george, bm_lewis.
License
Model weights and voices: Apache-2.0 (hexgrad/Kokoro-82M).
Core ML conversion: Apache-2.0 (laishere/kokoro-coreml, Β© 2026 laishere).
Voice pack conversion scripted in Vox: scripts/generate-ane-voice-packs.py.