Nabra-Saudi-82M

Saudi-dialect Arabic text to speech, 81.81M parameters, 24 kHz. Finetuned from Nabra-82M (itself a Kokoro-82M / StyleTTS2 finetune) on 146 hours of single-speaker Saudi speech. It is the teacher that Nabra-Saudi-7M, an 11x smaller on-device model, was distilled from.

parameters 81,810,022
model file nabra_saudi_82m_v0.pth, 327.5 MB (fp32)
sample rate 24 kHz, mono
language Arabic, Saudi dialect
voice af_msa (single female voice)
training 40k steps on 34,404 clips (146.5 h) of single-speaker Saudi speech
  • ๐ŸŽ™๏ธ Try it: Nabra-Saudi-Demo โ€” the 82M next to the 7M on the same text.
  • ๐Ÿ“ฑ Small version: Nabra-Saudi-7M, 7.48M parameters / 30 MB, distilled from this model.

Samples

samples/ holds three sentences synthesized with this checkpoint on CPU, no post-processing:

file text
samples/nabra_saudi_82m_hello.wav ูŠุง ุฃู‡ู„ุงู‹ ูˆุณู‡ู„ุงู‹ุŒ ูƒูŠู ุญุงู„ูƒู…ุŸ ุฅู† ุดุงุก ุงู„ู„ู‡ ุทูŠุจูŠู† ูˆุจุฃุญุณู† ุญุงู„.
samples/nabra_saudi_82m_weather.wav ุงู„ุทู‚ุณ ุงู„ูŠูˆู… ุญู„ูˆ ูˆุงู„ุณู…ุง ุตุงููŠุฉ ู…ุฑุฉ.
samples/nabra_saudi_82m_story.wav ุงู„ูŠูˆู… ุนู†ุฏู†ุง ู‚ุตุฉ ุฌุฏูŠุฏุฉ ู…ู† ุงู„ู‚ุตุต ุงู„ู„ูŠ ูƒู„ูƒู… ุชุญุจูˆู†ู‡ุง.

Usage

pip install torch soundfile huggingface_hub loguru attrs transformers "misaki[en]>=0.9.4" \
            "phonemizer-fork>=3.3.2" camel-tools numpy
sudo apt-get install -y espeak-ng
import soundfile as sf
from huggingface_hub import snapshot_download
import sys; sys.path.insert(0, snapshot_download("oddadmix/Nabra-Saudi-82M"))

from load_model import load
model, pipeline, voice = load()          # loads nabra_saudi_82m_v0.pth + af_msa.pt
audio = next(pipeline("ูŠุง ุฃู‡ู„ุงู‹ ูˆุณู‡ู„ุงู‹ุŒ ูƒูŠู ุญุงู„ูƒู…ุŸ", voice=voice))[2]   # 24 kHz
sf.write("out.wav", audio.numpy(), 24000)

load_model.py uses the vendored kokoro_patched/ package rather than the stock kokoro pip package: this config sets decoder widths that upstream Kokoro hardcodes, so the stock package raises a TypeError. Do not pip install kokoro on top of it.

Write dialect text as it is normally written, without full tashkeel. That is what the model expects, and adding MSA diacritics makes it worse rather than better: an MSA diacritizer imposes case endings and vowel patterns a dialect speaker does not pronounce. Measured on a separate Saudi corpus, running an MSA diacritizer over the text was the worst of the three options tried.

Front end

Text goes through arabic_g2p.py with diacritize=False: normalize, espeak-ng Arabic G2P, then a cleanup pass that strips espeak's mid-word syllable dots and keeps ส• (ุน) and ฤง (ุญ) on their own embedding slots (Kokoro vocab ids 7 and 8) so the ุน/ุก and ุญ/ู‡ contrasts survive.

How it was trained

Durations come from a CTC aligner trained on this corpus, not from a teacher. Two checks decided whether those labels were usable, and both are worth repeating on any new corpus:

  • The frame offset is measured, not assumed. An energy sweep placed this corpus's peak at zero, so no correction was applied. Two other corpora in this line needed +1, and training on an uncorrected offset wrecked an earlier run.
  • A reversed-label control. Vowel-minus-pause energy separation was +8.87 dB under the true labels and +0.92 dB with the labels reversed, so the alignment is real rather than a plausible looking monotonic path.

Objective: multi resolution STFT, duration L1, log mel L1, a silence term, and WavLM feature matching, with multi period and multi resolution spectrogram discriminators. The full recipe and the scripts are in Nabra-Saudi-7M/TRAINING.md.

Additional checkpoint: nabra_saudi_82m.pth (with synthetic phone conversations)

The repo also carries a later checkpoint, trained from nabra_saudi_82m_v0.pth for another 40k steps on 55,606 segments (159.9 h: the 146 h real corpus plus 13.4 h of synthetic Saudi phone-conversation speech covering real-estate sales/support and HR/accounting). On held-out conversational text it roughly halved word error (0.091 vs 0.152, 33 reference words) with audio quality unchanged within noise (UTMOS 2.71 vs 2.79, sd 0.23).

It is not the checkpoint the demo serves and not the one the 7M was distilled from; load it explicitly with load(weights="nabra_saudi_82m.pth") if you want the conversational domain.

Limitations

Single voice, Saudi dialect. Short sentences are noticeably stronger than long spontaneous passages. Not intended for Modern Standard Arabic, which Nabra-82M-v0.1 and Nabra-7M-Distill cover, nor for other dialects. No speaker cloning.

Citation

@misc{nabrasaudi2026,
  title  = {Nabra-Saudi-82M: Saudi-dialect Arabic Text-to-Speech},
  author = {oddadmix},
  year   = {2026},
  howpublished = {\url{https://huggingface.co/oddadmix/Nabra-Saudi-82M}}
}

License & attribution

Apache-2.0, following Kokoro-82M (Apache-2.0) and StyleTTS2 (MIT). The finetuning recipe builds on kikiri-tts.

Downloads last month
34
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for oddadmix/Nabra-Saudi-82M

Finetuned
(3)
this model
Finetunes
1 model

Space using oddadmix/Nabra-Saudi-82M 1