
Description
< #Speech Synthesis #TTS #On-Device AI #Embedded #WebAssembly #Offline #Open Source
sanoTTS is a family of deliberately tiny neural text-to-speech models, ranging from 294k to 2.27M parameters. The smallest one packs duration, acoustic and decoder models into just 337KB of int8 weights. The name comes from the Nepali word "सानो", which simply means "small". It needs no cloud and no NPU: the whole inference stack runs in real time on an ESP32-S3 that costs about $3.
The other path is the browser. Everything is compiled to WebAssembly, so phonemization and synthesis both happen on the visitor’s own machine and the text never leaves the device. There are currently 11 voices across 6 languages — English, Nepali, Hindi, Vietnamese, Indonesian and Chinese — with Python, NPM and Arduino / PlatformIO entry points all ready to use. A good fit for anyone who wants to give a small board, a toy or a plain static page a voice of its own.
Extremely small models: The family spans 294k to 2.27M parameters and most single voices ship under 4MB, an entirely different order of magnitude from mainstream TTS models measured in hundreds of megabytes.
Real-time synthesis on a microcontroller: Full neural inference runs on an ESP32-S3, where an int8 quantized iSTFT decoder pushes audio straight out of a GPIO — add an LM386 and a speaker and the board talks.
In-browser local synthesis: The WebAssembly build needs no backend at all; the official demo page lets you type text, pick a voice and listen on the spot, with the whole synthesis happening client-side.
11 voices in 6 languages: English offers amy, kristin, hfc, heart and more, alongside Nepali, Hindi, Vietnamese, Indonesian and Chinese voices that can be downloaded individually.
Three ways to integrate: pip install sanotts on the Python side gives you both a CLI and a library; npm install sanotts-web on the web side, or copy the static files directly; and the embedded side ships an Arduino library plus a PlatformIO dependency URL.
Dependency-free inference: An espeak-ng phonemizer is bundled in, and the Python path is pure numpy — no torch and no onnxruntime required — keeping both install size and startup cost light.
Competitive naturalness for its size: Measured with one no-reference suite (SCOREQ / UTMOS / DNSMOS), the 1.46M-parameter amy voice takes the best naturalness scores among everything up to the 15M-parameter class.
Train your own voice: The docs lay out the full distillation recipe, from building a probe pack through training the duration, acoustic and decoder stages to exporting int8, plus a guide for porting a new language.
Open source project: The source code is hosted on GitHub, so developers can study the implementation, contribute, or customize it for their own needs.
sanoTTS is a family of deliberately tiny neural text-to-speech models, ranging from 294k to 2.27M parameters. The smallest one packs duration, acoustic and decoder models into just 337KB of int8 weights. The name comes from the Nepali word "सानो", which simply means "small". It needs no cloud and no NPU: the whole inference stack runs in real time on an ESP32-S3 that costs about $3.
The other path is the browser. Everything is compiled to WebAssembly, so phonemization and synthesis both happen on the visitor’s own machine and the text never leaves the device. There are currently 11 voices across 6 languages — English, Nepali, Hindi, Vietnamese, Indonesian and Chinese — with Python, NPM and Arduino / PlatformIO entry points all ready to use. A good fit for anyone who wants to give a small board, a toy or a plain static page a voice of its own.
Features
Extremely small models: The family spans 294k to 2.27M parameters and most single voices ship under 4MB, an entirely different order of magnitude from mainstream TTS models measured in hundreds of megabytes.
Real-time synthesis on a microcontroller: Full neural inference runs on an ESP32-S3, where an int8 quantized iSTFT decoder pushes audio straight out of a GPIO — add an LM386 and a speaker and the board talks.
In-browser local synthesis: The WebAssembly build needs no backend at all; the official demo page lets you type text, pick a voice and listen on the spot, with the whole synthesis happening client-side.
11 voices in 6 languages: English offers amy, kristin, hfc, heart and more, alongside Nepali, Hindi, Vietnamese, Indonesian and Chinese voices that can be downloaded individually.
Three ways to integrate: pip install sanotts on the Python side gives you both a CLI and a library; npm install sanotts-web on the web side, or copy the static files directly; and the embedded side ships an Arduino library plus a PlatformIO dependency URL.
Dependency-free inference: An espeak-ng phonemizer is bundled in, and the Python path is pure numpy — no torch and no onnxruntime required — keeping both install size and startup cost light.
Competitive naturalness for its size: Measured with one no-reference suite (SCOREQ / UTMOS / DNSMOS), the 1.46M-parameter amy voice takes the best naturalness scores among everything up to the 15M-parameter class.
Train your own voice: The docs lay out the full distillation recipe, from building a probe pack through training the duration, acoustic and decoder stages to exporting int8, plus a guide for porting a new language.
Open source project: The source code is hosted on GitHub, so developers can study the implementation, contribute, or customize it for their own needs.


