shami-tts / README.md
AlaminI's picture
Add rich Listen section (14 sentences, 34 players); refresh paper (19 refs)
8117eff verified
|
Raw
History Blame Contribute Delete
17.4 kB
---
license: cc-by-nc-4.0
language:
- ar
- en
tags:
- text-to-speech
- tts
- vits
- bigvgan
- levantine-arabic
- arabic
- code-switching
- streaming
- low-latency
- real-time
- dialectal-arabic
base_model: facebook/mms-tts-ara
pipeline_tag: text-to-speech
library_name: pytorch
---
# Shami-TTS โ€” Production-Grade Levantine Arabic โ†” English Code-Switching TTS
> A low-latency, **streaming** text-to-speech system that speaks natural, **Levantine
> Arabic** and switches to **English** mid-utterance without a prosodic seam. v2 turns the
> promising-but-robotic v1 baseline into a **production-grade** voice on a **single consumer
> GPU (RTX 3060, 12 GB)**: **Levantine CER 0.75 โ†’ 0.11 (โˆ’86%), WER 0.99 โ†’ 0.35**, natural
> prosody, 24 kHz fidelity, and reference-level texture โ€” at **~11ร— faster than real-time**.
This card documents v2 **exhaustively** โ€” what changed from v1, the architecture, the two
vocoder options we release, measured results, usage for both, the training recipe, an honest
engineering log, and licensing. A full **9-page technical report** is included at
[`paper/shami_tts.pdf`](paper/shami_tts.pdf).
---
## 0. TL;DR
| Held-out metric (ASR round-trip, Whisper large-v3, โ†“ better) | Baseline (v1) | **v2 HiFi-GAN** | **v2 + BigVGAN** |
|---|---|---|---|
| **Levantine Arabic CER** | 0.751 | 0.113 | **0.106** |
| **Levantine Arabic WER** | 0.993 | 0.377 | **0.347** |
| Code-switch CER | 0.853 | **0.498** | 0.556 |
| Overall CER | 0.802 | **0.305** | 0.331 |
| Real-time factor (RTX 3060) | 0.024 | 0.028 | ~0.085 |
| Duration ratio @ `length_scale=1` | 0.31 (needs 3.2ร— stretch) | **0.97** | **0.97** |
- **Two vocoders released.** The **HiFi-GAN** decoder is a single self-contained VITS model
(minimal deps). **BigVGAN** re-vocodes for the cleanest texture (removes the residual
high-frequency breathiness). Pick per your fidelity/latency/dependency budget.
- **Single flagship speaker** ("Badr") in this release; multi-speaker is v3.
- **Infer at `length_scale = 1.0`** (deterministic duration โ€” do *not* use 3โ€“5 as in v1).
---
## ๐Ÿ”Š Listen
Synthesized at `length_scale=1.0`. **Reference** = real recording; **HiFi-GAN** = self-contained decoder; **BigVGAN** = highest-fidelity vocoder. Players stream on demand.
### Pure Levantine
ุถู„ุช ูˆุงู‚ูุฉ ุณุงูƒุชุฉ ุจุฏูˆู† ู…ุง ุชุญูƒูŠ ุจูŽุณู’ ูƒุงู†ุช ุชุชูุฑุฌ ุนู„ูŠ ูˆุงู†ุง ูƒู†ุช ุฑุงู‚ุจ ุงู„ู…ูŠ ูˆู‡ูŠ ุนู… ุชู†ุฒู„ ูˆุณุฑุญุงู†ุฉ.
| Reference | HiFi-GAN | BigVGAN |
|---|---|---|
| <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/lev_01_reference.wav"></audio> | <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/lev_01_hifigan.wav"></audio> | <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/lev_01_bigvgan.wav"></audio> |
ุญุณูŠุช ููŠู‡ู† ูˆูŽุฌูŽุน ูˆ ุงู†ูƒุณุงุฑ ูˆุฌุนูˆ ู…ุชู„ ูˆุฌุนูŠ ุงู„ุชู†ูŠู† ู…ุธู„ูˆู…ูŠู† ูˆ ุจุฏูˆู† ุญูŠู„ุฉ.
| Reference | HiFi-GAN | BigVGAN |
|---|---|---|
| <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/lev_02_reference.wav"></audio> | <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/lev_02_hifigan.wav"></audio> | <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/lev_02_bigvgan.wav"></audio> |
ู…ุง ููŠูƒ ุชุนู…ู„ ุดูุบูู„ ู…ุฑุชุจ ุจู„ุจู†ุงู† ุงู„ุง ุงุฐุง ูƒุงู† ุนู†ุฏูƒ ุธู‡ุฑ ู…ุงูƒู†.
| Reference | HiFi-GAN | BigVGAN |
|---|---|---|
| <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/lev_03_reference.wav"></audio> | <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/lev_03_hifigan.wav"></audio> | <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/lev_03_bigvgan.wav"></audio> |
### Code-switching
ู„ูŠุด ุงู„training ู…ูุดู’ ุดุบู‘ุงู„ on the serverุŸ.
| Reference | HiFi-GAN | BigVGAN |
|---|---|---|
| <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/cs_01_reference.wav"></audio> | <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/cs_01_hifigan.wav"></audio> | <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/cs_01_bigvgan.wav"></audio> |
ููŠ ู…ุดูƒู„ุฉ ุจ the errorุŒ ู„ุงุฒู… ู†ุตู„ู‘ุญู‡ุง.
| Reference | HiFi-GAN | BigVGAN |
|---|---|---|
| <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/cs_02_reference.wav"></audio> | <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/cs_02_hifigan.wav"></audio> | <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/cs_02_bigvgan.wav"></audio> |
ุญูƒูŠุชู„ูƒ ุนู† the project ู‚ุจู„ุŸ ู‡ูˆ light.
| Reference | HiFi-GAN | BigVGAN |
|---|---|---|
| <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/cs_03_reference.wav"></audio> | <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/cs_03_hifigan.wav"></audio> | <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/cs_03_bigvgan.wav"></audio> |
### Showcase โ€” novel unseen text
**Long, natural Levantine** โ€” ุจูŽุนุฑูู ุฅู†ู‘ูˆ ุงู„ูˆูŽู‚ูุช ุชุฃุฎู‘ุฑ ูƒู’ุชูŠุฑุŒ ุจูŽุณ ุตูŽุฏู‚ูŠู†ูŠ ู…ุง ู‚ูŽุตู‘ุฑูุชุŒ ุถู„ู‘ูŠุช ุนูŽู… ุญุงูˆูู„ ุทูˆู„ ุงู„ู†ู‘ู‡ุงุฑ ู„ูŽุญุชู‘ู‰ ุฎู„ู‘ุตูุช ูƒูู„ ุงู„ุดู‘ุบูู„.
| HiFi-GAN | BigVGAN (recommended) |
|---|---|
| <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/show_01_hifigan.wav"></audio> | <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/show_01_bigvgan.wav"></audio> |
**Heavy code-switch (AR + EN)** โ€” ุงู„ู€ meeting ุจููƒุฑุง ุงู„ุณุงุนุฉ ุชุณุนุฉุŒ ูˆุจูŽุฏู‘ูŠ ู†ุฑุงุฌูุน ุงู„ู€ dashboard ูˆุงู„ู€ analytics ู‚ูŽุจูู„ ู…ุง ู†ุนู…ูู„ ุงู„ู€ presentation.
| HiFi-GAN | BigVGAN (recommended) |
|---|---|
| <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/show_02_hifigan.wav"></audio> | <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/show_02_bigvgan.wav"></audio> |
**Numbers, currency, date** โ€” ุฏูŽูุนูุช ู…ูŠุฉ ูˆุฎู…ุณุฉ ูˆุนุดุฑูŠู† ุฏูˆู„ุงุฑ ุนูŽ ุงู„ุฃูˆุชูŠู„ุŒ ูˆุงู„ุฑูู‘ุญู„ุฉ ุจุชูƒู„ู‘ู ุชู„ุงุชุฉ ุขู„ุงู ูˆุฎู…ุณู…ูŠุฉ ู„ูŠุฑุฉุŒ ูˆุงู„ู…ูˆุนุฏ ูŠูˆู… ุงุชู†ูŠู†.
| HiFi-GAN | BigVGAN (recommended) |
|---|---|
| <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/show_03_hifigan.wav"></audio> | <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/show_03_bigvgan.wav"></audio> |
**Question + exclamation** โ€” ุดูˆ ุตุงุฑ ู…ูŽุนูŽูƒุŸ! ู„ูŠุด ู…ูุชุถุงูŠูู‚ ู‡ูŽู„ู‚ูŽุฏุŸ ูŠูŽู„ู‘ุง ุงุญูƒูŠู„ูŠ ูƒูู„ ุดูŠ ุจุงู„ุชู‘ูุตูŠู„ุŒ ู„ุง ุชูุฎุจู‘ูŠ ุนูŽู†ู‘ูŠ ูˆูŽู„ุง ูƒูู„ู…ุฉ!
| HiFi-GAN | BigVGAN (recommended) |
|---|---|
| <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/show_04_hifigan.wav"></audio> | <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/show_04_bigvgan.wav"></audio> |
**Tech / brand names** โ€” ู†ุฒู‘ู„ูุช ุขุฎูุฑ version ู…ูู† ุงู„ู€ app ุจูŽุณ ุงู„ู€ update ูƒูŽุณูŽุฑ ุงู„ู€ loginุŒ ูุจุนุชูุชู„ู‡ูู† ticket ุนูŽ ุงู„ู€ support.
| HiFi-GAN | BigVGAN (recommended) |
|---|---|
| <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/show_05_hifigan.wav"></audio> | <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/show_05_bigvgan.wav"></audio> |
**English-heavy technical** โ€” The neural vocoder reduces spectral artifacts, ุจูŽุณ ู„ุงุฒูู… ู†ู€ fine-tune ุงู„ู€ model ุนูŽ ุจูŠุงู†ุงุช ุฃู†ุถูŽู.
| HiFi-GAN | BigVGAN (recommended) |
|---|---|
| <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/show_06_hifigan.wav"></audio> | <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/show_06_bigvgan.wav"></audio> |
**Warm greeting (assistant)** โ€” ู…ูŽุฑุญูŽุจุง ููŠูƒ! ุฃู†ุง ู…ุณุงุนูุฏูŽูƒ ุงู„ุตูˆุชูŠุŒ ูƒูŠู ุจูŽู‚ุฏูุฑ ุณุงุนุฏูŽูƒ ุงู„ูŠูˆู…ุŸ just tell me what you need.
| HiFi-GAN | BigVGAN (recommended) |
|---|---|
| <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/show_07_hifigan.wav"></audio> | <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/show_07_bigvgan.wav"></audio> |
**Emphatics + gutturals** โ€” ุงู„ุทู‘ุจูŠุจ ู‚ุงู„ ุฅู†ู‘ูˆ ุงู„ุตู‘ุญู‘ุฉ ุจุฎูŠุฑุŒ ูˆุงู„ุถู‘ุบูุท ุทุจูŠุนูŠุŒ ูˆุงู„ู‚ูŽู„ูุจ ุนูŽู… ูŠูุดุชูุบูู„ ู…ู’ู†ูŠุญุŒ ุงู„ุญูŽู…ุฏู ู„ู„ู‡ ุนูŽ ูƒูู„ ุดูŠ.
| HiFi-GAN | BigVGAN (recommended) |
|---|---|
| <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/show_08_hifigan.wav"></audio> | <audio controls preload="none" src="https://huggingface.co/Tushe/shami-tts/resolve/main/samples/show_08_bigvgan.wav"></audio> |
---
## 1. What's new in v2 (vs. the published baseline)
v2 is four targeted contributions, each measured (see the [report](paper/shami_tts.pdf)):
1. **Dialectal front-end.** Automatic diacritization (CAMeL Tools) is now the *default* path,
so ~100% (not 0.4%) of bare conversational text is phonemized through the high-quality
Levantine rule-G2P. A new **de-desinentialization** step strips MSA case/mood endings that
Levantine drops (`ู…ูŽูˆู’ุนูุฏ` โ†’ `moหส•id`, not `moหส•idi`) while preserving gemination.
โ†’ Levantine CER 0.75 โ†’ 0.46.
2. **Deterministic duration head.** Replaces VITS's stochastic duration predictor (which
under-predicted ~3ร—, forcing a prosody-flattening global stretch) with a deterministic
head trained by MSE on alignment durations. Natural rhythm at `length_scale=1`.
โ†’ CER 0.46 โ†’ **0.11** (the roboticโ†’natural unlock).
3. **24 kHz fidelity + texture recipe.** Decoder fine-tuned to native 24 kHz; feature-matching
up-weighted; the discriminator is now **persisted across warm-starts** (it used to restart
from scratch โ€” a real bug that caused buzz); a multi-resolution STFT loss added.
โ†’ full-band fidelity, buzz at reference level, CER flat.
4. **Anti-aliased BigVGAN vocoder.** Removes the residual high-frequency breathiness
(a phase/aliasing artifact) that magnitude losses can't fix. โ†’ texture matches the source.
The story is two-regime: **intelligibility** is solved by data + duration (steep CER drop),
then **fidelity/texture** improvements (24 kHz, feature-matching, BigVGAN) hold CER while
raising perceptual quality โ€” which CER does not measure. Trust the audio in `samples/`.
---
## 2. Architecture
```
text (AR / EN / mixed)
โ†’ normalize โ†’ code-switch segment (script-based) โ†’ per-span verbalize
โ†’ diacritize (Arabic) + G2P (Levantine rules / espeak-ng English)
โ†’ shared 88-symbol IPA + parallel language-ID stream
โ†’ ShamiVITS acoustic model (mms-tts-ara backbone + IPA/lang embeddings
+ DETERMINISTIC duration head), 24 kHz
โ†’ HiFi-GAN decoder โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ waveform (self-contained)
โ””โ–บ mel โ–บ BigVGAN vocoder โ”€โ”€โ”€โ”€โ”€โ–บ waveform (cleanest) (highest fidelity)
```
- **Acoustic model (ShamiVITS):** ~36 M params. VITS core (CVAE + flow + monotonic alignment),
with the text-encoder embedding replaced by a shared IPA table, an additive language-ID
embedding, and the stochastic duration predictor swapped for the deterministic head.
*(In the reference code this is the `HamsVITS` class in the `hams_tts` package โ€” the import
path is unchanged for backward compatibility.)*
- **Vocoders:** native HiFi-GAN decoder (~inside VITS), or pretrained
[`nvidia/bigvgan_v2_24khz_100band_256x`](https://huggingface.co/nvidia/bigvgan_v2_24khz_100band_256x)
(112 M, MIT) โ€” an exact match for our 24 kHz / hop-256 pipeline, used with **no fine-tuning**.
---
## 3. Usage
Full code, front-end, and inference: **https://github.com/Al-aminI/hams-levantine-tts**
### 3a. HiFi-GAN (single model, minimal deps)
```python
import torch, soundfile as sf
from hams_tts.models.hams_vits import HamsVITS
from hams_tts.text.frontend import TextFrontend # needs espeak-ng + camel-tools for AR
fe = TextFrontend(diacritizer_backend="auto")
model = HamsVITS.from_checkpoint("path/to/this/repo").cuda().eval() # loads hams_vits.pt + config
u = fe.process("ู…ูŽุฑุญูŽุจุงุŒ ุฃู†ุง ู…ุณุงุนูุฏูŽูƒ ุงู„ุตูˆุชูŠุŒ how can I help you today?")
pid = torch.tensor([u.phoneme_ids]).cuda(); lid = torch.tensor([u.language_ids]).cuda()
wav = model.infer(pid, lid, length_scale=1.0).squeeze().cpu().numpy() # 24 kHz
sf.write("out.wav", wav, model.sample_rate)
```
### 3b. + BigVGAN (highest fidelity)
```python
from hams_tts.inference.bigvgan_vocoder import synthesize # VITS โ†’ BigVGAN โ†’ trim
wav = synthesize(model, u.phoneme_ids, u.language_ids, length_scale=1.0)
sf.write("out_bigvgan.wav", wav, model.sample_rate)
```
BigVGAN is fetched from the Hub on first use (`use_cuda_kernel=False` โ†’ pure-PyTorch,
Windows/CPU-safe). **Always synthesize at `length_scale=1.0`.**
---
## 4. Results (held-out set, n=40)
Consistently measured; ASR round-trip via Whisper large-v3, Arabic forced, text normalized
(diacritics/alef/ya/ta-marbuta folded). Full analysis in the [report](paper/shami_tts.pdf).
| System | Lev CER | Lev WER | CS CER | Overall CER | RTF |
|---|---|---|---|---|---|
| Published baseline (16 kHz, stochastic dur.) | 0.751 | 0.993 | 0.853 | 0.802 | 0.024 |
| **v2, HiFi-GAN (24 kHz)** | 0.113 | 0.377 | **0.498** | **0.305** | 0.028 |
| **v2, + BigVGAN** | **0.106** | **0.347** | 0.556 | 0.331 | ~0.085 |
**Texture:** high-frequency spectral flatness matches the reference (0.49โ€“0.51 vs 0.488).
**Duration:** ratio 0.97 at natural pacing. **Robustness:** 8/8 novel unseen sentences
(long, heavy code-switch, numbers/dates) synthesized cleanly.
> **On the code-switch CER column:** BigVGAN slightly *raises* it while *improving* pure
> Levantine and perceived quality. This is a **Whisper artifact** โ€” Whisper is MSA/English
> biased and mis-scores the English-in-Arabic segments; it is not an audible regression.
> Absolute CER via ASR has a floor well above zero on dialectal Arabic; treat **relative**
> numbers and the released audio as the source of truth. Human MOS is future work.
---
## 5. Training recipe (single RTX 3060, 12 GB, bf16)
Warm-started stages, each a fine-tune of the previous best:
```
prepare_lahgtna.py extract --target-sr 24000 โ†’ phonemize (dialectal front-end)
finetune_gan.py --deterministic-duration --sample-rate 24000 --c-fm 4 --c-stft 3 \
--ckpt <prev-best> (generator + discriminator persisted, atomic saves)
eval_checkpoint.py --auto-ls --asr (sweep checkpoints; GAN is non-monotonic)
bigvgan_vocoder.synthesize (final vocoding)
```
Key HPs: AdamW(0.8,0.99), lr 2e-4, batch 12โ€“16, `seg_size` 8192โ€“12288, `c_mel`=45,
`c_dur`=1โ€“2, `c_fm`=4, `c_stft`=3, MR-STFT ffts 512/1024/2048, 8kโ€“10k steps/stage.
## 6. Data
[`mohammedaly22/lahgtna-levantine-tts`](https://huggingface.co/datasets/mohammedaly22/lahgtna-levantine-tts)
(CC-BY-4.0): 50k clips / 66.8 h / 24 kHz / 10 speakers, Shami Levantine + ~12% synthetic
code-switch, partially diacritized. This release = single speaker "Badr" (~6.2 h).
## 7. Limitations
Single speaker; small eval set (ยฑ0.02 CER noise); ASR-CER floor on dialectal Arabic
under-states true quality; BigVGAN path runs two vocoders (a single-pass melโ†’BigVGAN model is
v3); multi-speaker is v3.
## 8. Licensing
- **Code:** Apache-2.0 (this project's source).
- **These weights:** **CC-BY-NC-4.0** โ€” derived from `facebook/mms-tts-ara` (Meta MMS), which
is non-commercial. **Non-commercial use only** unless you retrain from a permissive base.
- Dataset: CC-BY-4.0. BigVGAN: MIT. espeak-ng: GPLv3 (tool). CAMeL Tools: MIT/โ€ฆ
## 9. Citation
```bibtex
@techreport{shami_tts_2026,
title = {Shami-TTS: A Production-Grade Streaming TTS for Levantine Arabic/English
Code-Switching via Dialectal Front-End, Deterministic Duration, and
Anti-Aliased Neural Vocoding},
author = {{Tushe Language Research Team}},
year = {2026},
institution = {Tushe Language Research},
note = {https://huggingface.co/Tushe/shami-tts}
}
```
Built on VITS (Kim et al., 2021), HiFi-GAN (Kong et al., 2020), BigVGAN (Lee et al., 2023),
MMS (Pratap et al., 2023), CAMeL Tools (Obeid et al., 2020), Whisper (Radford et al., 2023).