Downloads · 30 days
0
Tushe/shami-tts-multi
shami-tts-multi is a text-to-speech model from Tushe. Use it when you need text read aloud. It is set up for transformers. The card lists the license as cc-by-nc-4.0.
One model, ten voices, one shared phonetic space. Shami-TTS Multi extends the published Shami-TTS (single-voice) to 10 speakers (5 male / 5 female) with no engine hand-off at code-switch boundaries: all dialect and sw…
Downloads · 30 days
0
Access
Public
Updated Sep 3, 2026
Repo size
169 MB
Likes
0
Public
Click a slice to open those files.
.pt155 MB · 91%
From the Hugging Face model README
One model, ten voices, one shared phonetic space. Shami-TTS Multi extends the published Shami-TTS (single-voice) to 10 speakers (5 male / 5 female) with no engine hand-off at code-switch boundaries: all dialect and switch intelligence lives in a deterministic, unit-tested text→IPA front-end, and a compact 38.7M-parameter non-autoregressive VITS does waveform generation at 24 kHz.
paper/shami_tts.pdf in this repo
(also in the GitHub repo below)hams_tts.text.frontend), not raw text — use the front-end to convert text → phoneme/language IDs.| Metric | Target | Measured | Status |
|---|---|---|---|
| Peak VRAM (acoustic model, fp32) | ≤ 3072 MB | 224 MB | ✅ |
| TTFA p50 / p95 (streaming) | < 300 ms | 46 / 199 ms | ✅ |
| RTF mean / p95 (HiFi-GAN decoder) | < 0.3 | 0.033 / 0.111 | ✅ |
| Full production path (VITS→mel→BigVGAN→trim) RTF | — | 0.105 (p95 0.159) | — |
| VRAM, VITS + BigVGAN resident | — | 814 MB | — |
| Concurrent real-time streams (RTF 0.033, sequential) | — | ~30 / GPU | — |
Benchmark: benchmark.json in this repo (15 measurements, 3 prompts × 5 runs, warmup 2).
All numbers: held-out 76-utterance eval (all 10 speakers, 24 kHz), Whisper large-v3 ASR round-trip, auto-calibrated length scale. Levantine CER is inflated by Whisper's MSA bias — relative improvements are the valid claim.
| Training stage | Pure-Lev CER | Code-switch CER | Overall CER | Dur. mean ratio @ls=1 | Worst utt. | Length-corr | mel plateau |
|---|---|---|---|---|---|---|---|
v3 — naive multi-speaker bolt-on (random cond init, c_dur 1.0) | 0.173 | 0.521 | 0.356 | 0.933 | 0.744 | −0.244 | 21–25 |
v3.1 — zero-init cond + c_dur 2.0 + long-utt ×3 oversampling | 0.188 | 0.572 | 0.390 | 1.003 | 0.867 | −0.236 | 21–25 |
v3.2 — sil/brk pause tokens + espeak ᵻ fix + lr-1e-4 polish | 0.164 | 0.503 | 0.342 | 0.928* | 0.733 | −0.160 | 19.5–21.6 |
* the sentence-final brk token reserves ~7% of total duration for the utterance-final pause;
synthesize at length_scale ≈ 1.08 for exact mean duration (auto-calibration built into
scripts/eval_checkpoint.py --auto-ls).
| Speaker | CER | Speaker | CER | |
|---|---|---|---|---|
| spk_07_female | 0.280 | spk_01_male | 0.270 | |
| spk_08_female | 0.313 | spk_04_male | 0.285 | |
| spk_09_female | 0.346 | spk_02_male | 0.309 | |
| spk_10_female | 0.350 | spk_03_male | 0.423 | |
| spk_06_female | 0.372 | spk_05_male | 0.487 | |
| female avg | 0.332 | male avg | 0.353 |
c_dur 2.0) had
drifted to 1.0 in v3 — restoring it was part of the v3.1 fix.sil (comma) / brk (sentence) symbols, appended to the frozen
inventory (88 → 90), emitted by the front-end at punctuation, with an embedding-resize warm start
(new rows zeroed). On punctuated input the model now emits real 170–380 ms pauses.ᵻ
("delay", "believe") became a literal <unk> string that char-split into garbage tokens.
Mapped ᵻ → ə (schwa) + fold-table defense.original0 = scale g, original1 =
direction v; computed weight g·v/‖v‖. Fresh HF-built cond layers materialize with both buffers
zero → 0/0 = NaN from step 0 (posterior/flow poisoned, duration path finite — the diagnostic
tell). Zero the scale, never the direction. Guard ships in hams_vits.py.spk_07_female (CER 0.280)
| text | REF | HiFi-GAN | BigVGAN |
|---|---|---|---|
| held-out #1 | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_07_female/eval00_ref.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_07_female/eval00_hifigan.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_07_female/eval00_bigvgan.wav"></audio> |
| held-out #2 | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_07_female/eval01_ref.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_07_female/eval01_hifigan.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_07_female/eval01_bigvgan.wav"></audio> |
spk_08_female (CER 0.313)
| text | REF | HiFi-GAN | BigVGAN |
|---|---|---|---|
| held-out #1 | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_08_female/eval00_ref.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_08_female/eval00_hifigan.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_08_female/eval00_bigvgan.wav"></audio> |
| held-out #2 | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_08_female/eval01_ref.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_08_female/eval01_hifigan.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_08_female/eval01_bigvgan.wav"></audio> |
spk_09_female (CER 0.346) — incl. novel pure-Levantine / English / code-switched
| text | HiFi-GAN | BigVGAN |
|---|---|---|
| held-out #1 | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_09_female/eval00_hifigan.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_09_female/eval00_bigvgan.wav"></audio> |
| held-out #2 | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_09_female/eval01_hifigan.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_09_female/eval01_bigvgan.wav"></audio> |
| novel · pure Levantine | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_09_female/novel_pure_levantine_hifigan.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_09_female/novel_pure_levantine_bigvgan.wav"></audio> |
| novel · pure English | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_09_female/novel_pure_english_hifigan.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_09_female/novel_pure_english_bigvgan.wav"></audio> |
| novel · code-switched | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_09_female/novel_codeswitched_hifigan.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_09_female/novel_codeswitched_bigvgan.wav"></audio> |
spk_10_female (CER 0.350)
| text | REF | HiFi-GAN | BigVGAN |
|---|---|---|---|
| held-out #1 | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_10_female/eval00_ref.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_10_female/eval00_hifigan.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_10_female/eval00_bigvgan.wav"></audio> |
| held-out #2 | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_10_female/eval01_ref.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_10_female/eval01_hifigan.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_10_female/eval01_bigvgan.wav"></audio> |
spk_06_female (CER 0.372)
| text | REF | HiFi-GAN | BigVGAN |
|---|---|---|---|
| held-out #1 | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_06_female/eval00_ref.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_06_female/eval00_hifigan.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_06_female/eval00_bigvgan.wav"></audio> |
| held-out #2 | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_06_female/eval01_ref.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_06_female/eval01_hifigan.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_06_female/eval01_bigvgan.wav"></audio> |
spk_01_male (CER 0.270) — incl. novel sentences
| text | REF | HiFi-GAN | BigVGAN |
|---|---|---|---|
| held-out #1 | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_01_male/eval00_ref.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_01_male/eval00_hifigan.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_01_male/eval00_bigvgan.wav"></audio> |
| held-out #2 | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_01_male/eval01_ref.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_01_male/eval01_hifigan.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_01_male/eval01_bigvgan.wav"></audio> |
| novel · code-switched | — | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_01_male/novel_codeswitched_hifigan.wav"></audio> | <audio controls src="https://huggingface.co/Tushe/shami-tts-multi/resolve/main/samples/spk_01_male/novel_codeswitched_bigvgan.wav"></audio> |
spk_02_male (CER 0.309): ref/hifi/bigvgan · spk_04_male (0.285): ref/hifi/bigvgan · spk_03_male (0.423): ref/hifi/bigvgan · spk_05_male (0.487): ref/hifi/bigvgan
import sys, torch, soundfile as sf
sys.path.insert(0, "src") # github repo: Al-aminI/hams-levantine-tts
from hams_tts.models.hams_vits import HamsVITS
from hams_tts.text.frontend import TextFrontend
from hams_tts.inference.bigvgan_vocoder import synthesize
model = HamsVITS.from_checkpoint("checkpoints/shami-tts-multi").cuda().eval()
fe = TextFrontend()
utt = fe.process("بكرا عندي meeting مع ال client, بس ال flight لت delay ساعتين.")
spk_id = model.speaker_map["spk_09_female"] # 10 voices, ids persisted in the config
# acoustic path (224 MB VRAM, RTF 0.033)
wav = model.infer(
torch.tensor([utt.phoneme_ids], device="cuda"),
torch.tensor([utt.language_ids], device="cuda"),
speaker_id=torch.tensor([spk_id], device="cuda"),
length_scale=1.08, # brk reserves ~7% for the final pause
).squeeze().cpu().numpy()
# or the production path incl. BigVGAN + trailing-artifact trim (814 MB, RTF 0.105)
wav = synthesize(model, utt.phoneme_ids, utt.language_ids,
length_scale=1.08, speaker_id=spk_id)
sf.write("out.wav", wav, model.sample_rate) # 24 kHz
Speaker ids: spk_01_male=0 … spk_10_female=9 (persisted in hams_vits_config.json: speaker_map).
c_dur 2.0, mel×45, LSGAN MPD/MSD + feature-matching c_fm 4.0, KL, persisted discriminator across runs, batch 12, seg 12288, AdamW 2e-4 → 1e-4 (polish), long-utterance (≥6 s) ×3 oversampling, sil/brk pause tokens in the phoneme stream.facebook/mms-tts-ara (CC-BY-NC 4.0) → this model is cc-by-nc-4.0.