Twi ASR (w2v-BERT CTC)
Author: Prince Nasamu Alhassan
Overview
Fine-tuned from ghananlpcommunity/w2v-bert-2.0_twi_alpha_v1, the measured Twi champion of the zero-shot bake-off.
It wins on all four Twi gold slices, scored 2026-08-31 with the same items and the same scorer as the baseline:
| slice | baseline | this model | Δ WER |
|---|---|---|---|
waxal_aka | 38.56 / 12.34 | 22.74 / 7.09 | −15.8 |
kasaspeech | 76.71 / 37.00 | 22.07 / 5.65 | −54.6 |
fisd_akuapem | 59.62 / 24.90 | 48.46 / 33.54 | −11.2 |
fisd_asante | 73.40 / 38.12 | 63.97 / 38.86 | −9.4 |
kasaspeech is the largest move in the project: the baseline was effectively failing on it at 76.7, and this model reads it at 22.1.
One thing that got worse. On the two fisd slices the WER falls but the CER RISES — 24.90 to 33.54 on Akuapem, and 38.12 to 38.86 on Asante. More whole words are right and more individual characters are wrong, which usually means the output is segmented differently from the reference rather than that the audio was misheard. It is reported because it is real, not explained away: for a system that has to recover a phone number, a rising CER is the direction that matters.
This repo could not be loaded at all until 2026-08-31. It held weights, a config and no processor — no feature extractor and no vocabulary — so from_pretrained failed after the download for everyone who tried. The processor is now in the repo.
Use it
import torch, soundfile as sf
from transformers import AutoProcessor, AutoModelForCTC
repo = "PrinceAlhassanNasamu/tekyerema-asr-ctc"
proc = AutoProcessor.from_pretrained(repo)
model = AutoModelForCTC.from_pretrained(repo).eval()
wav, sr = sf.read("clip.wav", dtype="float32") # 16 kHz mono
inp = proc(wav, sampling_rate=16_000, return_tensors="pt")
with torch.no_grad():
logits = model(**inp).logits
print(proc.batch_decode(logits.argmax(-1))[0])
Training data
Trained on the Ghana Speech dataset and related Ghanaian corpora, licensed CC BY-NC 4.0.
Measured
On waxal_aka, same items and same scorer as the baseline:
| model | WER / CER |
|---|---|
| baseline it was fine-tuned from | 38.56 / 12.34 |
| this model | 22.74 / 7.09 |
A WER alone is not informative — compared against another language it means nothing. Compared against the model it started from, it means everything.
Intended use & license
Non-commercial use only (CC BY-NC 4.0). This is inherited from the training data and required by the terms under which the compute was granted: models trained in that window are non-commercial by condition of access, not by inference.
Limitations, stated plainly
- Dagbani did get a recogniser, and the claim that it could not was
wrong twice over. Every card on this account used to say that "one
fine-tuning session on 74 validation rows would not change that". Those
74 rows are the eng-dag machine-translation validation split; the
Dagbani speech data in this same account is
waxal_dag— 13,228 training rows, 1,750 validation rows, ~71 hours, 1,041 speakers with the largest at 1%. Trained on it,tekyerema-asr-mms-dagscores 36.94 / 11.71, against the 86.59 / 33.95 this project had believed was the ceiling. It still loses toFarmerlineML/w2v-bert-2.0_2026_dagbani_ASRat 29.20 / 9.27, which is what the agent actually serves. A number carried across from a translation table into a speech claim was then repeated on every card here until 2026-09-22. - Evaluation is on read and machine-translated text. No recordings of people speaking agent commands in these languages exist. Numbers measured this way are optimistic about phrasing and pessimistic about code-switching, and should not be read as field performance.
- Research work from a hackathon entry, not a supported product.
The rest of the family
Recognisers
whisper-large-v3-turbo-tekyerema-eng-foundation— Ghanaian English ASR — course 1 (foundation)kusaal-whisper-small-lora— Kusaal ASR (Whisper-small LoRA, superseded)kasa42-asr— KASA-42 (Kusaal, third-party export)tekyerema-asr-ctc— Twi ASR (w2v-BERT CTC)tekyerema-asr-mms-ewe— Ewe ASR (MMS adapter)tekyerema-asr-mms-dag— Dagbani ASR (MMS adapter)tekyerema-asr-mms-hau— Hausa ASR (MMS adapter)tekyerema-asr-mms-kus— Kusaal ASR (MMS adapter)whisper-large-v3-turbo-tekyerema-eng— Ghanaian English ASR (Whisper large-v3-turbo)
Voices
tekyerema-tts-twi— Twi TTS (VITS)tekyerema-tts-kus— Kusaal TTS (VITS)tekyerema-tts-ewe— Ewe TTS (VITS)tekyerema-tts-hau— Hausa TTS (VITS)tekyerema-tts-eng— Ghanaian English TTS (VITS)
Agent models
tekyerema-1-reply— Tɛkyerɛma-1 reply adapter (arm ①)tekyerema-1-native-reply— Tɛkyerɛma-1 reply adapter (arm ②)tekyerema-1-tool— Tɛkyerɛma-1 tool adapter (arm 1)tekyerema-audio-native— Tɛkyerɛma-1 audio-native (arm 3)tekyerema-audio-native-4k— Tɛkyerɛma-1 audio-native, 4,000 clips (arm 3 v2)tekyerema-1-native-tool— Tɛkyerɛma-1 tool adapter (arm 2)
Translation
tekyerema-nllb600m-v1— Tɛkyerɛma MT v1 (NLLB-600M)kusaal-nllb-600M— Kusaal MT specialist (NLLB-600M)
Routing
tekyerema-intent-afroxlmr— Intent classifier (AfroXLMR)
Acknowledgements
Compute resources provided by AI Skills and Compute Africa (AISCA).
Trained on the Ghana NLP H200 GPU. Please keep derivatives non-commercial
and share improvements back with the Ghana NLP community
(ghananlpcommunity).
Farmerline
Twi ASR training data is used with the permission of Farmerline, granted for non-commercial research use on 2026-08-28 through Ghana NLP. That permission is a condition of this model existing and is acknowledged here as required.