Model reference · open weights

sanoTTS

Available as managed deployment Audio ampixa Text→speech 1 variants 1k dl/mo

sanoTTS is an open-weight audio or speech model from ampixa. AxForge deploys and operates it for you on dedicated EU-owned hardware — with the licence handled where one is required.

Available as managed deployment — configured and operated for you on dedicated EU hardware, quoted per deployment.

What it is

Released byampixa
TypeAudio & music
TaskText→speech
Runs withsanotts
Released2026-07-13
Popularity1k downloads / month
LicenceOpen, with conditions

About

What sanoTTS is

sano (सानो) — Nepali for "small." A family of tiny neural text-to-speech voices — 294k to 2.27M parameters — that run with no cloud and no NPU: real-time on a ~$3 ESP32-S3 (out a GPIO into an LM386 and a speaker), or live in the browser via WASM.

Parameter range294,279 – 2,272,145
Runs real-time on a $3 microcontrollerESP32-S3, out a GPIO into an LM386
Runs in the browserWebAssembly, no server
Per-voice footprint337 KB to 8.7 MB, zero dependencies (espeak-ng phonemizer included)
Coverage11 voices across 6 languages — English, Nepali (नेपाली), Hindi (हिन्दी), Vietnamese (Tiếng Việt), Indonesian (Bahasa), Chinese (中文)
Licenseopen source, GPL-3.0

Live demo: tts.ampixa.com/sanoTTS — every voice synthesizes your text live in the browser, no server, no upload.

Read the full model card

Download

Both packages stream their weights from this repo by default.

import sanotts
sanotts.synthesize("Hello world", voice="heart")     # downloads heart/ from here
import { SanoTTS } from 'sanotts-web';               // fetches web/voices/ from here
const tts = await SanoTTS.load();
const result = await tts.synthesize('Hello world', { voice: 'heart' });

Python needs sanotts >= 0.3.0, the browser sanotts-web >= 0.3.0. Both fall back to the GitHub releases or the Pages host if Hugging Face cannot be reached, so an outage here cannot break an install. Python packages land in ~/.cache/sanotts/; set SANOTTS_VOICE_SOURCE=hf or =github to pin one host. In the browser, passing voiceBase yourself turns the fallback off, so a self-hosted deployment never quietly reaches back to our servers.

Samples

Two clips per voice are in this repo's samples/ folder; one is embedded below. "Package here" means this repo carries that voice's weights. The three languages without one currently ship only through the browser demo and the GitHub repo's web/voices/ — their packages haven't been exported yet.

VoiceLanguageParamsSCOREQPackage hereSample
heartEnglish 🇺🇸2.27 M3.48heart/
hfcEnglish 🇺🇸1.83 M3.94hfc-en-1p8m/
amyEnglish 🇺🇸1.46 M4.13amy-en-1p46m/
kristinEnglish 🇺🇸1.40 M4.09kristin-en-1p4m/
amy-smallEnglish 🇺🇸1.08 M3.70amy-en-1p1m/
robot (on-device, int8)English 🇺🇸567 knot packaged here (int8 MCU format)
heart-nanoEnglish 🇺🇸294 k2.29heartnano/
IndonesianBahasa1.46 Mid-newstts-1p46m/
VietnameseTiếng Việt1.46 Mvi-vais1000-1p46m/
Nepaliनेपाली1.47 Mnot exported yet — see web/voices/nepali/ in the GitHub repo
Hindiहिन्दी1.50 Mnot exported yet — see web/voices/hindi/ in the GitHub repo
Chinese中文1.50 Mnot exported yet — see web/voices/chinese/ in the GitHub repo

SCOREQ is a no-reference naturalness predictor, higher is better; it is only reported for the English voices, which share one 24-sentence eval set. The other languages haven't been scored against a comparable reference yet.

Size does not order this table, and we are not going to pretend it does. amy at 1.46M scores higher than heart at 2.27M because they come from different teachers and different architectures, not because one is bigger. amy and the voices above it are the piperlite lineage, distilled from a Piper/VITS teacher at 22.05 kHz. heart and heart-nano are the newer nano lineage — 24 kHz, mel-100 → ConvNeXt1D → iSTFT, distilled from a Kokoro teacher through a frozen Vocos — which is the one that quantizes to int8 and runs on a microcontroller. The two are not interchangeable and the sanotts package picks the right runtime for you.

The heart and heart-nano scores were re-measured on 2026-09-04; the eval set, checkpoint hashes, exact commands and all 24 per-clip scores are in evidence/heart-diverse24-remeasure-20260904.json. They were scored on the float32 reference render. The shipped heart-nano int8 export tracks that render at 0.981 waveform correlation, and heart ships as float32 because its int8 export reached only 0.951 against a 0.98 gate.

The "robot" row is the 567,008-parameter model that runs on the ESP32-S3.

Install & use

PlatformInstallThen
Pythonpip install sanottssanotts say "Hello" --voice heart -o hello.wav
Web (npm)npm install sanotts-webconst tts = await SanoTTS.load(); await tts.synthesize('Hello', {voice:'heart'})
Web (no build)copy dist/ + voices/see Deploy on your own site in the GitHub README
Arduino / PlatformIOzip-install or lib_deps = https://github.com/Ampixa/sanoTTS.gitarduino/README.md
Hugging Facethis repothe voice packages above, downloaded for you by pip install sanotts
Browsernothingtts.ampixa.com/sanoTTS

Pip voices: heart, hfc, amy-1p8m, amy, kristin, vi, id, amy-1p1m, heart-nano. Pure numpy infer

From the published model card. Full card on the HuggingFace links in the sidebar.

How it works

How audio & music work

Audio or textinputAudio modelrecognise / synthesiseText or audiooutputSpeech-to-text turns audio into text; text-to-speech and music models turn text into audio.

Using it via the API

Call it like any OpenAI endpoint

Once AxForge deploys sanotts for you, it answers on the OpenAI-compatible API — the same base URL and keys as every other model. (sanotts below is illustrative; you get the exact model name on deployment.)

$ curl -sS https://api.axforge.ai/v1/audio/transcriptions \
  -H "Authorization: Bearer $AXFORGE_API_KEY" \
  -F model="sanotts" -F file=@audio.mp3

Create an account — your API key is available in the console. 3M free tokens every 30 days with every new account.

© 2026 AxForge · EU-hosted AI infrastructure Pricing Docs Trust Privacy Terms