Lahgtna-OmniVoice Egyptian — v3 (multi-voice, non-diacritized)
Multi-voice Egyptian-Arabic (arz) TTS. v3 continues from v2 on raw, non-diacritized
text to fix pronunciation problems caused by MSA diacritics on Egyptian colloquial. It speaks
two trained voices (Eqkawkab + Noselleel) and clones any reference voice zero-shot.
Recommended model for a multi-voice product — best multi-voice intelligibility, best on
numbers, and lowest latency (no diacritizer at inference).
👪 Model family
| repo | voices | text | notes | |
|---|---|---|---|---|
| base | lahgtna-omnivoice-v2 | — | diacritized | upstream |
| v1 | egyptian | 1 | diacritized | best CER, single voice |
| v2 | egyptian-v2 | 2 | diacritized | multi-voice |
| v3 ← you are here | egyptian-v3 | 2 | raw | recommended |
| 🎛️ Compare GUI | Space | — | — | 4-model A/B |
| 📚 Data | eqkawkab · noselleel | — | — | ~34h |
Usage — feed RAW Egyptian text (no diacritics)
import torch, soundfile as sf
from omnivoice.models.omnivoice import OmniVoice
m = OmniVoice.from_pretrained("ehabnegm/lahgtna-omnivoice-egyptian-v3", device_map="cuda", dtype=torch.float16)
audio = m.generate(text="أهلاً بحضرتك، معاك خدمة العملاء، ممكن أساعدك إزاي؟", language="arz",
ref_audio="voice.wav", ref_text="نص الكليب المرجعي")
sf.write("out.wav", audio[0], 24000)
Verbalize numbers (e.g. ٢٥ → خمسة وعشرين) and strip/transliterate English words before
synthesis (v3 attempts untrained English otherwise).
▶️ Run on Colab
Free GPU, step-by-step: COLAB.md · runnable notebook: lahgtna_colab.ipynb (open it in Colab → Runtime → T4 GPU). Log in with a HF read token (repo is private).
Training
Combined ~34 h, 10,828 clips (Eqkawkab ~8h + Noselleel ~26h), raw + orthography-normalized
text. Continued from v2 checkpoint-8000, 5,000 steps, SDPA, bf16, 1× L4.
Benchmark (ASR round-trip CER, 13 pure-Arabic sentences — lower = clearer)
| model | CER ↓ | |
|---|---|---|
| v1 | 0.056 | single-voice |
| v3 | 0.063 | best multi-voice |
| v2 | 0.102 | multi-voice, diac |
| base | 0.109 | |
| v3 beats v2 by ~38% on pure-Arabic — removing the wrong diacritics worked. Full benchmark + | ||
audio: v2 repo /benchmark. |
321-word long-form stress test
A full Egyptian-Arabic article (~321 words, ~2:50) synthesized by each model, then transcribed back with Whisper large-v3 (ASR round-trip CER — lower = stays on-text).
| model | audio | RTF | CER ↓ |
|---|---|---|---|
| v3 | 173 s | 0.25 | 0.21 — stays coherent ✅ |
| base | 170 s | 0.35 | 0.69 — drifts ⚠️ |
| v1 | 170 s | 0.35 | 0.71 — drifts ⚠️ |
| v2 | 170 s | 0.43 | 0.71 — drifts ⚠️ |
Finding: on paragraph-length input the diacritized models (base/v1/v2) lose coherence and
babble; v3 (non-diacritized) is the only version that stays on-text — decisive for long-form
and agent replies. Listen: base.wav, v1.wav, v2.wav, v3.wav.
Audio: long300/.
Limitations & responsible use
Code-switched English is not trained (strip/transliterate it). Audio derived from public YouTube channels (@Eqkawkab, @noselleel) — credit the creators, get permission before commercial use, and don't use the voices to impersonate or mislead.
Latency — time-to-first-chunk (streaming, raw text)
Dropping the diacritizer makes v3 ~250 ms faster than v2 at every setting:
| num_step | TTFC |
|---|---|
| 32 | 1.82 s |
| 16 | 0.96 s |
| 8 (recommended) | 0.54 s |
| 4 (fastest) | 0.32 s |