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. Input chars [B, T] int32 (B ≀ 64, 4 ≀ T ≀ 65) = <lang> before <s1> lowercased letters (≀ 60) <s2> after per word, pad [B, T] int32 (1 = padding); output best [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's g2p.json.gz unzipped: 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: 0 af_heart, 1 bf_isabella, 2 am_puck, 3 bm_fable (v1.2/config.json).
  • Phonemes are misaki's, American for af_/am_ and British for bf_/bm_ (en.G2P(british=True)), as upstream. FluidAudio reads the British voices through gb_lexicon_cache.json in 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_ONLY or CPU_AND_NE only; ALL / CPU_AND_GPU abort 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
  • F may be 1…4000 (100 s at speed 1). Split longer input into chunks of ≀ 510 phonemes.
  • noise is 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 ΙΎ β†’ T and glottal stop Κ” β†’ t: lexicon-only frontends that skip it garble words like "kittens" and "satellite".
  • Use CPU_ONLY or CPU_AND_NE. Do not use ALL / 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
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Model tree for FluidInference/paradee-8m-coreml

Quantized
(3)
this model

Paper for FluidInference/paradee-8m-coreml