metadata
language: wo
license: apache-2.0
tags:
- automatic-speech-recognition
- audio
- wolof
- mms
- senegal
- africa
- low-resource
datasets:
- vonewman/wolof-audio-data
metrics:
- wer
base_model: facebook/mms-1b-all
model-index:
- name: mms-1b-wolof-finetuned
results:
- task:
type: automatic-speech-recognition
name: Automatic Speech Recognition
dataset:
name: vonewman/wolof-audio-data
type: vonewman/wolof-audio-data
metrics:
- type: wer
value: 29.56
name: Word Error Rate
MMS-1B Wolof Fine-Tuned πΈπ³
Fine-tuned version of facebook/mms-1b-all for Wolof Automatic Speech Recognition (ASR).
This model transcribes Wolof speech audio into Wolof text. It's the result of full fine-tuning (all 964M parameters) on 20,000 quality-filtered audio samples.
π Performance
| Metric | Value |
|---|---|
| WER (Word Error Rate) | 29.56% |
| Test set | 500 examples |
| Training samples | 20,000 |
| Total audio | 25.6 hours |
| Mode | Full fine-tuning (964M params) |
π― Use Cases
- ποΈ Transcription of Wolof audio (radio, podcasts, conversations)
- π First step in a Wolof β French translation pipeline
- βΏ Accessibility tools for Wolof-speaking communities
- π¬ Research on low-resource African languages
π Quick Start
from transformers import Wav2Vec2ForCTC, AutoProcessor
import torch
import torchaudio
# Load model and processor
model_id = "Sadou/mms-1b-wolof-finetuned"
processor = AutoProcessor.from_pretrained(model_id)
model = Wav2Vec2ForCTC.from_pretrained(model_id)
# Load audio (must be 16kHz, mono)
waveform, sr = torchaudio.load("your_audio.wav")
if sr != 16000:
waveform = torchaudio.transforms.Resample(sr, 16000)(waveform)
if waveform.shape[0] > 1:
waveform = waveform.mean(dim=0, keepdim=True)
# Transcribe
inputs = processor(waveform[0].numpy(), sampling_rate=16000, return_tensors="pt")
with torch.no_grad():
logits = model(**inputs).logits
predicted_ids = torch.argmax(logits, dim=-1)
transcription = processor.batch_decode(predicted_ids)[0]
print(f"Transcription: {transcription}")
π Training Details
Dataset
- Source: vonewman/wolof-audio-data
- Combines: ALFFA + FLEURS + Urban Bus + Kallama
- Quality filters applied:
- Audio duration: 2-15s
- Text: 3-30 words
- Speech rate: 1.0-4.5 words/sec
- Retention rate: 75.5%
Training Configuration
- Base model:
facebook/mms-1b-all - Mode: Full fine-tuning (all 964M parameters)
- Precision: bf16 (Brain Float 16)
- Effective batch size: 32 (16 Γ 2 gradient accumulation)
- Gradient checkpointing: Enabled
- Learning rate: 3e-5 (initial), then 5e-6 (final epochs)
- Epochs: 6 (4 + 2 with LR decay)
- Hardware: NVIDIA RTX PRO 6000 Blackwell
Training Progression
| Step | WER | Phase |
|---|---|---|
| 300 | 47.67% | Initial training |
| 900 | 38.86% | |
| 1500 | 33.35% | |
| 2100 | 30.77% | |
| 2400 | 30.11% | Plateau detected |
| 2700 | 30.56% | LR decay started |
| 3300 | 29.56% | |
| 3600 | 29.56% | Final β |
β οΈ Limitations
- Code-switching: Difficulty with French words mixed in Wolof speech
- Word segmentation: Sometimes merges or splits words incorrectly
- Background noise: Performance degrades on noisy audio
- Long audios: For audios > 30s, use chunking with stride
π Long Audio Inference
For audios longer than 30 seconds, use HuggingFace pipeline with chunking:
from transformers import pipeline
pipe = pipeline(
'automatic-speech-recognition',
model="Sadou/mms-1b-wolof-finetuned",
chunk_length_s=30,
stride_length_s=(4, 2),
device=0,
)
result = pipe("long_audio.wav")
print(result['text'])
π Acknowledgments
π Citation
@misc{wolof-mms-2026,
author = {Sadou Barry},
title = {MMS-1B Wolof Fine-Tuned},
year = {2026},
publisher = {HuggingFace},
url = {https://huggingface.co/Sadou/mms-1b-wolof-finetuned}
}