Twi ASR (w2v-BERT CTC, v2 continuation)
Author: Prince Nasamu Alhassan
Overview
A CONTINUATION of tekyerema-asr-ctc (Twi v1), not a restart — same Wav2Vec2BertForCTC weights carried forward at LR 1.5e-5 for 796 steps before Kaggle's wall clock ended the session.
The most downloaded model on this account. It is also the one whose headline was retracted, so read the numbers before the name.
Use it
import torch, soundfile as sf
from transformers import AutoProcessor, AutoModelForCTC
repo = "PrinceAlhassanNasamu/tekyerema-asr-ctc-twi-v2"
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])
Measured
Scored 2026-09-01 on the Nsanku benchmark, same clips and same scorer for both models, WER / CER:
| slice | v1 (tekyerema-asr-ctc) | v2 (this model) |
|---|---|---|
| in-domain mean, 4 configs | 37.2 / 18.4 | 23.4 / 10.5 |
clean configs (lds_Asante_Twi, unicef_Asante_Twi) | 79.4 / 48.1 | 76.4 / 49.3 |
Read the second row as carefully as the first.
- The in-domain mean covers
finance_Akuapem_Twi,finance_Asante_Twi,waxal_Asante_Twiandbible_Asante_Twi— configs that both models trained on. It is a v2-versus-v1 DELTA and it is not a benchmark result. It answers one question only, and a real one: did the continuation forget the register the agent was built for? It did not; it gained 13.8 WER points there. - The clean row is the benchmark, and on it this model is flat. Three WER points on two configs, with CER moving the wrong way (48.1 → 49.3). More training data in the same domains did not buy out-of-domain Twi.
A retracted headline. An earlier version of this result claimed
76.1 → 67.2 on clean configs. That was wrong: it included
bible_Akuapem_Twi, which stopped being a clean config the moment
Asante-Twi scripture entered the training mix. The config is still
reported by H200/sessions/eval_nsanku.py but flagged, not counted.
Training data
56,000 rows: gold capped at 3,000 per config (fisd_asante,
fisd_akuapem, kasaspeech, waxal_aka), KasaSpeech code-switching ×2,
two audio_path-recovered sets ×2, the Ewe/Twi navigation corpus ×2, and
the owner's demo-register recordings ×10. Clips over 20 s are DROPPED
rather than truncated — v1 was trained through a defect that cut audio at
20 s while keeping the whole transcript, corrupting 37.9% of waxal_aka
rows.
Recipe: LR 1.5e-5 linear with 0.1 warmup, batch 8 × grad-accum 2, 1 epoch capped at 1,000 steps (796 completed), final validation loss 0.2192.
Status
Active, and not wired into the agent. speak_to_phone.py still loads
v1. Unwiring that is a separate change and has not been made, so the model
serving Twi in the running system is v1, not this.
Limitations, stated plainly
- A validation loss is not a benchmark. Several cards on this account used to print the training run's own eval loss under a heading that read like a result. Where this card gives a WER or CER it names the slice and the scorer; where no such number exists it says the model is unscored.
- Scripture-derived audio does not generalise to speech. The Kusaal
and much of the Ewe material is read scripture with a small number of
narrators. Held out by CLIP rather than by SPEAKER it produces scores
that look excellent and mean nothing -- the public
bible_Kusaalfigure of 11.69 is invalid for exactly this reason and must never be quoted. - Evaluation is on read and machine-translated text. No corpus of people speaking natural phone commands in these languages exists. 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
Twi — tekyerema-asr-ctc (v1, w2v-BERT CTC) · tekyerema-asr-ctc-twi-v2 (continuation)
Kusaal — tekyerema-asr-mms-kus (MMS adapter, the one to use) · tekyerema-asr-ctc-kus-v2 (new w2v-BERT line) · kasa42-asr (third-party baseline)
Ewe — tekyerema-asr-mms-ewe (the one to use) · tekyerema-asr-ctc-ewe · tekyerema-asr-ctc-ewe-v3
Other recognisers — tekyerema-asr-mms-dag · tekyerema-asr-mms-hau · whisper-large-v3-turbo-tekyerema-eng
Voices — tekyerema-tts-twi · tekyerema-tts-kus · tekyerema-tts-ewe · tekyerema-tts-hau · tekyerema-tts-eng
Agent models — tekyerema-1-v2-tool-pilot · tekyerema-1-native-v2-tool-pilot · tekyerema-audio-native-4k
Translation & routing — tekyerema-nllb600m-v1 · kusaal-nllb-600M · tekyerema-intent-afroxlmr
Acknowledgements
Compute resources provided by AI Skills and Compute Africa (AISCA).
Trained on the Ghana NLP H200 GPU and on Kaggle T4s. 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.