Instructions to use preslaff/omnivoice-bg with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use preslaff/omnivoice-bg with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-to-speech", model="preslaff/omnivoice-bg")# Load model directly from transformers import OmniVoice model = OmniVoice.from_pretrained("preslaff/omnivoice-bg", dtype="auto") - Notebooks
- Google Colab
- Kaggle
OmniVoice-BG
A Bulgarian text-to-speech model, fine-tuned from k2-fsa/OmniVoice on Bulgarian audiobook narration. It produces natural, native-sounding Bulgarian speech, removing the foreign accent that stock OmniVoice has on Bulgarian.
This is the fine-tuned model weights only. It is one of three orthogonal pillars of the full OmniVoice-BG system — the other two (a lexical stress front-end and deterministic fixed-voice cloning) live in the OmniVoice-BG codebase and are applied at serving time, not baked into the weights. For correctly-stressed, consistent narration you want all three together.
Why it exists
Stock OmniVoice can speak Bulgarian (it is among its 600+ languages), but for narration three things were wrong out of the box:
- A non-native "foreign" accent on the synthesized Bulgarian. → fixed by this fine-tuned model
- Wrong lexical stress (e.g. БУтона instead of буТОна). → fixed by the stress front-end (serving-side)
- A different voice every clip (voice design is non-deterministic). → fixed by deterministic fixed-voice cloning (serving-side)
Model details
- Architecture:
OmniVoice— a diffusion/mask-prediction language model that predicts Higgs Audio V2 codec tokens (8 codebooks @ 24 kHz). Backbone isQwen/Qwen3-0.6B. - Base model:
k2-fsa/OmniVoice(Apache-2.0) - Fine-tuned on:
raditotev/bg-audiobooks-tts(Bulgarian audiobook narration) - Sample rate: 24 kHz mono
- Size: ~2.3 GB (
model.safetensors, float32)
Training configuration
| Setting | Value |
|---|---|
| init from | k2-fsa/OmniVoice |
| steps | 3000 |
| learning rate | 1e-5, cosine, 3% warmup |
| batch | batch_tokens=1024, grad_accum=8 |
| precision | bf16 mixed |
| attention | SDPA |
| weight decay | 0.01 |
| seed | 42 |
Tuned to fine-tune on a single 16 GB GPU. See BG_FINETUNE_PLAN.md in the repo
for the full pipeline (data prep → tokenize → train → A/B checkpoint selection).
Training metrics
Full TensorBoard logs are in tensorboard/ (rendered in the
Metrics tab). Run summary over 3000 steps / 11 epochs:
- train/loss: 4.44 (step 25) → 3.99 (step 3000), min 3.88
- eval/loss: 4.07 (step 250) → 3.87 (step 2750, best) → 3.96 (step 3000)
- grad_norm: stable ~2.0–2.5 throughout; throughput: ~1.3 steps/sec
The released weights are the step-2750 checkpoint — the lowest validation
loss, selected by eval loss and confirmed by A/B listening (eval_bg_ab.py).
| eval step | 250 | 500 | 1000 | 1250 | 1750 | 2250 | 2750 | 3000 |
|---|---|---|---|---|---|---|---|---|
| eval/loss | 4.07 | 4.13 | 4.07 | 3.92 | 3.94 | 3.95 | 3.87 | 3.96 |
Usage
Install the package and run inference with this model as a drop-in replacement for stock OmniVoice:
pip install omnivoice
omnivoice-infer \
--model preslaff/omnivoice-bg \
--text "Натиснете бутона, за да започнете." \
--ref_audio narrator.wav \
--output out.wav
Or from Python:
from omnivoice import OmniVoice
model = OmniVoice.from_pretrained("preslaff/omnivoice-bg", train=False)
wav = model.generate(
text="Натиснете бутона, за да започнете.",
ref_audio="narrator.wav", # fixed reference voice for consistent cloning
)
For best results, mark Bulgarian lexical stress before passing text to the model (combining vowel + U+0301), and use a fixed reference clip with seeded greedy decoding. The OmniVoice-BG server (
omnivoice/cli/serve.py) does both automatically.
License & attribution
Apache-2.0. This is a derivative of OmniVoice by k2-fsa, also Apache-2.0. The base model and architecture are © Xiaomi Corp. Fine-tuned for Bulgarian narration as part of the TrainGen project.
- Downloads last month
- 8