Bulgarian bgmtts ONNX TTS, Two Voices

Introduction
A compact Bulgarian TTS just landed on Hugging Face: monydochev/bgmtts (created 2026-11-07T21:45:54Z). It ships a woman voice and a man voice, runs entirely on CPU with onnxruntime, and is small enough that one download (~50 MB of models) leaves you offline-ready — including a browser demo at spaces/monydochev/bgmtts-demo.
Switch speakers mid-line with [жена] / [мъж] tags, lean on a stress dictionary plus an on-device stress network for words the dictionary misses, and let the front-end expand numbers, dates, units, and abbreviations into spoken Bulgarian.
What Shipped
- Vendor / product: bgmtts — Bulgarian TTS (woman + man)
- Modality: open-weight text-to-speech for literary Bulgarian, two fixed voices, no cloning
- Open vs closed: model package under CC BY-NC 4.0; install via the published pip wheel
bgmtts-0.1.0 - Runnable today:
pip installthe wheel from the repo, first synth pulls the ~12 MB voice model + ~18 MB stress model (cached after that); or passmodel_dir=for fully offline use - Concrete fact: ~25–30× realtime on a laptop CPU (one sentence ≈ 0.1 s); output float32 24 kHz mono
Voices, Stress, and Normalization
- Voices:
voice="woman"/"жена"orvoice="man"/"мъж". Inside text,[жена]and[мъж]switch from that point on - Stress: built-in dictionary plus a neural stress net (
stress="small"18 MB default,"base"100 MB,"large"240 MB); mark exact stress with+before the vowel or a stress accent after it - Normalization: numbers, dates, times, money, units, and abbreviations expand to spoken forms
- Foreign names and brand Latinisms get approximate Bulgarian pronunciation; Latin acronyms are spelled letter-by-letter (and Cyrillic abbreviations follow word-specific rules)
Pro Tip
If a rare name or homograph keeps landing on the wrong syllable, put the stress mark in the text yourself — your marks win over the dictionary and the net.
How to Run It
pip install "bgmtts @ https://huggingface.co/monydochev/bgmtts/resolve/main/bgmtts-0.1.0-py3-none-any.whl"
bgmtts "Здравейте! Как сте днес?" -o hello.wav
bgmtts "Добър ден." -o man.wav --voice man --speed 1.1from bgmtts import TTS
tts = TTS() # downloads models once
audio = tts.synth("Здравейте! Днес е 7 ноември.", voice="woman")
tts.save(audio, "hello.wav")
print(tts.stress_text("Той вземал пари."))For fully offline runs after the first download, point TTS(model_dir="path/to/folder") at the cached repo. Speed defaults to 1.0; nudge with 0.9 / 1.2 as needed.
Quality Snapshot and Limits
The card demos café dialogue, news reads, fairy-tale narration, station announcements, and number/date lines with both voices. Intonation follows punctuation but is still not highly expressive. Limits called out upstream: Bulgarian only, stress can miss rare words and context-heavy homographs, and there is no voice cloning — just the two shipped speakers.
Where It Fits
- Local / edge Bulgarian TTS for assistants, demos, and offline tools that cannot ship a GPU stack
- Distinct from large multilingual cloning models: this is a small, language-specialized ONNX voice pair with serious front-end normalization
- Non-commercial license (CC BY-NC 4.0) — check terms before any paid product path
- Trained with support from BRAIN++, Bulgaria’s EuroHPC AI Factory
Conclusion
If you needed a tiny Bulgarian TTS that actually handles dates, stress, and two speakers without a server, bgmtts is the zero-day to try. One wheel, one download, CPU-only synth — and [жена] / [мъж] when you want a conversation, not a monologue.
—Anabel ♡
