ASR Whisper 51 African Languages¶
Overview¶
ASR Whisper 51 African Languages is an adaptation of Whisper Large v3 that supports Automatic Speech Recognition (ASR) for 51 languages widely spoken in Africa: English and French with African accents, Swahili, Afrikaans, Tswana, Kinyarwanda, Nigerian Pidgin, Luganda, Acholi, Lugbara, Ateso, Runyankole, Rutooro, Lumasaba, Lusoga, Rukiga, Akan, Amharic, Bambara, Bemba, Berber, Chichewa, Dagaare, Dagbani, Ewe, Fulani, Hausa, Igbo, Ikposo, Kabyle, Kalenjin, Kanuri, Kikuyu, Kwamba, Lendu, Lingala, Luhya, Luo, Malagasy, Ndebele, Oromo, Rukonjo, Ruruuli, Shona, Somali, Sotho, Thur, Wolof, Xhosa, Yoruba, and Zulu.
The model achieves lower Word Error Rate (WER) and Character Error Rate (CER) on most African languages when compared against proprietary and open-source alternatives like Gemini 3.5 Flash, GPT-4o Transcribe, and Meta's Omnilingual ASR (omniASR).
Task Type¶
Automatic Speech Recognition (ASR), Audio-to-Text.
Base Architecture¶
Whisper Large v3 (fine-tuned from openai/whisper-large-v3 and huwenjie333/whisper-v3-ft-af51).
Model Size¶
1.54B parameters.
Quantization Format¶
None. This is the full precision model.
Languages Supported¶
The model supports ASR for English, French, and the following 49 African languages:
| Code | Language | Code | Language |
|---|---|---|---|
ach | Acholi | lin | Lingala |
afr | Afrikaans | lth | Thur |
aka | Akan | lug | Luganda |
amh | Amharic | luo | Luo |
bam | Bambara | luy | Luhya |
bem | Bemba | mlg | Malagasy |
ber | Berber | myx | Lumasaba |
cgg | Rukiga | nbl | Ndebele |
dag | Dagbani | nya | Chichewa |
dga | Dagaare | nyn | Runyankole |
eng | English (African Accented) | orm | Oromo |
ewe | Ewe | pcm | Nigerian Pidgin |
fra | French (African Accented) | ruc | Ruruuli |
ful | Fulani | rwm | Kwamba |
hau | Hausa | sna | Shona |
ibo | Igbo | som | Somali |
kab | Kabyle | sot | Sotho |
kau | Kanuri | swa | Swahili |
kik | Kikuyu | teo | Ateso |
kin | Kinyarwanda | tsn | Tswana |
kln | Kalenjin | ttj | Rutooro |
koo | Rukonjo | wol | Wolof |
kpo | Ikposo | xho | Xhosa |
led | Lendu | xog | Lusoga |
lgg | Lugbara | yor | Yoruba |
zul | Zulu |
Intended Use¶
This model is intended for Automatic Speech Recognition (ASR) applications across the 51 supported languages. Suitable use cases include:
- Transcribing audio to text in any of the 51 supported languages.
- Voice interface systems for local communities.
- Processing low-resource speech datasets for research and application development.
Known Limitations¶
- Speech recognition performance varies depending on the target language, speaker accent, and audio recording quality.
- Accuracy may degrade in noisy environments, with overlapping speakers, or when the spoken language deviates significantly from the training distribution.
- The model might exhibit hallucination or substitution errors, especially for highly low-resource languages.
- Verification and human-in-the-loop validation is recommended for high-stakes domains (medical, legal, financial).
How to Load / Run¶
You can try the model directly using this Colab Notebook, which supports transcribing audio samples from Hugging Face datasets, uploaded audio files, or your microphone.
For better accuracy, specify the language during generation. See the example below, which transcribes an audio sample from the Sunbird/salt Hugging Face dataset:
import transformers
import datasets
import torch
SAMPLE_RATE = 16000
LANGUAGE_TOKENS_WHISPER = {
# Existing languages codes from Whisper
"eng": 50259, "fra": 50265, "swa": 50318, "sna": 50324, "yor": 50325, "som": 50326,
"afr": 50327, "amh": 50334, "mlg": 50349, "lin": 50353, "hau": 50354,
# Overwrite unused language tokens
"ach": 50357, "aka": 50356, "bam": 50355, "bem": 50352, "ber": 50351,
"cgg": 50350, "dag": 50348, "dga": 50347, "ewe": 50346, "ful": 50345,
"ibo": 50344, "kab": 50343, "kau": 50342, "kik": 50341, "kin": 50340,
"kln": 50339, "koo": 50338, "kpo": 50337, "led": 50336, "lgg": 50335,
"lth": 50333, "lug": 50332, "luo": 50331, "luy": 50330, "myx": 50329,
"nbl": 50328, "nya": 50323, "nyn": 50322, "orm": 50321, "pcm": 50320,
"ruc": 50319, "rwm": 50317, "sot": 50316, "teo": 50315, "tsn": 50314,
"ttj": 50313, "wol": 50312, "xho": 50311, "xog": 50310, "zul": 50309
}
LANGUAGE_NAMES = {
'Acholi': 'ach', 'Afrikaans': 'afr', 'Akan': 'aka', 'Amharic': 'amh', 'Ateso': 'teo',
'Bambara': 'bam', 'Bemba': 'bem', 'Berber': 'ber', 'Chichewa': 'nya', 'Dagaare': 'dga',
'Dagbani': 'dag', 'English': 'eng', 'Ewe': 'ewe', 'French': 'fra', 'Fulani': 'ful',
'Hausa': 'hau', 'Igbo': 'ibo', 'Ikposo': 'kpo', 'Kabyle': 'kab', 'Kalenjin': 'kln',
'Kanuri': 'kau', 'Kikuyu': 'kik', 'Kinyarwanda': 'kin', 'Kwamba': 'rwm', 'Lendu': 'led',
'Lingala': 'lin', 'Luganda': 'lug', 'Lugbara': 'lgg', 'Luhya': 'luy', 'Lumasaba': 'myx',
'Luo': 'luo', 'Lusoga': 'xog', 'Malagasy': 'mlg', 'Ndebele': 'nbl', 'Nigerian Pidgin': 'pcm',
'Oromo': 'orm', 'Rukiga': 'cgg', 'Rukonjo': 'koo', 'Runyankole': 'nyn', 'Ruruuli': 'ruc',
'Rutooro': 'ttj', 'Shona': 'sna', 'Somali': 'som', 'Sotho': 'sot', 'Swahili': 'swa',
'Thur': 'lth', 'Tswana': 'tsn', 'Wolof': 'wol', 'Xhosa': 'xho', 'Yoruba': 'yor', 'Zulu': 'zul'
}
model_id = "Sunbird/asr-whisper-51-african-languages"
model = transformers.WhisperForConditionalGeneration.from_pretrained(model_id)
processor = transformers.WhisperProcessor.from_pretrained(model_id)
def transcribe_by_whisper(audio_array, language):
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
input_features = processor(
audio_array, sampling_rate=SAMPLE_RATE, do_normalize=True, return_tensors="pt"
).input_features.to(device)
lang_tok = LANGUAGE_TOKENS_WHISPER[LANGUAGE_NAMES[language]]
transcribe_tok = processor.tokenizer.convert_tokens_to_ids("<|transcribe|>")
notimestamps_tok = processor.tokenizer.convert_tokens_to_ids("<|notimestamps|>")
forced_decoder_ids = [
(1, lang_tok),
(2, transcribe_tok),
(3, notimestamps_tok),
]
predicted_ids = model.to(device).generate(
input_features,
forced_decoder_ids=forced_decoder_ids,
num_beams=1,
do_sample=False,
)
transcription = processor.decode(
predicted_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)
print(transcription[0])
# Get some test audio
import huggingface_hub
huggingface_hub.login()
ds = datasets.load_dataset('Sunbird/salt', 'multispeaker-lug', split='test')
audio_column = 'audio'
ds = ds.cast_column(audio_column, datasets.Audio(sampling_rate=SAMPLE_RATE))
audio_array = ds[0][audio_column]['array']
# Specify a language
lang = 'Luganda'
transcribe_by_whisper(audio_array, lang)
# Ekikoola kya kasooli kya kyenvu wabula langi yakyo etera okuba eya kitaka wansi.
Performance Metrics¶
Our model is designed to excel on low-resource African languages such as Acholi and Ateso from Uganda, while achieving comparable performance on widely spoken African languages like Swahili, and African-accented English/French.
Below is a comparison of Word Error Rate (WER) and Character Error Rate (CER) measured for each language on the evaluation datasets. For ach, eng, lgg, lug, nyn, and teo, the dev splits of the multispeaker-* subsets in the Sunbird/salt dataset were used for evaluation. For the remaining languages, we used the first 50 examples from the dev split of each subset in the Training Datasets after filtering out clips longer than 30 seconds.
| Code | Language | WER | CER | n_examples |
|---|---|---|---|---|
afr | Afrikaans | 0.084 | 0.028 | 170 |
aka | Akan | 0.323 | 0.129 | 50 |
amh | Amharic | 0.401 | 0.265 | 250 |
bam | Bambara | 0.361 | 0.170 | 149 |
bem | Bemba | 0.408 | 0.091 | 100 |
ber | Berber | 0.147 | 0.041 | 50 |
cgg | Rukiga | 0.242 | 0.057 | 49 |
dag | Dagbani | 0.321 | 0.109 | 100 |
dga | Dagaare | 0.294 | 0.113 | 50 |
ewe | Ewe | 0.291 | 0.097 | 78 |
fra | French | 0.032 | 0.019 | 50 |
ful | Fulani | 0.395 | 0.115 | 149 |
hau | Hausa | 0.168 | 0.047 | 287 |
ibo | Igbo | 0.340 | 0.117 | 247 |
kab | Kabyle | 0.447 | 0.219 | 50 |
kau | Kanuri | 0.389 | 0.101 | 50 |
kik | Kikuyu | 0.209 | 0.099 | 50 |
kin | Kinyarwanda | 0.307 | 0.084 | 100 |
kln | Kalenjin | 0.471 | 0.112 | 100 |
koo | Rukonjo | 0.527 | 0.093 | 47 |
kpo | Ikposo | 0.617 | 0.231 | 50 |
led | Lendu | 0.273 | 0.093 | 50 |
lin | Lingala | 0.243 | 0.104 | 193 |
lth | Thur | 0.148 | 0.059 | 41 |
luo | Luo | 0.226 | 0.051 | 149 |
luy | Luhya | 0.203 | 0.038 | 50 |
mlg | Malagasy | 0.143 | 0.060 | 49 |
nbl | Ndebele | 0.263 | 0.051 | 10 |
nya | Chichewa | 0.273 | 0.058 | 98 |
orm | Oromo | 0.241 | 0.064 | 119 |
pcm | Nigerian Pidgin | 0.167 | 0.065 | 100 |
ruc | Ruruuli | 0.480 | 0.105 | 38 |
rwm | Kwamba | 0.584 | 0.234 | 49 |
sna | Shona | 0.196 | 0.050 | 147 |
som | Somali | 0.381 | 0.127 | 149 |
sot | Sotho | 0.229 | 0.117 | 94 |
swa | Swahili | 0.087 | 0.022 | 99 |
tsn | Tswana | 0.067 | 0.018 | 98 |
ttj | Rutooro | 0.222 | 0.063 | 49 |
wol | Wolof | 0.319 | 0.122 | 135 |
xho | Xhosa | 0.262 | 0.054 | 126 |
yor | Yoruba | 0.384 | 0.136 | 249 |
zul | Zulu | 0.207 | 0.042 | 143 |
ach | Acholi | 0.197 | 0.044 | 101 |
eng | English | 0.041 | 0.016 | 101 |
lgg | Lugbara | 0.216 | 0.052 | 101 |
lug | Luganda | 0.109 | 0.022 | 103 |
nyn | Runyankole | 0.262 | 0.051 | 103 |
teo | Ateso | 0.275 | 0.068 | 101 |
myx | Lumasaba | 0.347 | 0.071 | 100 |
xog | Lusoga | 0.301 | 0.056 | 100 |
Visual Comparisons¶

Figure 1: Comparative WER and CER performance against proprietary and open-source models.

Figure 2: Word Error Rate (WER) vs. training hours.

Figure 3: Character Error Rate (CER) vs. training hours.
Training Datasets¶
The model was fine-tuned on a multilingual corpus covering 51 African languages, assembled from a range of publicly available and community-collected speech datasets. The table below lists each source dataset and the languages it contributes to training (ISO 639-3 code in parentheses). A language may appear in more than one source.
| Source dataset | Languages |
|---|---|
| Mozilla Common Voice | Afrikaans (afr), Amharic (amh), Rukiga (cgg), Dagbani (dag), Hausa (hau), Igbo (ibo), Kabyle (kab), Kinyarwanda (kin), Kalenjin (kln), Rukonjo (koo), Lendu (led), Thur (lth), Luganda (lug), Luo (luo), Nigerian Pidgin (pcm), Ruruuli (ruc), Kwamba (rwm), Swahili (swa), Tswana (tsn), Rutooro (ttj), Yoruba (yor) |
| Google FLEURS | Afrikaans (afr), Fulani (ful), Hausa (hau), Igbo (ibo), Lingala (lin), Luganda (lug), Luo (luo), Chichewa (nya), Oromo (orm), Shona (sna), Somali (som), Sotho (sot), Swahili (swa), Wolof (wol), Xhosa (xho), Yoruba (yor), Zulu (zul) |
| Google Waxal | Acholi (ach), Akan (aka), Amharic (amh), Dagbani (dag), Dagaare (dga), Ewe (ewe), Fulani (ful), Ikposo (kpo), Lingala (lin), Luganda (lug), Malagasy (mlg), Lumasaba (myx), Runyankole (nyn), Oromo (orm), Shona (sna), Lusoga (xog) |
| ASR Africa Data Efficiency Benchmark | Afrikaans (afr), Amharic (amh), Bambara (bam), Bemba (bem), Ewe (ewe), Fulani (ful), Hausa (hau), Igbo (ibo), Kinyarwanda (kin), Luganda (lug), Oromo (orm), Shona (sna), Wolof (wol), Xhosa (xho), Yoruba (yor), Zulu (zul) |
| African Next Voices | Kikuyu (kik), Kalenjin (kln), Luo (luo), Somali (som), Ndebele (nbl), Sotho (sot), Tswana (tsn), Xhosa (xho), Zulu (zul) |
| Sunbird SALT | Acholi (ach), English (eng), Lugbara (lgg), Luganda (lug), Runyankole (nyn), Ateso (teo) |
| African Voices | Hausa (hau), Igbo (ibo), Nigerian Pidgin (pcm), Yoruba (yor) |
| NaijaVoices | Hausa (hau), Igbo (ibo), Yoruba (yor) |
| CLEAR Global | Hausa (hau), Kanuri (kau) |
| Shunya Labs | Amharic (amh), Lingala (lin) |
| RobotsMali Bambara ASR | Bambara (bam) |
| AfriSpeech-200 (Intron Health) | English (eng) |
| African-Accented French | French (fra) |
| Afrikaans-30s | Afrikaans (afr) |
| BembaSpeech | Bemba (bem) |
| TutlaytAI Amazigh ASR | Berber (ber) |
| KasuleTrevor Lingala | Lingala (lin) |
| Makerere Radio Speech | Luganda (lug) |
| Digital Divide Data | Luhya (luy) |
| michsethowusu | Chichewa (nya) |
| Soomali ASR | Somali (som) |
| Kallaama | Wolof (wol) |
| KYAGABA | Amharic (amh) |
[!NOTE] African Next Voices dataset is drawn from two collection hubs: Kenya (Kikuyu, Kalenjin, Luo, Somali) and Southern Africa (Ndebele, Sotho, Tswana, Xhosa, Zulu).
Licence¶
Released under the Apache 2.0 license (matching the base architecture and training set details).
Hugging Face¶
https://huggingface.co/Sunbird/asr-whisper-51-african-languages
Last Updated¶
2026