omniASR-LLM-3B, fine-tuned for Kinyarwanda
A full fine-tune of facebook/omniASR-LLM-3B (revision 6f2fdb7; the v1 release, omniASR_LLM_3B). It was trained on 4,449 hours of Kinyarwanda speech from Afrivoice and Common Voice 22.0. On the held-out test split of 26,251 clips (84.0 hours), word error rate falls from 19.3 % for the base model to 12.8 %, and character error rate from 5.6 % to 4.2 %.
Results
Error rates are scored on normalised text: lower case, with punctuation removed and word-internal apostrophes kept (n'abagabo). The model was trained to output text in that form. Decoding is beam search with a beam of 1, as in the omnilingual-asr inference pipeline.
| Test set | Clips | Hours | WER, base | WER, fine-tuned | CER, base | CER, fine-tuned |
|---|---|---|---|---|---|---|
| All test clips | 26,251 | 84.0 | 19.3 % | 12.8 % | 5.6 % | 4.2 % |
| Afrivoice | 10,075 | 59.6 | 17.2 % | 9.6 % | 4.8 % | 3.3 % |
| Common Voice | 16,176 | 24.4 | 24.3 % | 20.5 % | 7.4 % | 6.3 % |
| Afrivoice domain | Clips | WER, fine-tuned | CER, fine-tuned |
|---|---|---|---|
| agriculture | 2,109 | 6.8 % | 1.5 % |
| education | 1,812 | 4.6 % | 1.0 % |
| financial | 2,304 | 14.8 % | 5.8 % |
| government | 2,281 | 13.2 % | 5.4 % |
| health | 1,569 | 5.7 % | 1.3 % |
Three models were fine-tuned on the same data with the same recipe:
| Model | Test WER | Test CER |
|---|---|---|
| andreiflorian/omniASR-CTC-1B-v2-kinyarwanda | 18.6 % | 5.2 % |
| andreiflorian/omniASR-LLM-3B-kinyarwanda (this model) | 12.8 % | 4.2 % |
| andreiflorian/omniASR-LLM-7B-kinyarwanda | 11.9 % | 3.9 % |
Training data
The train, dev and test splits merge the corresponding splits of two corpora:
- Afrivoice Kinyarwanda (
DigitalUmuganda/Afrivoice_Kinyarwanda, revision042a5a9; Digital Umuganda, CC BY 4.0). Unscripted descriptions of photographs in five domains (agriculture, education, financial, government and health), plus scripted education readings that appear in train only. - Common Voice 22.0, Kinyarwanda (
fsicoli/common_voice_22_0, revisionae911de, a mirror of Mozilla Common Voice; CC0 1.0). Crowd-sourced readings of prompted sentences.
| Split | Clips | Hours | Afrivoice clips | Common Voice clips |
|---|---|---|---|---|
| Train | 1,549,635 | 4,449.0 | 548,538 | 1,001,097 |
| Dev | 21,340 | 53.8 | 5,376 | 15,964 |
| Test | 26,251 | 84.0 | 10,075 | 16,176 |
Every recording was decoded, converted to 16 kHz mono and checked. Silent recordings and recordings with impossibly fast transcripts were dropped, and duplicate recordings were removed so that none appears in two splits. Training also left out the 90 train clips longer than 40 seconds. No speaker appears in more than one split. However, 1,268 test clips share their normalised transcript with a train clip, and they were kept. In Common Voice these are case and punctuation variants of a train sentence; in Afrivoice they are descriptions repeated word for word by different speakers.
Training
- Regime. All parameters were trained except the convolutional feature extractor, which stayed frozen (4,372,468,864 trainable of 4,376,679,040). The objective was next-character cross-entropy, conditioned on the language code
kin_Latn. - Optimisation. 8-bit AdamW at a peak learning rate of 1e-5, with betas (0.9, 0.98), weight decay 0.01 and gradient-norm clipping at 1.0. Warm-up was linear over 250 updates, followed by cosine decay to a tenth of the peak. Each update covered about an hour of audio.
- Budget and selection. Training ran for one epoch (4,534 updates). WER was checked every 250 updates on a fixed 2,000-clip dev sample, and the best checkpoint was kept: update 4,500, with a dev-sample WER of 12.7 %. Dev WER was still falling slightly at the end of the epoch.
- Hardware. One NVIDIA H200, with FP32 weights and bfloat16 autocast, for 29.0 hours.
training_config.json, training_history.csv and metrics.json in this repository record the full configuration, the dev curve and every test metric.
Files
omniASR-LLM-3B.pt (fairseq2 checkpoint, FP32, 17.5 GB) and omniASR_tokenizer.model, the base model's tokeniser.
Usage
The checkpoint keeps the base model's fairseq2 format and loads with omnilingual-asr (tested with 0.2.0 and fairseq2 0.6). Pass the language code kin_Latn, as in training.
from pathlib import Path
import torch
from fairseq2 import init_fairseq2
from fairseq2.data.tokenizers.char import load_char_tokenizer
from huggingface_hub import snapshot_download
from omnilingual_asr.models.inference.pipeline import ASRInferencePipeline
from omnilingual_asr.models.wav2vec2_llama import get_wav2vec2_llama_model_hub
init_fairseq2()
folder = Path(snapshot_download("andreiflorian/omniASR-LLM-3B-kinyarwanda"))
hub = get_wav2vec2_llama_model_hub()
model = hub.load_custom_model(folder / "omniASR-LLM-3B.pt", hub.get_model_config("omniASR_LLM_3B"),
device=torch.device("cuda"), dtype=torch.bfloat16)
tokenizer = load_char_tokenizer(folder / "omniASR_tokenizer.model", None)
pipeline = ASRInferencePipeline(None, model=model, tokenizer=tokenizer)
print(pipeline.transcribe(["clip.flac"], lang=["kin_Latn"]))
As with the base model, clips must be shorter than 40 seconds.
Licence and attribution
This model is released under Apache 2.0. It was trained on Afrivoice Kinyarwanda by Digital Umuganda (CC BY 4.0), which requires attribution, and on Mozilla Common Voice 22.0 (CC0 1.0). The base model is described in Omnilingual ASR Team (2025), Omnilingual ASR: Open-Source Multilingual Speech Recognition for 1600+ Languages.
Model tree for Lugha-Models/omniASR-LLM-3B-kinyarwanda
Base model
facebook/omniASR-LLM-3B