Accept the SteerTTS licence (non-commercial use only)
This repository is publicly accessible, but you have to accept the conditions to access its files and content.
SteerTTS Nano weights and voices are licensed by Whissle Inc. under CC BY-NC 4.0 and the terms in LICENSE.md, for non-commercial use only (the package code is under the same licence). Commercial use (in or with a product, device or service, paid or hosted services, business use, or commercial use of generated audio) requires a separate written licence from Whissle Inc.: contact ksingla@whissle.ai. Whissle Inc. keeps all rights not expressly granted; no patent or trademark rights are granted.
Log in or Sign Up to review the conditions and access this model content.
SteerTTS Nano
A tiny, steerable English text-to-speech model for microcontrollers: 2.97 MB of int8 weights, 16 kHz output, built for an ESP32-S3 without PSRAM (weights are read from memory-mapped flash; 122 KB of working RAM, measured). The same steering API as SteerTTS: 2 built-in voices, 51 style tags, 12 numeric controls and per-word prosody.
| weights | nano.bin (2.97 MB, int8, format STNB v1) |
| device front end | front.bin (1.8 MB: lexicon, G2P, text rules; flashed next to nano.bin) |
| output | 16 kHz mono, streamed in chunks |
| compute | 0.12 GMAC per second of audio |
| voices | nano_01 (female), nano_02 (male) |
Results
Open TTS Leaderboard protocol (Seed-TTS, CV3-Eval and MiniMax English sets; Qwen3-ASR word error rate; UTMOS),
run with steertts_nano, i.e. the same int8 arithmetic as the device:
| Seed-TTS | CV3-Eval | MiniMax | Average | |
|---|---|---|---|---|
| WER | 0.95 % | 1.59 % | 0.26 % | 0.93 % |
| UTMOS | 3.63 | 3.57 | 3.51 | 3.57 |
Self-run with the official pipeline; not an official leaderboard entry. Output is 16 kHz.
Steering (speaker-relative z requests from -2 to +2, read back from the audio): mean rank correlation 0.89 over the 12 controls, 9 of 12 at 0.85 or higher; measured on the two built-in voices.
Measured on an ESP32-S3 (240 MHz, one core, no PSRAM, 8 MB flash, Arduino-ESP32 2.0.17):
| real-time factor | 0.66 (10 s of speech in 6.6 s); 0.67 from text |
| first audio | 0.35 s after the text arrives |
| working RAM | 122 KB |
| flash | 2.97 MB weights + 1.8 MB text front end |
| int8 network | bit-exact with steertts_nano |
Words outside the pronunciation dictionary go through a small neural G2P on the device and take about 0.27 s each.
Use (reference runtime, numpy)
from steertts_nano import NanoTTS
tts = NanoTTS(".")
wav = tts("The meeting moved to Thursday at 3 PM.", voice="nano_01", tag="happiness", ctrl={"rate": 1.0})
tts.save(wav, "out.wav")
wav = tts("I never said she stole it.", word_shift={1: {"pitch": 3, "energy": 4, "dur": 1.3}})
steertts_nano runs nano.bin with exactly the arithmetic of the ESP32 firmware (int8 weights and activations), so
its output matches the device sample for sample. The firmware (C, ESP-IDF / Arduino) is in the esp32/ folder of
the SteerTTS repository.
Output level. NanoTTS returns audio at a normal playback level: each voice's neutral speech at -17 LUFS, peaks
capped at -1 dBTP by a soft limiter, and steering keeps its relative level (loud, soft and whispers stay louder or
quieter than neutral). level="off" returns the raw model output, which is what matches the device's synthesis sample
for sample; level="clip" normalises every clip to exactly -17 LUFS; gain_db= overrides the gain and gate=True
adds the firmware's optional pause gate. The per-voice gains are the output block of config.json.
Controls (speaker-relative z, -5 .. 5; an omitted control is left to the model): rate, loud, f0_med, f0_iqr, f0_end, pause, tilt, voiced, flat, centroid, cpps, h1h2.
Licence
CC BY-NC 4.0 + Whissle terms (non-commercial use only); see LICENSE.md and NOTICE. Commercial licences:
ksingla@whissle.ai. Copyright (c) 2026 Whissle Inc.
- Downloads last month
- -
Model tree for WhissleAI/steer-tts-nano
Base model
WhissleAI/steer-tts