The smallest neural text-to-speech family A neural text-to-speech family called sanoTTS, described by its makers as the smallest they know of, runs entirely client-side in the browser, with its 1.46M-parameter "amy" voice scoring 4.13 on SCOREQ and 4.10 on UTMOS across a 24-sentence test set, ahead of TinyTTS (3.94/3.65) and Inflect Nano (3.81/3.65). The stack — duration, acoustic and decoder stages quantized to int8, with espeak-ng compiled to WebAssembly at 275 KB and a 448 KB pinyin lexicon for Chinese — ships 28 voices across 16 languages, and the on-device English voice runs at 0.22× real time on an ESP32-S3. The developers report Kokoro is 36× larger than their largest voice and 279× larger than their smallest, with shipped files of 2.8 MB fp16 for sanoTTS amy and 3.5 MB fp16 for TinyTTS against Kokoro's roughly 330 MB fp32. The smallest neural text-to-speech family we know of — and it plays right here, live, in your browser. a full neural stack — duration → acoustic → decoder — quantized to int8, phonemizer and all. 28 voices, 16 languages, all spoken on this page. Type anything. The text is phonemized by espeak-ng compiled to WebAssembly the same 275 KB port that runs on the chip; Chinese uses a 448 KB pinyin lexicon instead and spoken by that voice's own neural stack — all client-side, no server. Pick a voice: | Phonemes | — | | Audio produced | — | | Time this CPU | — | | Speed on this machine | — | The speed shown is this browser on your CPU — the on-device English voice runs at 0.22× real time on an ESP32-S3. Every voice in the picker synthesizes your typed text live, right here, with no server involved. Where a language offers two sizes, the chips under its mascot switch between them. heart and heart-nano take a different route from text to sound than the other voices a 100-band mel interface into a noise-shaping decoder , so they load their own small runtime; heart-nano runs the int8 arithmetic of the microcontroller build unchanged. Measured with our no-reference harness SCOREQ / UTMOS / DNSMOS-SIG on the same 24-sentence diverse set, run identically across every model below. Size comparison parameters Kokoro is 36× larger than our largest voice — and 279× larger than our smallest. Shipped-file sizes: sanoTTS amy 2.8 MB fp16 and TinyTTS 3.5 MB fp16, both verified from the released files; Kokoro's ~330 MB fp32 is its widely cited public figure. Three metrics, head to head | | sanoTTS amy1.46M params | sanoTTS heart2.27M params | TinyTTS1.62M params | Inflect Nano4.63M params | |---|---|---|---|---| | SCOREQ | 4.13 | 3.48 | 3.94 | 3.81 | | UTMOS | 4.10 | 3.38 | 3.65 | 3.65 | | DNSMOS-SIG | 3.61 | 3.51 | 3.62 | 3.58 | Same 24-sentence set, three independent no-reference metrics; best value per row in crimson. sanoTTS amy leads on SCOREQ and UTMOS; on DNSMOS-SIG TinyTTS edges us by 0.01 — no single metric tells the whole story. heart is a different voice and recipe 24 kHz, noise-shaping decoder scored on the identical 24 sentences; heart-nano , its 294k sibling, scores 2.29 / 2.45 / 3.35 on the same three metrics. The size-quality frontier we traced Same voice amy , same duration/acoustic recipe — only decoder size changes. Quality lives in the decoder: doubling it from 1.09M to 1.84M params moves SCOREQ from 3.70 to 4.16. Every language we ship, and what we know about it WER is Whisper word error rate over 16 held-out Tatoeba sentences per language — conversational text, deliberately a different domain from the corpus these voices were distilled on. The sample buttons synthesize that language on this page, right now, through the same runtime as the picker above. Where a language ships in two sizes, both are playable. Chinese is the one exception: written Chinese has no spaces, so word error rate means nothing there and the figure is character error rate over the same 16 Tatoeba sentences, with traditional and simplified folded together. On held-out FLORES that voice scores 0.199 against its teacher’s 0.188 — the voice it replaced scored 0.468. | Language | WER | Sample | |---|---|---| | Portuguese 🇧🇷 | 0.038 | | | Italian 🇮🇹 | 0.080 | | | German 🇩🇪 | 0.099512k · 0.145 | | | Russian 🇷🇺 | 0.120 | | | Spanish 🇪🇸 | 0.147 | | | French 🇫🇷 | 0.221 | | | Indonesian 🇮🇩 | 0.256 | | | Arabic 🇯🇴 | 0.274 | | | Turkish 🇹🇷 | 0.303 | | | Czech 🇨🇿 | 0.351 | | | Polish 🇵🇱 | — | | | Romanian 🇷🇴 | 0.392 | | | Vietnamese 🇻🇳 | 0.468 | | | English 🇺🇸 | — | | | Nepali 🇳🇵 | — | | | Hindi 🇮🇳 | — | | | Chinese 🇨🇳 | 0.024CER, not WER | | Lower is better. Press play to judge the rest. What these numbers are, and are not. WER is measured with Whisper over 16 held-out Tatoeba sentences per language — directional, not precise. It says the words come through; it says nothing about whether a voice sounds good. No listening test has been run on any of the ten languages added on 2026-09-08, and none of them has a SCOREQ. Czech, Romanian and French got worse on unseen text than on the corpus they were trained on, so they are the ones to press first. Indonesian and Vietnamese are the espeak arm of a paired A/B — the phoneme path this page actually runs. Everything above is reproducible from experiments/evidence/ood-tatoeba-20260908.json , idvi-espeak-free-ab-20260904.json and heart-diverse24-remeasure-20260904.json . Open source under GPL-3.0 — builds on piper https://github.com/OHF-Voice/piper1-gpl and espeak-ng https://github.com/espeak-ng/espeak-ng . Distill your own tiny voice: github.com/Ampixa/sanoTTS https://github.com/Ampixa/sanoTTS . © 2026 Ampixa