Fluent Books: 8.6 MB Spanish Kokoro Voices

Introduction
A pocket-sized Spanish voice pack just landed on Hugging Face: lazarenkod/fluent-books-voices-es (created 2026-11-07T20:20Z, trained the same day). It is ten small text-to-speech models built for the Fluent Books reader app, which reads Spanish books aloud on the phone's own processor.
Each file is one voice baked into the weights, distilled as a student from Kokoro-82M's Spanish speakers ef_dora, em_alex, and em_santa. The A recipe weighs 8.6 MB; the L60 recipe (60 harmonics, male voices only) weighs 12.5 MB. Output is a 24 kHz waveform plus a duration for every token, so you get word timing for free.
What Shipped
- Vendor / product: Fluent Books Spanish voices (lazarenkod), students of Kokoro-82M
- Modality: open-weight Spanish text-to-speech, three fixed voices, no cloning
- Open vs closed: stated as Apache-2.0, int8 ONNX files with SHA256 checksums and a
catalog.json - Runnable today: any onnxruntime runtime (Python, mobile, Swift); you supply Kokoro phoneme ids
- Concrete fact: 60 held-out sentences scored about 1.8–2.1% WER with Whisper large-v3, close to the teacher's own 1.8–2.4%
One Voice, Two Dialects
- The dialect comes from the phonemes you feed in, not a separate model: theta and ll give Castilian, seseo and yeísmo give Latin American
- Each voice was trained on a mix of both, so one file covers Spain and the Americas
- Filenames end in
ph3orph10, the weight of the phase critic in the last training stage; the author says the metrics could not separate them, so pick by ear - Voices:
ef_dora(female, A recipe),em_alexandem_santa(male, A and L60 recipes)
Pro Tip
Normalize text before phonemizing. The rules only read letters plus basic punctuation, so numbers, Roman numerals, and dates should be spelled out first or they will be skipped or garbled.
How to Run It
The model takes input_ids (int64, shape [1, N], wrapped as [0] + ids + [0]) and speed (float32, shape [1]). Phonemes should imitate espeak-ng es output and use Kokoro's 114-symbol vocabulary; the Fluent Books project's es_g2p_rules.py (Swift port SpanishPhonemizer) does that.
import numpy as np, onnxruntime as ort, soundfile as sf
sess = ort.InferenceSession("es_ef_dora_A_ph3_int8.onnx")
ids = [0] + phoneme_ids + [0] # Kokoro vocab ids from your es phonemizer
wave, durations = sess.run(None, {
"input_ids": np.array([ids], dtype=np.int64),
"speed": np.array([1.0], dtype=np.float32),
})
sf.write("hola.wav", wave.reshape(-1), 24000)Limits to Know
- The teacher data behind Kokoro's Spanish voices is not confirmed by this repo's author; the Apache-2.0 claim rests on Kokoro's own license and public-domain Gutenberg sentences used for distillation
- No native Spanish listener has rated dialect accuracy or stress naturalness yet
- The author's artifact detector and UTMOS were tuned on English, so
em_santa(the weakest teacher) may look better on paper than it sounds - No cloning, no emotion control, three speakers only
Where It Fits
- Offline audiobook and reader apps that need Spanish speech under 10 MB per voice
- Word-synced highlighting, since every token comes back with a duration
- A practical recipe for shrinking Kokoro voices into single-speaker int8 students when you only need one language
Conclusion
Fluent Books turns three Kokoro Spanish speakers into tiny phone-ready voices with both dialects in one file. If you already run a Kokoro-style phonemizer, this is a drop-in way to cut size, and the checksums make it easy to pin exactly what you shipped.
—Anabel ♡
