Sadou's picture
MMS-1B Wolof fine-tuned - WER 29.56% (full fine-tune, 20k samples)
9af1f0f verified
|
Raw
History Blame Contribute Delete
4.36 kB
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

  • Meta AI for MMS
  • vonewman for the Wolof audio dataset
  • GalsenAI and the Senegalese AI community

πŸ“š 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}
}