Fluent Books: small Spanish voices (ONNX)
Ten small text-to-speech models for the Fluent Books reader app (read a Spanish book aloud, on the phone's processor). Each file is one voice: the voice is baked into the weights, the input is a
sequence of Kokoro phoneme ids and a speed, the output is a 24 kHz waveform and the duration of every token (waveform [1,S], durations [1,T], S = 600 * sum(durations)).
They are students distilled from the Spanish voices of Kokoro-82M (ef_dora, em_alex, em_santa): one student per voice, trained on a mix of Castilian and Latin American phonemes
(the dialect is chosen by the phonemes you give: theta and ll for Castilian, seseo and yeismo for Latin American). Two recipes: A (8.6 MB) and L60 (12.5 MB, 60 harmonics, males only);
the name ends with the weight of the phase critic in the last training stage (ph3, ph10). The metrics could not tell the two weights apart: pick by ear.
| file | voice id in the app | MB | sha256 |
|---|---|---|---|
es_ef_dora_A_ph3_int8.onnx |
ef_dora.a3 |
8.57 | b4e81f6d0286 |
es_ef_dora_A_ph10_int8.onnx |
ef_dora.a10 |
8.57 | ab943156cc79 |
es_em_alex_A_ph3_int8.onnx |
em_alex.a3 |
8.57 | b1fa324b9b32 |
es_em_alex_A_ph10_int8.onnx |
em_alex.a10 |
8.57 | b5c666cc9e36 |
es_em_alex_L_ph3_int8.onnx |
em_alex.l3 |
12.52 | f0496db04162 |
es_em_alex_L_ph10_int8.onnx |
em_alex.l10 |
12.52 | d2c791ab2da3 |
es_em_santa_A_ph3_int8.onnx |
em_santa.a3 |
8.57 | fe27d8855426 |
es_em_santa_A_ph10_int8.onnx |
em_santa.a10 |
8.57 | 53419a80dd12 |
es_em_santa_L_ph3_int8.onnx |
em_santa.l3 |
12.52 | f63373ca68fb |
es_em_santa_L_ph10_int8.onnx |
em_santa.l10 |
12.52 | abb072f34473 |
How to use
Phonemes: the rules in es_g2p_rules.py of the Fluent Books repository (a Swift port is in the app, SpanishPhonemizer) imitate espeak-ng's es output, which is what Kokoro was trained on; the symbols must be in
Kokoro's vocabulary (vocab.json, 114 symbols). input_ids = [0] + ids + [0] (int64, shape [1,N]), speed = [1.0] (float32, shape [1]).
Measured
| model | file | source | MB | sha256 | UTMOS (teacher) | WER % | voice similarity | characteristics above the threshold of 31 | phase / noise / clarity, sigma of the teacher | replaces in the app |
|---|---|---|---|---|---|---|---|---|---|---|
| ef_dora A w10 | es_ef_dora_A_ph10_int8.onnx |
vm2:es_ef_dora/models/es_ef_dora_A_s0_sw3_ph10 | 8.57 | ab943156cc79 |
3.37 (3.67) | 2.1 | 0.973 | 4 (phase, noise, clear, drop) | +2.15 / +1.82 / +1.80 | (nothing: no Spanish voice in the app) |
| ef_dora A w3 | es_ef_dora_A_ph3_int8.onnx |
vm2:es_ef_dora/models/es_ef_dora_A_s0_sw3_ph3 | 8.57 | b4e81f6d0286 |
3.36 (3.67) | 1.9 | 0.976 | 5 (phase, noise, clear, drop, hum) | +2.30 / +1.89 / +1.85 | (nothing: no Spanish voice in the app) |
| em_alex A w10 | es_em_alex_A_ph10_int8.onnx |
vm2:es_em_alex/models/es_em_alex_A_s0_sw3_ph10 | 8.57 | b5c666cc9e36 |
3.08 (3.41) | 2.1 | 0.968 | 2 (phase, clear) | +1.58 / +0.95 / +1.32 | (nothing: no Spanish voice in the app) |
| em_alex A w3 | es_em_alex_A_ph3_int8.onnx |
vm2:es_em_alex/models/es_em_alex_A_s0_sw3_ph3 | 8.57 | b1fa324b9b32 |
3.13 (3.41) | 2.0 | 0.970 | 3 (phase, clear, drop) | +1.47 / +0.90 / +1.19 | (nothing: no Spanish voice in the app) |
| em_santa A w10 | es_em_santa_A_ph10_int8.onnx |
vm2:es_em_santa/models/es_em_santa_A_s0_sw3_ph10 | 8.57 | 53419a80dd12 |
2.47 (2.89) | 2.1 | 0.975 | 3 (phase, noise, drop) | +1.38 / +1.17 / +0.60 | (nothing: no Spanish voice in the app) |
| em_santa A w3 | es_em_santa_A_ph3_int8.onnx |
vm2:es_em_santa/models/es_em_santa_A_s0_sw3_ph3 | 8.57 | fe27d8855426 |
2.54 (2.89) | 2.1 | 0.976 | 3 (phase, noise, drop) | +1.41 / +1.11 / +0.69 | (nothing: no Spanish voice in the app) |
| em_alex L w10 | es_em_alex_L_ph10_int8.onnx |
vm1:es_em_alex_L/models/es_em_alex_L_L_s3_sw3_ph10 | 12.52 | d2c791ab2da3 |
3.09 (3.41) | 2.0 | 0.973 | 2 (phase, noise) | +1.67 / +1.18 / +0.97 | (nothing: no Spanish voice in the app) |
| em_alex L w3 | es_em_alex_L_ph3_int8.onnx |
vm1:es_em_alex_L/models/es_em_alex_L_L_s3_sw3_ph3 | 12.52 | f0496db04162 |
3.13 (3.41) | 2.0 | 0.975 | 2 (phase, noise) | +1.68 / +1.31 / +0.97 | (nothing: no Spanish voice in the app) |
| em_santa L w10 | es_em_santa_L_ph10_int8.onnx |
vm1:es_em_santa_L/models/es_em_santa_L_L_s3_sw3_ph10 | 12.52 | abb072f34473 |
2.56 (2.90) | 2.0 | 0.977 | 2 (phase, noise) | +1.25 / +1.18 / +0.60 | (nothing: no Spanish voice in the app) |
| em_santa L w3 | es_em_santa_L_ph3_int8.onnx |
vm1:es_em_santa_L/models/es_em_santa_L_L_s3_sw3_ph3 | 12.52 | f63373ca68fb |
2.65 (2.90) | 1.8 | 0.978 | 2 (phase, noise) | +1.31 / +1.15 / +0.63 | (nothing: no Spanish voice in the app) |
Measured on 60 held-out sentences (vn_eval_x.sh, Whisper large-v3 es; the teacher's own WER is in the DONE files) and by the detector (tools/distill/artifact_card31.py, the reference = the teacher recordings of the same voice). The detector's thresholds are English-voice thresholds; em_santa has a weak teacher (UTMOS 2.89, UTMOS is trained on English), so its sigmas are small for the wrong reason. The detector measures, the ear decides.
Measured on 60 held-out sentences (Whisper large-v3 es; the teacher's own WER 1.8-2.4 %); every model has 0 contract violations. A second check before publication (20 sentences per model, 10 per dialect,
phonemes of the Swift port through onnxruntime) gave 3.0-3.9 % WER, of which 3.0 % are three reference artifacts (Vd., mas, a name), and one Whisper hallucination at the end of a clip.
Open points (read before you rely on these)
- Data of the teacher. The students were trained on speech synthesized by the Kokoro-82M voices
ef_dora,em_alex,em_santa, and on sentences from public-domain books (Project Gutenberg, authors who died before 1940). Kokoro-82M is Apache-2.0; where the data of its Spanish voices comes from is not confirmed by the authors of this repository. The weights are stated as Apache-2.0 on the reading of those sources. - No native listener yet. The dialect (theta, seseo, yeismo) and the naturalness of the stress are not measured by any automatic metric; a native speaker has not listened to these models.
- The detector's thresholds (31 characteristics of "metal/noise") come from English voices and are only a guide for Spanish; UTMOS is trained on English and under-rates Spanish.
- Text must be normalised first (numbers, Roman numerals, dates); the rules read letters and the punctuation
, . ; : ! ? - ... " "only.
Trained 7 November 2026. Source: the Fluent Books project (tools/distill, docs/spanish-speech-engine-research-2026-11-05.md).