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 install the wheel from the repo, first synth pulls the ~12 MB voice model + ~18 MB stress model (cached after that); or pass model_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" / "жена" or voice="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.1

from 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 ♡