PrinceAlhassanNasamu/tekyerema-tts-ewe
Ewe TTS (VITS)
Author: Prince Nasamu Alhassan
Overview
Fine-tuned from facebook/mms-tts-ewe. 20,000 steps on bibletts_ewe_hifi (22,192 rows) and waxal_ewe_tts (1,007). Predominantly scripture, so the same register caveat as Kusaal applies, softened by the Waxal portion.
Use it
import torch, soundfile as sf
from transformers import AutoTokenizer, VitsModel
repo = "PrinceAlhassanNasamu/tekyerema-tts-ewe"
tok = AutoTokenizer.from_pretrained(repo)
model = VitsModel.from_pretrained(repo).eval()
text = "your text here".lower() # LOWERCASE IS NOT OPTIONAL -- see below
with torch.no_grad():
wav = model(**tok(text, return_tensors="pt")).waveform[0]
sf.write("out.wav", wav.numpy(), model.config.sampling_rate)Read this before sending it real text. These VITS tokenisers are CHARACTER-level, and a character outside the vocabulary is dropped silently -- no error, no gap in the audio. Measured 2026-09-23 on 6,945 real agent commands (tekyerema-distill-agent-v2, the utterance-disjoint corpus), per voice, not borrowed from a sibling: | voice | raw text | after.lower()| after.lower()+ number verbalisation | |---|---|---|---| |tekyerema-tts-eng| 6.8% | 1.2% | 0.00% | |tekyerema-tts-twi| 10.4% | 5.5% | 0.01% | |tekyerema-tts-hau| 12.0% | 6.8% | 0.00% | |tekyerema-tts-kus| 12.6% | 8.0% | 1.72% | |tekyerema-tts-ewe| 12.8% | 7.6% | 0.00% | Between 98% and 100% of real commands lose at least one character if you send them raw. The single largest cause is capitalisation, and it was missing from every earlier version of this card. None of these five vocabularies containsA-Z. Uppercase accounts for 36-82% of everything dropped -- 81.8% for English. "Send Kwame 50 cedis" loses itsS, itsKand its digits.text.lower()is a one-line fix and it is the highest-value thing on this page. Digits are the second cause. Vocabulary coverage is erratic rather than absent: Ewe and Kusaal have no digits, Hausa has only6, Twi has only2and3, and English has0-6but not `7`, `8` or `9` -- which is worse than having none, because it fails invisibly. Spell numbers into words before synthesis. Kusaal keeps a 1.72% residual after both fixes that the other voices do not: its 35-character vocabulary has noc, so cedis is spoken as edis -- the word naming the money in a payment confirmation. Route words whose letters this voice lacks to a voice that has them.AGENT/agent_core.pydoes the number and routing halves (verbalize_numbers,sayable_segments); the lowercasing is on you. Reproduce:overnight/exp003_tts_coverage.pyandovernight/exp003b_tts_fix.pyin the Tɛkyerɛma repo.
Training data
Trained on the Ghana Speech dataset and related Ghanaian corpora, licensed CC BY-NC 4.0.
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).
