FluentVoice Pro is a small open-source tray app for Windows 11 and 10 that reads selected or copied text aloud. Until version 1.5, every natural-sounding voice came from Microsoft's online voices. They sound great, but they need the internet, and some people don't want their text to leave the PC at all.
So in v1.5.0 I added offline HD voices that run entirely on the user's computer. Here's how it works, and what I learned along the way.
Two engines: Piper and Kokoro
-
Piper (via
piper-tts): fast, small models (60-115 MB each) and lots of languages. The app ships a catalogue of 29 voices in 15 languages. -
Kokoro (via
sherpa-onnx): one 350 MB pack with very natural voices for English, Spanish, French, Italian, Portuguese and Hindi.
Nothing is bundled with the app: a voice is downloaded only when the user picks it in Settings > Voice Providers.
Downloads you can trust
Downloading model files from the internet is exactly where a desktop app can get hurt, so every file is treated as untrusted until proven otherwise:
- Allow-listed hosts only: Hugging Face (the official Piper voice library) and the official sherpa-onnx release on GitHub. Any other host, including redirects, is refused.
- Pinned SHA-256 and size for every single file in the catalogue. A file that doesn't match is deleted and never loaded, and it is checked again the first time it's used.
-
Safe archive extraction: the Kokoro pack is a
.tar.bz2, and extraction rejects absolute paths,..traversal and links.
Licences, voice by voice
"Open model" doesn't mean "free to use however you like". Each voice's training data has its own licence, so the app shows a badge next to every voice:
- Free to use: public domain, CC0, CC BY, CC BY-SA, Apache-2.0
- Personal use only: for example non-commercial recordings; the app asks for confirmation before downloading these
Voices trained on research-only data were left out, and so were Kokoro voices named after other companies' voices. The full table is generated from the catalogue into docs/VOICE_LICENSES.md.
Privacy mode and fallback
With Offline only switched on, no text is ever sent to an online voice: each language is read by a downloaded offline voice or a built-in Windows voice. And when the online voice is simply unreachable, reading continues with an offline voice in the same language. Before, a Hebrew text would fall back to an English Windows voice.
Try it
- Download (portable EXE, no Python needed): https://github.com/nickotmazgin/fluentvoice-pro/releases/latest
- Or with Scoop:
scoop bucket add nickotmazgin https://github.com/nickotmazgin/scoop-bucketthenscoop install nickotmazgin/fluentvoicepro - Source code (MIT): https://github.com/nickotmazgin/fluentvoice-pro
- On AlternativeTo: https://alternativeto.net/software/fluentvoice-pro/about/
Feedback, bug reports and voice suggestions are very welcome in GitHub Discussions.
This article was drafted by an AI assistant (Claude) from the project's code and docs, at my request, and published by me.
Top comments (0)