Paradee-8M Core ML
Core ML conversions of Paradee-8M by Sahil Mahendrakar: Kokoro-82M distilled into ~8M parameters, 24 kHz TTS in English (v1.3 adds Hindi, French and Spanish). Paper: arXiv 2610.06817.
| Release | Voices | Folder |
|---|---|---|
| v1.3 | v1.2's four, plus hf_alpha, hm_omega (Hindi), ff_siwis (French), em_alex (Spanish) |
v1.3/int8/ (11 MB, default), v1.3/fp32/, G2P in v1.3/g2p/ (3.9 MB) |
| v1.2 | af_heart, bf_isabella, am_puck, bm_fable (British: bf_, bm_) |
v1.2/int8/ (11 MB, default), v1.2/fp32/ |
| v1.0 | af_heart |
int8/ (12 MB), fp32/ |
Used by FluidAudio (ParadeeManager, v1.3 by default). Conversion
code: v1.0 and v1.2 in mobius models/tts/paradee/coreml;
v1.3 and the G2P with the same scripts, extended, in a private conversion workspace (models/paradee-coreml).
v1.3
The v1.2 graphs (below) with eight-row voice tables: voice 0 af_heart, 1 bf_isabella, 2 am_puck, 3 bm_fable,
4 hf_alpha, 5 hm_omega, 6 ff_siwis, 7 em_alex (v1.3/config.json). Same inputs, outputs, shapes and vocab.
Phonemes. English voices read misaki phonemes as before. Hindi, French and Spanish read eSpeak NG-style phonemes,
which Paradee was trained on; upstream 1.3.1 (paradee#13)
produces them with its own Apache-2.0 G2P instead of eSpeak (GPL-3.0), and so does FluidAudio, from v1.3/g2p/:
ParadeeG2P.mlmodelc: upstream's 0.76M-parameter CTC model. Inputchars [B, T]int32 (B β€ 64, 4 β€ T β€ 65) =<lang> before <s1> lowercased letters (β€ 60) <s2> afterper word,pad [B, T]int32 (1 = padding); outputbest [B, 3T]int32, the CTC argmax (3 steps per symbol; merge repeats, drop 0). The int8 weights are the ONNX file's; activations are fp32. Its lengths vary per word, so run it on the CPU.paradee_g2p.json: upstream'sg2p.json.gzunzipped: model symbols, word lists (some keyed by the neighbouring letters), and the number pieces numbers are read from.- It also gives the English words misaki has no entry for, as upstream does.
Phoneme character error rate against eSpeak NG on the FLEURS test transcripts: upstream's int8 ONNX G2P 0.71 % (hi), 0.66 % (fr), 0.30 % (es); this model, fp32, the same; FluidAudio's port with NFC-normalized input 0.63 / 0.66 / 0.30 %.
Results (M5 Pro, macOS 27):
- 60 cases over the 8 voices: 0 duration differences vs PyTorch with the same noise; log-mel L1 to the released fp32 ONNX β€ 0.011. Whisper large-v3-turbo WER, Core ML fp32 = upstream ONNX fp32 in every language (en 3.09 %, hi 10.74 %, fr 7.89 %, es 5.26 %); Core ML int8 3.09 / 10.37 / 7.02 / 5.26 % vs upstream int8 3.09 / 12.22 / 7.89 / 5.26 %.
- ~190β200Γ real time on the CPU for the two models.
- FluidAudio
tts-benchmark(MiniMax test set, 100 phrases per language, int8, includes the text frontend): English WER 0.73β1.18 % per voice, French 2.92 %, Spanish 1.08 % (Parakeet round trip), Hindi 15 % WER / 6 % CER (Whisper; mostly spelling variants), 137β177Γ real time.
samples/v1.3/: upstream's three sample sentences per language in each voice, rendered by FluidAudio from v1.3/int8/.
v1.2
Same two-model layout as v1.0 (below), plus a voice input on both models:
ParadeeText input_ids [1,T] int32, voice [1] int32 -> duration [1,T], d [1,224,T], asr_tok [1,512,T]
ParadeeAcoustic en [1,224,F], asr [1,512,F], noise [1,1,600F], voice [1] int32 -> audio [1,600F], 24 kHz
voice: 0af_heart, 1bf_isabella, 2am_puck, 3bm_fable(v1.2/config.json).- Phonemes are misaki's, American for
af_/am_and British forbf_/bm_(en.G2P(british=True)), as upstream. FluidAudio reads the British voices throughgb_lexicon_cache.jsonin kokoro-82m-coreml. - The decoder end is v1.1's frame-rate source-filter head, rewritten for Core ML (GEMM STFT/iSTFT, int32 fixed-point harmonic phase, closed-form sine bank). The noise is an input, so the graphs are deterministic.
CPU_ONLYorCPU_AND_NEonly;ALL/CPU_AND_GPUabort on the LSTMs.
Results (M5 Pro, macOS 27; 10 inputs Γ 4 voices):
- 0 duration differences vs PyTorch with the same noise; log-mel L1 to the released fp32 ONNX β€ 0.012.
- Whisper large-v3-turbo WER: Core ML fp32 3.39 % = upstream ONNX fp32; Core ML int8 3.28 % = upstream int8 ONNX.
- ~200Γ real time on the CPU for text side + acoustic side (v1.0: 150Γ).
- FluidAudio
tts-benchmark --corpus minimax-english(Parakeet round trip, includes G2P), int8: WER 0.93 % (af_heart), 0.71 % (bf_isabella), 1.00 % (am_puck), 0.84 % (bm_fable), ~100Γ real time.
samples/v1.2/: upstream's five sample sentences in each voice, rendered by v1.2/int8/.
Files (v1.0)
| Path | What |
|---|---|
int8/ |
Default. ParadeeText.mlmodelc (3.1 MB) + ParadeeAcoustic.mlmodelc (9.1 MB), int8 per-channel weights; the phase-lock filter's DFT bases stay fp32 |
fp32/ |
Same graphs in fp32 (12 + 22 MB). Matches PyTorch to rounding |
*/vocab.json |
Phoneme β id map (identical to Kokoro's) |
mlpackage/ |
Source .mlpackages for both variants |
config.json |
Vocab, sample rate, shape limits |
samples/ |
The model card's five held-out sentences, rendered by int8/ |
Pipeline (v1.0)
text -> misaki-style en-US phonemes -> ids = [0, ...vocab ids..., 0] (<= 512 total)
ParadeeText input_ids [1,T] int32 -> duration [1,T], d [1,224,T], asr_tok [1,512,T]
host n_i = max(1, round(duration_i / speed)); F = sum(n)
en = d with column i repeated n_i times [1,224,F]
asr = asr_tok with column i repeated n_i times [1,512,F]
noise ~ N(0,1) [1,1,600F]
ParadeeAcoustic en, asr, noise -> audio [1,600F] float32, 24 kHz
Fmay be 1β¦4000 (100 s at speed 1). Split longer input into chunks of β€ 510 phonemes.noiseis the harmonic source's Gaussian noise, passed in so the graph is deterministic. It is equivalent to the upstream in-graph noise (9 per-harmonic channels mixed by a linear layer = one scaled channel).- Phonemes must be written the way misaki writes them (Kokoro's G2P); that is
all Paradee saw in training. That includes misaki's last step, flap
ΙΎβTand glottal stopΚβt: lexicon-only frontends that skip it garble words like "kittens" and "satellite". - Use
CPU_ONLYorCPU_AND_NE. Do not useALL/CPU_AND_GPU: the LSTMs abort in MPSGraph (GPURNNOps β¦ JIT not supported), the same failure Kokoro's prosody stage has.
Accuracy (v1.0, M5 Pro, macOS 27)
10 inputs: the README quick-start line, the five held-out sentences, a numbers/abbreviation sentence, a 28.6 s paragraph, and one sentence at speed 0.8 and 1.3.
- fp32 vs PyTorch with the same noise: 0 duration rounding differences, identical lengths. Log-mel L1 against the upstream ONNX equals the ONNX's own run-to-run difference in every case (e.g. 0.123 vs 0.123).
- Whisper large-v3-turbo transcripts of Core ML fp32 and upstream ONNX fp32 are identical (WER 3.81 %; every miss is text normalization: "Ia", "favourite", "Zzyzx").
- int8: log-mel L1 to fp32 ONNX 0.18β0.20 vs 0.21β0.31 for upstream
paradee_int8.onnx; WER 3.81 % vs 2.97 % (one word of ~236).
FluidAudio tts-benchmark --corpus minimax-english (100 phrases, Parakeet TDT round trip, Swift, CPU, includes the
English G2P frontend): WER 1.20 % / CER 0.14 % for both int8 and fp32, RTFx ~100, 77 ms median per phrase.
Conversion notes: the 1024-point phase-lock STFT is a gather + matmul + overlap-add instead of strided convolutions (the conv form ran ~40Γ slower on the Core ML CPU), and kokoro's random harmonic start phases are omitted because the upstream graph never reads them.
Changelog
| Date | Files | Change | Issue | mobius PR | FluidAudio PR | HF commit |
|---|---|---|---|---|---|---|
| 2026-10-28 | v1.2/int8/, v1.2/fp32/, v1.2/mlpackage/, v1.2/config.json |
Paradee-8M v1.2, four voices, voice input |
FluidAudio #1072 | #114 | #1073 | 25644d3e |
| 2026-10-28 | samples/v1.2/ |
v1.2 samples, five sentences per voice | FluidAudio #1072 | #114 | #1073 | 8afbeb2d |
| 2026-11-13 | v1.3/int8/, v1.3/fp32/, v1.3/g2p/, v1.3/mlpackage/, v1.3/config.json |
Paradee-8M v1.3, eight voices (Hindi, French, Spanish), and upstream 1.3.1's eSpeak-free G2P | FluidAudio #1159 | β (model-lab) | #1161 | a74ba856 |
| 2026-11-13 | samples/v1.3/ |
v1.3 samples, three sentences per voice in its language | FluidAudio #1159 | β (model-lab) | #1161 | aaafbbcf |
License
Apache-2.0, same as Paradee and Kokoro-82M. Paradee Β© Sahil Mahendrakar.
@misc{mahendrakar2026paradee,
title = {Paradee: Distilling Kokoro-82M into an 8M-Parameter Single-Voice Text-to-Speech Model},
author = {Mahendrakar, Sahil},
year = {2026},
url = {https://github.com/sahilmahendrakar/paradee}
}
- Downloads last month
- 239
Model tree for FluidInference/paradee-8m-coreml
Base model
yl4579/StyleTTS2-LJSpeech