Today we're releasing whisper-som-small, our first public Somali ASR checkpoint. Fine-tuned from OpenAI's Whisper-small on 320 hours of aligned Somali audio, it achieves 11.4% WER on held-out radio speech — a 38% relative improvement over the zero-shot multilingual baseline.
Background
Whisper is a strong multilingual ASR model, but Somali is severely underrepresented in its training data. The zero-shot Whisper-small baseline on our radio test set gives 18.4% WER — usable in some contexts, but not reliable enough for production transcription or downstream NLP tasks that depend on accurate text.
Fine-tuning on in-domain data is the obvious fix. The challenge is data: high-quality aligned speech is expensive to produce. Our SomNLP-STT-Corpus, released last year, gave us the raw material to do this properly.
The dataset
SomNLP-STT-Corpus contains 320 hours of Somali audio across four sources: radio broadcasts (Radio Mogadishu, HornAfrik), government speeches, storytelling recordings, and community-contributed reading passages.
320h
Total audio
280h
Training split
20h
Validation
20h
Test split
Word-level alignment was generated using Montreal Forced Aligner with our custom Somali acoustic model, then manually corrected on a 10% random sample. Alignment accuracy on the corrected sample was 96%.
Training setup
We fine-tuned Whisper-small (244M parameters) for 8,000 steps on a single A100 40GB GPU, using Hugging Face transformers with Seq2SeqTrainer, a learning rate of 1e-5, linear warmup over 500 steps, and gradient accumulation over 4 steps for an effective batch size of 16.
We froze the encoder for the first 2,000 steps to preserve general acoustic representations before allowing end-to-end fine-tuning. This reduced early divergence and improved final WER by ~1.2 points over full fine-tuning from step 0.
Results
On the held-out 20-hour radio test set, whisper-som-small achieves 11.4% WER — down from 18.4% zero-shot. The absolute improvement is largest on broadcast news (−8.2%) and smallest on conversational speech (−4.1%), where our training data was thinner.
Usage
import whisper
# Load the fine-tuned model
model = whisper.load_model("goobolabs/whisper-som-small")
# Transcribe audio
result = model.transcribe("somali_audio.wav", language="so")
print(result["text"])
# 'Beeraha Soomaaliya waxay u baahan yihiin tignoolajiyad cusub.'
# With word-level timestamps
result = model.transcribe("audio.wav", language="so", word_timestamps=True)
for seg in result["segments"]:
print(f"{seg['start']:.1f}s – {seg['end']:.1f}s: {seg['text']}")Omar Tood
Data Scientist
Writing about Somali language technology, open data, and AI from the lab in Mogadishu.