Local TTS for embedded devices with a voice interface: selection and a practice example
Goal
We were looking for a natural-sounding text-to-speech (TTS) engine that meets five conditions:
- Open source, no proprietary black box, free licence.
- No real speaker, the model not trained on a real person, no personality rights, no legal hurdles for commercial use. For products maintained over twenty years and more there is also a practical angle: even the same speaker ages, timbre and intonation cannot be reproduced identically years later, not even by the original person.
- Best possible speaker quality, a neural voice, no robotic TTS.
- Real-time capable, output faster than real-time.
- No internet, fully local, no cloud service, no API key.
The result of the search is the engine Kokoro-82M. This report documents the choice, fact-checks the five criteria, and closes with a concrete example from RC modelling to show what an implementation looks like.
The engine: Kokoro-82M
Kokoro-82M is a neural text-to-speech model with roughly 82 million parameters, released under Apache-2.0. It is deliberately small and runs on modest hardware. An 8 GB NVIDIA card helps, but is not required; CPU operation works. No voice cloning, no third-party voice material.
For embedded applications with a small MCU, live synthesis is rarely the path anyway: the announcements are rendered once on a PC and stored as WAV files in flash or on an SD card, the MCU only has to play them back. On larger boards like a Raspberry Pi®, Kokoro-82M does run live, but with caveats: community reports for a Pi 5 CPU-only put the real-time factor roughly in the range of 1 to 2, i.e. just above real-time. Anyone taking this into production should measure on the target and either pre-render or plan for an NPU / GPU accelerator.
Rough guidance for smaller ARM® Linux® SoCs (i.MX6 class or similar): live CPU-only synthesis is realistically not on the table, the RTF slips well above 1, i.e. slower than real-time, if the model loads at all. For this class pre-rendering is the only pragmatic answer: generate once on a developer machine, deploy the WAV files to the target, play them there.
Fact check
| Criterion | Requirement | Finding | Evidence |
|---|---|---|---|
| Open source | free licence | met | Kokoro-82M under Apache-2.0 |
| No real speaker | no personality rights | met | Kokoro-82M README: no voice cloning, no third-party voice material in training |
| Speaker quality | neural, high-quality | met, with context | Kokoro-82M reached position 1 on the TTS Arena leaderboard in January 2026 among models that run fully locally or in the browser (ELO ~1058), beating much larger models. In the overall leaderboard (incl. large cloud services) it sits in the mid-field. For an 82 M model the quality is exceptional. |
| Real-time capable | faster than real-time | met | Real-time factor (RTF) ~0.03 on an A100 GPU (about 30x real-time); on a laptop without GPU still about 6x real-time. Live synthesis is therefore possible. |
| No internet | fully offline | met | Runs completely locally on own hardware. No cloud service, no API key. Model (~330 MB) is loaded once. |
The downside: no German voice
The one real trade-off: Kokoro has no German language model. The README puts it plainly, German (and Korean, Polish, Czech, Danish) is not supported by this engine. Solidly supported is English; technically feasible are Spanish, French, Italian, Portuguese and Japanese.
There are community efforts to fine-tune Kokoro on German (including a multi-speaker stage-1 base model on around 51 hours of audio, and first ONNX exports). None of them is, at the time of this report, a finished production-ready German single voice, they are intermediate states for further training. Anyone who needs a German announcement today will not get there with this engine.
Application areas
An offline, good-sounding, licence-free TTS engine fits many tasks that used to require either a cloud service, an expensive commercial model, or a robotic speech synthesiser:
- Embedded devices with a voice interface: household and industrial devices, medical devices, control panels, diagnostic instruments. Voice announcements without cloud, without licence hooks, in a uniform quality.
- Public announcements: train station, museum, exhibition, factory tour. Clean rights situation under Apache-2.0, no recurring fees.
- Hobby and RC modelling: transmitters, simulators, companion computers.
- Training and learning environments: voice output in simulators, test benches, rigs where deterministic, repeatable announcements are needed.
The common thread: many announcements from different sources should sound consistent, without dependency on an external service and without licence risk.
Practice example: rc-voices for EdgeTX
As a concrete application example, we built a tool on top of this engine: rc-voices →, which generates complete voice packs for EdgeTX transmitters in RC modelling, locally.
The reason for the effort is the everyday life at the transmitter: during operation many different announcements come together, system sounds from the transmitter vendor, telemetry from the flight controller (INAV, Betaflight, Yaapu), custom flight-mode callouts. INAV is an open source flight controller with a navigation focus and one of the more popular ones in the hobby world, used across a wide range of vehicles: fixed-wing planes, flying wings, multirotor (quad, hexa, octo), VTOL, and even rovers or boats. When these announcements are mixed from different voice packs with different speakers, it sounds restless and unprofessional. A consistent voice across every announcement is the real value.
rc-voices produces exactly that: 766 announcements per pack, from one chosen voice. 18 voices are available, the default is af_nicole at a slightly measured tempo (speed 0.9). Licence: Apache-2.0.
Important for the context: rc-voices uses the engine in batch mode, renders the announcements once into WAV files and assembles the voice pack from them. The real-time capability of the engine is not the core requirement here, but it opens up further applications (live announcements from a companion computer, for example).
The texts as JSON
The announcements themselves live in a handful of JSON files under lists/, each a flat mapping from filename to spoken text:
{
"INAV/engarm.wav": "engines armed",
"INAV/engdrm.wav": "engines disarmed",
"INAV/batlow.wav": "Low battery",
"stop3.wav": "Goodbye. Foam and glue, good as new."
}
The principle: text and filename are mapped. The text feeds into the synthesis, the filename decides where the output lands in the target system, so the EdgeTX firmware finds it at the expected path with the expected name. The lists are split by topic: edgetx_full.json for the full EdgeTX standard set, messages.json for free start-up and shutdown lines, inav_new_modes.json for aerobatic modes from experimental INAV branches that have not yet landed in EdgeTX. From these sources the build script assembles a combined synthesis list and then renders entry by entry through the engine.
Anyone who wants to lift the approach for their own device just swaps the JSON: adjust the filenames to the target firmware, phrase the texts for the target domain, run the build script. The structure stays the same.
Four voices, four announcements
Kokoro offers a broad range of voices, from deep male through neutral to warm female, with finely graded timbres in between. The four examples below are exactly the four entries from the code example above, each rendered in a different Kokoro voice. Click the player to listen.
| Announcement (text) | Voice | Listen |
|---|---|---|
| Low battery | am_michael (male, deep) | |
| engines armed | am_puck (male, punchy) | |
| Goodbye. Foam and glue, good as new. | af_nicole (female, default) | |
| engines disarmed | af_bella (female, warm) |
The script itself is deliberately simple and can be adapted for other applications, anywhere a set of announcements with a consistent voice is needed.
Conclusion
Kokoro-82M is a clean choice for the stated requirements: freely licensed, trained without a real speaker, offline, real-time capable, and with a speaker quality that sits at the top of its class among locally runnable models. The lack of a German voice is the single, clearly stated limitation.
The rc-voices example shows how the engine can be turned into a concrete application with little code. The same approach carries to control panels, diagnostic instruments or public announcements, anywhere a consistent voice is needed locally and licence free.
Sources
- Kokoro-82M → (hexgrad, Apache-2.0)
- rc-voices → (README, Apache-2.0)
- TTS Arena leaderboard 2026 (Kokoro rank 1 among locally / browser-runnable models)
- German community efforts: semidark/kokoro-deutsch, Godelaune/Kokoro-82M-ONNX-German-Martin
Keywords: Kokoro-82M, offline local TTS, rc-voices, EdgeTX voice pack, INAV callouts, embedded voice interface, Apache 2.0 TTS, neural speech synthesis without cloud, local AI model integration, embedded AI consulting Switzerland, swissEmbedded consulting
Deploying local AI models in embedded projects? We help select suitable open models, check licence and resource footprint, and build the local pipelines around them.