CoolFace
Modelpublic

remixerdec/SanoTTS-GGUF

sourceHugging Facegpl-3.0updated 16d agoView on Hugging Face
0likes681downloads
Model Card

text in → ESP32 → speech out

sanoTTS-GGUF

Quantized GGUF weights for the sanoTTS model family. This release contains eight Piperlite voices, each with Q2K, Q40, and Q8_0 models, along with reference samples from the source voices and samples generated by the quantized models.

Inference is currently available through the InflectSanoTTS.cpp engine, designed for edge devices with limited memory. On an ESP32-S3, the q4_0- quantized Amy model takes approximately five seconds to speak a short phrase.

![Fresh model releases & news](https://t.me/genaimon)

Available voices

The voice names and source packages follow the base sanoTTS repository:

VoiceBase packageModels
amy`amy-en-1p46m`model_q2_k.gguf (0.64 MiB)<br>model_q4_0.gguf (0.84 MiB)<br>model_q8_0.gguf (1.52 MiB)
amy-small`amy-en-1p1m`model_q2_k.gguf (0.50 MiB)<br>model_q4_0.gguf (0.63 MiB)<br>model_q8_0.gguf (1.14 MiB)
hfc`hfc-en-1p8m`model_q2_k.gguf (0.73 MiB)<br>model_q4_0.gguf (1.07 MiB)<br>model_q8_0.gguf (1.91 MiB)
kristin`kristin-en-1p4m`model_q2_k.gguf (0.61 MiB)<br>model_q4_0.gguf (0.80 MiB)<br>model_q8_0.gguf (1.45 MiB)
vi`vi-vais1000-1p46m`model_q2_k.gguf (0.64 MiB)<br>model_q4_0.gguf (0.93 MiB)<br>model_q8_0.gguf (1.64 MiB)
id`id-newstts-1p46m`model_q2_k.gguf (0.64 MiB)<br>model_q4_0.gguf (0.92 MiB)<br>model_q8_0.gguf (1.63 MiB)
ru-irina-0p51m`ru-irina-0p51m`model_q2_k.gguf (0.24 MiB)<br>model_q4_0.gguf (0.32 MiB)<br>model_q8_0.gguf (0.56 MiB)
ru-irina-1p57m`ru-irina-1p57m`model_q2_k.gguf (0.64 MiB)<br>model_q4_0.gguf (0.93 MiB)<br>model_q8_0.gguf (1.64 MiB)

Each voice includes a lexicon.snl, a compact SNL2 lookup table that maps words to the Piper phoneme IDs needed by the text frontend. The lexicons were generated with tools/compile-sano-lexicon.py --format snl2 from the matching Piper phoneme configuration and dictionary; the English voices reuse Amy’s generated lexicon.snl because they share the same English Piper phoneme inventory. The Vietnamese and Indonesian files were generated for their respective phoneme inventories.

Audio samples

The original sample is generated from the corresponding base voice. Quantized samples use the same voice and prompt as the model named in each entry. Each quantized sample is labeled with its quantization. The Amy Q2K sample is stored as `amy/samples/modelq2_0.wav`. The Russian Irina packages currently include quantized samples only.

OriginalQuantized
Amy<br><audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/amy/samples/original.wav"></audio>Q2K — <audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/amy/samples/modelq20.wav"></audio><br>Q40 — <audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/amy/samples/modelq40.wav"></audio><br>Q80 — <audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/amy/samples/modelq8_0.wav"></audio>
Amy-small<br><audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/amy-small/samples/original.wav"></audio>Q2K — <audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/amy-small/samples/modelq2k.wav"></audio><br>Q40 — <audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/amy-small/samples/modelq40.wav"></audio><br>Q80 — <audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/amy-small/samples/modelq8_0.wav"></audio>
HFC<br><audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/hfc/samples/original.wav"></audio>Q2K — <audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/hfc/samples/modelq2k.wav"></audio><br>Q40 — <audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/hfc/samples/modelq40.wav"></audio><br>Q80 — <audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/hfc/samples/modelq8_0.wav"></audio>
Kristin<br><audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/kristin/samples/original.wav"></audio>Q2K — <audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/kristin/samples/modelq2k.wav"></audio><br>Q40 — <audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/kristin/samples/modelq40.wav"></audio><br>Q80 — <audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/kristin/samples/modelq8_0.wav"></audio>
Vietnamese<br><audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/vi/samples/original.wav"></audio>Q2K — <audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/vi/samples/modelq2k.wav"></audio><br>Q40 — <audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/vi/samples/modelq40.wav"></audio><br>Q80 — <audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/vi/samples/modelq8_0.wav"></audio>
Indonesian<br><audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/id/samples/original.wav"></audio>Q2K — <audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/id/samples/modelq2k.wav"></audio><br>Q40 — <audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/id/samples/modelq40.wav"></audio><br>Q80 — <audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/id/samples/modelq8_0.wav"></audio>
Russian Irina 0.51M<br>No original sampleQ2K — <audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/ru-irina-0p51m/samples/modelq2k.wav"></audio><br>Q40 — <audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/ru-irina-0p51m/samples/modelq40.wav"></audio><br>Q80 — <audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/ru-irina-0p51m/samples/modelq8_0.wav"></audio>
Russian Irina 1.57M<br>No original sampleQ2K — <audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/ru-irina-1p57m/samples/modelq2k.wav"></audio><br>Q40 — <audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/ru-irina-1p57m/samples/modelq40.wav"></audio><br>Q80 — <audio controls preload="metadata" src="https://huggingface.co/remixerdec/SanoTTS-GGUF/resolve/main/ru-irina-1p57m/samples/modelq8_0.wav"></audio>

Usage

Build the runtime from the InflectSanoTTS C++/GGML runtime optimized for ESP32-S3 inference:

bash
./tools/build.sh

Run the Amy q4 model with its matching lexicon on a regular CPU:

bash
build/<os>-<arch>/inflect-sano \
  --model-family sano \
  --sano-model /path/to/sanoTTS-GGUF/amy/model_q4_0.gguf \
  --sano-lexicon /path/to/sanoTTS-GGUF/amy/lexicon.snl \
  --speaking-rate 1.0 \
  -t "Hello, this is a Sano Piperlite test." \
  -o output.wav

Piperlite voices are deterministic and use a neural waveform decoder. The included lexicon supplies the word-to-phoneme lookup data, so the runtime does not need eSpeak-ng; eSpeak-ng and the phonemizer are needed when regenerating a lexicon on the host.

ESP32-S3 usage

For ESP32-S3 inference in PocketInkOS, see the PocketInkOS TTS integration for firmware build flags, runtime asset layout, and deployment details.

Conversion provenance

The quantized Amy package was produced from the base voice package using the host-only conversion pipeline:

bash
python tools/convert_sano.py \
  --input /path/to/canonical-amy-piperlite.gguf \
  --config /path/to/amy-en-1p46m/manifest.json \
  --phoneme-config /path/to/amy-en-1p46m/piper-phoneme-config.json \
  --output amy/model_q4_0.gguf \
  --quantize q4_0_e

License

The base model and its original voice packages are maintained by Ampixa. The base model repository is published under GPL-3.0. This quantized release follows that license; see `LICENSE`.