Matoub-82M · Preview
A text-to-speech model 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 — twice the sample rate of mms-tts-kab, the incumbent Kabyle TTS model, and under a licence that permits commercial use where that one does not.
The work that makes it Kabyle is the front end. Kokoro's token table maps 114 symbols and carries none of ˤ ʕ ħ — pharyngealisation, and the letters ɛ and ḥ — while its G2P is built with unk='' and drops a phoneme it cannot represent rather than raising, which would have deleted three consonants from every training target behind a healthy loss curve. The 42-symbol Kabyle inventory was diffed against that table, the three missing symbols assigned to unused embedding rows and trained, the affricate tie bar folded onto ʧ and ʤ, and the front end made to validate against the vocabulary and raise. That is why the emphatics and pharyngeals survive to the decoder.
Released as a preview: it publishes one voice, and its Cycle-CER is not yet measured.
Named after Lounès 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 |
That baseline row is itself a result of this project. mms-tts-kab had been published without a Kabyle score by anyone; the +3.56 delta above was measured here on 2026-08-14 over 1,000 held-out non-biblical prompts, against a real-audio control on the same text. Kabyle TTS now has a number to be judged against. Matoub-82M's own Cycle-CER is not yet measured, and this card carries no claim about it until it is.
Three things worth reading carefully.
The baseline is read scripture at 16 kHz. mms-tts-kab is MMS's per-language VITS checkpoint, trained on New Testament recordings — which typically carry one speaker per language — and it emits 16 kHz under cc-by-nc-4.0. Matoub-82M was fine-tuned on Common Voice read speech from a native Kabyle male speaker and emits 24 kHz under Apache-2.0. No listening test has been run between the two, and none is claimed here.
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. This is a property of the Kabyle speech record rather than of this checkpoint — the incumbent synthesises at 16 kHz, so both systems are band-limited, and closing it needs recordings that do not currently exist.
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), andagbalu/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 checkpoint establishes the parts that carry forward: a Kabyle phoneme inventory the base model can represent, a G2P front end that raises instead of dropping, a two-stage recipe that trains to a monotone validation curve on 17.9 hours, and an end-to-end path from Kabyle text to 24 kHz audio.
What it does not yet have is a second voice and a perceptual measurement. The kab_female Stage 2, the Cycle-CER, and UTMOSv2 and speaker-similarity scoring are the next three, in that order.
This preview stays permanently published. The production voices that follow it are released under their own names as standalone repositories rather than replacing this checkpoint.
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:
- G2P -- converts Kabyle Latin text to IPA, folding affricate tie-bar sequences (
t͡ʃ->ʧ,d͡ʒ->ʤ) to the symbols in Kokoro's token table. - Style extraction -- a reference clip from the training voice is encoded by
style_encoderandpredictor_encoderto produce a 256-dim speaker style vector. - Duration and pitch prediction --
bert(PL-BERT, 12 layers),bert_encoder,predictor, andpredictor_encoderpredict phoneme durations and F0 contours from the token sequence and style vector. - Waveform decoding -- the HiFi-GAN
decoderrenders 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_femaleStage 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
Lounès 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 36 albums 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, ten days before the Arabisation law he had spent years opposing took effect.
His voice is inseparable from the survival of Kabyle as a spoken language in collective memory. Naming a 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.