oddadmix/Nabra-Saudi-82M

🤗 Hugging Face 来源text-to-speechapache-2.0983 MBother✓ 6 个校验和今天更新
一条命令提交

在你的模型文件夹旁边运行它。它会制作种子、将文件与 Hugging Face 比对,然后提交。你只需开始做种,并粘贴你账户中的密钥。它只读取你的文件,绝不修改。如果愿意,可以先阅读脚本。

curl -fsSL https://pirateface.co/package.sh | bash -s -- --repo oddadmix/Nabra-Saudi-82M ./model-folder
需要做种者 →

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.