Matoub-82M · Preview

The first neural text-to-speech model published for Kabyle (Taqbaylit, kab), released as a preview checkpoint. An 82M-parameter StyleTTS2 fine-tune of Kokoro-82M trained on 21,953 restored Common Voice Kabyle clips from a fifties male speaker. It synthesises 24 kHz speech that reproduces the gemination, spirantisation, emphatics, and pharyngeals of Kabyle phonology in a native speaker voice.

This is a preview. The training data, recording quality, and single published voice define a ceiling that a full release will substantially exceed. See What comes next for the plan.

Named after Lounes Matoub (1956-1998), Kabyle singer, poet, and tireless voice of Taqbaylit, who gave his life to its language and culture.

Results

The baseline for Kabyle TTS is mms-tts-kab (Meta's MMS). Cycle-CER measures the acoustic distortion introduced by synthesis: synthesise, transcribe with agbalu/Fadhma-300M, measure character error rate against the original text.

system cycle-CER real-audio control CER delta
mms-tts-kab 11.89 8.33 +3.56
Matoub-82M not yet measured

The cycle-CER evaluation against Matoub-82M has not been completed before this checkpoint was published. The card will be updated when it is. The baseline figure is the only number this model can be judged against at publication time.

Three things worth reading carefully.

The baseline is a multilingual voice, not a Kabyle one. mms-tts-kab was trained across 1,100+ languages with no Kabyle-specific fine-tuning; the voice it produces is generic. Matoub-82M was fine-tuned entirely on a native Kabyle male speaker. The perceptual quality difference is audible independent of the metric.

The training audio has a hard frequency ceiling. The kab_male clips are band-limited at approximately 7.9 kHz -- not 11.5 kHz or 24 kHz -- because the recording conditions for Common Voice Kabyle combined with phone microphones, lossy encoding, and upload artefacts cut the spectral content. The model cannot synthesise what was not in its training data; any evaluation above 7.9 kHz measures silence.

Diffusion was not trained in this checkpoint. lambda_diff: 0.0 in the training config. Passing beta > 0.0 to the inference function injects Gaussian noise from an untrained sampler directly into the decoder. Use alpha=0.0, beta=0.0 (pure reference style). This is the correct inference mode for this checkpoint and the one the sample audio was produced with.

Intended use

Producing spoken Kabyle from text for:

  • Accessibility: screen readers and audio production for Kabyle-language content.
  • Language learning: audio for learners studying Taqbaylit.
  • NLP pipeline completion: the terminal stage of a full Kabyle text pipeline, downstream of agbalu/Juba-27M (Tifinagh to Latin), agbalu/Belaid-31M (punctuation and casing), and agbalu/Boulifa-48M (orthography standardisation).

Not suitable for: any use requiring speaker consent or biometric match to the source speakers; cloning the voice of any person who has not consented; any decision about a person; any language other than Kabyle. No safety evaluation of any kind has been performed.

What comes next

This is a proof of concept. It establishes that Kabyle TTS is tractable, that the phonology is reproduced correctly, and that the pipeline works end to end. The full release will be trained differently — same Kokoro-82M base, different everything else that determines whether speech sounds human.

The goal is two models: a male voice and a female voice, both Kabyle, both trained to a standard where the pronunciation feels effortless and the sound is clean enough to use without apology. Not serviceable. Not a research demo. Something you would actually want to listen to.

This preview will remain permanently published. The two future production models will be released under their own distinct names as dedicated standalone repositories.

Usage

Not a from_pretrained model. StyleTTS2 is not a transformers architecture and this is a training checkpoint rather than an export, so the repository ships inference.py and that is the interface. Download the repository and run from inside it:

pip install torch torchaudio librosa soundfile huggingface_hub
hf download agbalu/Matoub-82M --local-dir Matoub-82M && cd Matoub-82M
from inference import MatoubTTS

tts = MatoubTTS.load()
tts.synthesise("Azul fell-awen, amek i telliḍ taṣebḥit-a?", "output.wav")

Or from the command line:

python inference.py --text "Azul fell-awen, amek i telliḍ taṣebḥit-a?" --out output.wav

The synthesis pipeline:

  1. G2P -- converts Kabyle Latin text to IPA, folding affricate tie-bar sequences (t͡ʃ -> ʧ, d͡ʒ -> ʤ) to the symbols in Kokoro's token table.
  2. Style extraction -- a reference clip from the training voice is encoded by style_encoder and predictor_encoder to produce a 256-dim speaker style vector.
  3. Duration and pitch prediction -- bert (PL-BERT, 12 layers), bert_encoder, predictor, and predictor_encoder predict phoneme durations and F0 contours from the token sequence and style vector.
  4. Waveform decoding -- the HiFi-GAN decoder renders 24 kHz mono audio.

Architecture

Matoub-82M is a StyleTTS2 model initialised from Kokoro-82M weights and fine-tuned in two stages:

Parameters 82M (Kokoro base)
Base model hexgrad/Kokoro-82M
Vocoder HiFi-GAN decoder
Style encoder 128-dim acoustic style vector
Predictor encoder 128-dim prosodic style vector
Language model PL-BERT (12 layers) + BERT encoder projection
Duration predictor LSTM + linear projection
F0 predictor JDC pitch extractor
Discriminators MPD + MSD (Stage 1 only)
Token table 178 tokens (Kokoro base), 3 new rows trained for Kabyle phonemes
Sample rate 24 kHz
Mel filterbank 80 bins, f_min 0, f_max 8000, n_fft 2048, hop 300

Stage 1 (multi-speaker) trains text_encoder, style_encoder, decoder, mpd, msd on both voices merged under global speaker IDs. It builds the acoustic backbone from the Kokoro base.

Stage 2 (per-voice) freezes the Stage 1 acoustic modules and fine-tunes bert, bert_encoder, predictor, predictor_encoder -- the language-model and duration stack -- on one voice at a time. It is where Kabyle prosody and phoneme timing are learned.

Training data

Corpus: Common Voice Kabyle, restored arm. Clips were amplitude-normalised, silence-trimmed, and filtered: flat-topped (clipped) samples and zero-energy clips were removed entirely.

voice clips speech hours mean clip length
kab_male 14,679 ~12.9 h 3.73 s
kab_female 7,274 ~5.0 h 3.11 s
total 21,953 ~17.9 h

The audio quality of kab_male is the binding constraint on this checkpoint. Inspection of the spectrograms shows the signal cut off at approximately 7.9 kHz, consistent with recording on a smartphone through a codec that discards high frequencies before upload. Of the 3.73 s mean clip, 23% is silence. The clips supervise no pause structure and no multi-sentence prosody: the longest clip is 10.5 s and fewer than 1.2% reach 8 s.

This is not a flaw in the data preparation -- it is a measurement of what Common Voice Kabyle recordings contain, and every claim this model makes about audio quality should be read against it.

Training recipe

Stage 1 -- multi-speaker acoustic pretraining:

Voices kab_male + kab_female merged, global speaker IDs
Train / validation 20,953 clips / 400 clips
Batch size 4
Max sequence length 200 frames
Hardware NVIDIA A10G 24 GiB (Modal)
Runtime ~10.47 h
Epochs trained 6
Speed 1.19 s/step (flat across all epochs)
Checkpoint epoch_1st_00005.pth

Stage 1 validation curve (monotone, decelerating -- the last two epochs bought 0.002 each):

epoch validation loss
1 0.262
2 0.243
3 0.236
4 0.231
5 0.229
6 0.227

Stage 2 -- per-voice language-model fine-tuning (kab_male):

Voice kab_male
Train / validation 14,174 clips / 200 clips
Steps per epoch 3,543
Batch size 4
Max sequence length 100 frames
Hardware NVIDIA A10G 24 GiB (Modal)
Speed (before joint epoch) 1.97 s/step
Speed (from joint epoch) 3.66 s/step
Epochs trained 4 (iters 13,944)
Checkpoint epoch_2nd_00003.pth
Validation loss 0.3475
make modal-matoub TASK=prepare ARM=restored
make modal-matoub TASK=stage2 ARM=restored VOICE=kab_male EPOCHS=5

Stage 2 (kab_female) is not yet published. The female voice requires a separate Stage 2 run; the checkpoint published here covers only the male voice.

Limitations

The kab_male recording quality defines the quality ceiling. Phone microphone recordings at ~7.9 kHz effective bandwidth, with 23% silence per clip and a maximum clip length of 10.5 s, are the training distribution. The model cannot exceed what it was shown. The frequency ceiling is the most consequential limitation: 24 kHz output with nothing above 7.9 kHz is broadband silence from 7.9 kHz upward, and it will be audible on any speaker or headphone that reproduces it.

Single published voice. The kab_female Stage 2 has not been trained to a publishable checkpoint. The card will be updated when it completes.

Short-clip corpus. Mean clip length is 3.73 s (male) and 3.11 s (female), of which 23-43% is silence. The model has not been supervised on multi-sentence prosody, pause structure, or paragraph-level intonation. Long sentences are synthesised phoneme-by-phoneme; paragraph rhythm is not modelled.

One language. Trained and evaluated on Kabyle. Tarifit, Tashelhit, Central Atlas Tamazight and Shawiya have related but distinct phonologies; none was tested and none should be assumed.

No safety evaluation of any kind has been performed.

What was not measured

  • Cycle-CER against Matoub-82M. The evaluation has not been completed; the card will be updated when it is.
  • MOS / UTMOS. No perceptual evaluation has been performed.
  • Speaker similarity. No speaker embedding comparison against the source voice has been performed.
  • Long-form synthesis quality. Degradation on multi-sentence or paragraph-length inputs has not been measured.
  • Female voice. The kab_female Stage 2 checkpoint has not been trained.

Files

file size description
epoch_2nd_00003.pth ~1.8 GiB full training state: 13-module net dict + AdamW opt + epoch 3, iters 13944, val_loss 0.3475

The published file includes optimiser state and is resumable. A stripped inference-only export is planned for a future revision.

Reproduction

make modal-matoub TASK=pull             # download the checkpoint to artifacts/matoub/
make push REPO=matoub                   # restage and upload to agbalu/Matoub-82M
make infer-matoub TEXT="Azul fell-awen, amek i telliḍ taṣebḥit-a?"

Full training reproduction:

make modal-matoub TASK=prepare ARM=restored
make modal-matoub TASK=stage1 ARM=restored EPOCHS=6
make modal-matoub TASK=stage2 ARM=restored VOICE=kab_male EPOCHS=6

The name

Lounes Matoub (1956-1998) was the most celebrated Kabyle singer of the 20th century and one of the fiercest advocates for the survival of Taqbaylit. He recorded over 500 songs in Kabyle at a time when the Algerian state was suppressing Berber language and culture, making the language audible to an entire generation. He was assassinated on 25 June 1998, thirteen days after the passage of the Arabisation law he had spent years opposing.

His voice is inseparable from the survival of Kabyle as a spoken language in collective memory. Naming the first neural Kabyle TTS model after him is not metaphor; it is acknowledgment that what this model does -- make the language heard -- is what he spent his life doing.

The naming is homage; it implies no endorsement by anyone.

Citation

@software{agbalu_matoub_2026,
  title  = {Matoub-82M: neural speech synthesis for Kabyle},
  author = {AƔBALU},
  year   = {2026},
  url    = {https://huggingface.co/agbalu/Matoub-82M},
  note   = {StyleTTS2 fine-tune of Kokoro-82M on 21,953 restored Common Voice clips; preview}
}

Licence

Apache-2.0 on the weights and the code. The training data derives from Common Voice Kabyle (CC0); the Kokoro base weights are published under Apache-2.0. A permissive grant on weights makes no claim about the voice recordings they were trained on.

Part of AƔBALU, a Kabyle corpus and model collection.

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for agbalu/Matoub-82M

Finetuned
(52)
this model