AkanTwi-MMS: Asante Twi Text-to-Speech — original fine-tune (research baseline)

Single-speaker Asante Twi (Akan) TTS: VITS checkpoint fine-tuned from Meta's facebook/mms-tts-aka on 9.09 h (6,360 clips post-filter) of one professional narrator from GhanaNLP's ghana-speech (Bible register), 11,940 optimizer steps, Colab T4.

Repo role: this is the ORIGINAL fine-tune, retained as the research baseline and ablation. Measured on the validated judge (10 unseen prompts, seed 33, noise 0.667), both fine-tunes sit above the base model; a lower-LR retrain recovered 39% of the regression and is the submitted variant at Dickson32-cell/akan-twi-mms-gentle. If you need working Akan TTS today, start with the base model.

Model Details

  • Developed by: Abdul Rashid Dickson
  • Model type: VITS — single-stage conditional VAE with adversarial learning, text→waveform end-to-end (MMS-TTS variant, character-level Akan tokenizer, 30-symbol vocab; 83M parameters, 16 kHz)
  • Language(s): Asante Twi (Akan macro-language, ISO 639-3 aka)
  • Finetuned from: facebook/mms-tts-aka
  • License: CC-BY-NC-4.0 (inherited: checkpoint, dataset and judge are all CC BY-NC 4.0 — non-commercial use only)
  • Model DOI: 10.57967/hf/10778

Model Sources

  • Repository: https://github.com/Dickson32-cell/akan-tts-asante (own code: normalizer + test suite, corpus selection/dedup methodology, eval design + --engine mms_aka judge port, environment patches, training configs)
  • Technical report: "Fine-tuning Massively Multilingual Speech Models for Asante Twi Text-to-Speech" (Oct 2026, submission document; ships with the artifact package)
  • External review: "Akan TTS Fine-tune Review" (Oct 9-13, 2026) — its findings are addressed in the report and repo (infer.py settings fix, judge ported to eval_asr.py --engine mms_aka, configs added, README rebuilt)

Training Data (selection funnel, executed run)

143,383 ghana-speech segments (200.02 h) → − 874 digit-prefix chapter headers → − 784 under-3-letter rows → − 49,956 outside the 2.0–12.0 s window → − 30,853 duplicate normalized texts → 60,916 unique rows (84.95 h) → single recording tradition (.1461/.1861 only; .2094 is a second narrator — kept out for purity) → 43.11 h across 60 books → 200 eval clips reserved first (seed 1234) → 9.09 h train budget: 6,402 clips, 42 lost to the harness's own length filter (6,360 trained).

  • Narrator: single professional male reader; Bible-domain text
  • Dialect: Asante Twi (untone-marked orthography)
  • Consent/licence: dataset ships CC BY-NC 4.0 per GhanaNLP's card; no speaker was solicited for TTS use by this project

Training Procedure

ylacombe/finetune-hf-vits (MIT), 30 epochs = 11,940 steps, batch 16, LR 2e-4 (cosine, 2% warmup), Adam β=(0.8, 0.99), weight decay 0.01, loss weights mel 35 / disc 3 / KL 1.5 / duration 1 / fmaps 1 / gen 1, fp16, seed 456, 4.07 h wall clock on a Tesla T4 (Colab free tier). Launcher config: configs/akan-twi-original.json in the code repo. Checkpoints every 1,000 steps.

Convergence evidence: at run time no log survived the session (a review finding); this repo hosts the recovered evidence set (losses.csv, loss_curve.png, convergence_summary.json from the re-instrumented tooling). Later runs publish these automatically.

Environment hardening (documented as contribution): transformers pinned 4.49 (Colab 5.x drops harness-required config attrs); datasets pinned 3.2.0 (4.x/5.x route audio through torchcodec-FFmpeg and break WAV); harness loader patched to load_from_disk (format-inference crash on per-split formats); float-slice int-cast (Python 3.13); matplotlib buffer_rgba; single-process preprocessing. All syntax-verified and idempotent (scripts/patch_harness_v2.py).

Evaluation

Command: python src/eval_asr.py --samples <dir> --engine mms_aka — the repo's evaluator now carries the judge itself: Meta MMS-1b-all CTC ASR + Akan adapter (load_adapter('aka') BEFORE use; measured inflation without it: 0.20 vs 0.088 CER), finiteness guard, and a mismatched-prompt control. Judge bias caveat: judge descends from the same Meta MMS family as the base model; Bible-domain behaviour may favour base phonetics — not ruled out. Mismatched-text control CER 0.92–1.04 across models = the judge discriminates matched from mismatched pairs.

10 unseen everyday-Twi prompts, seed 33, noise 0.667:

Model CER WER
Base facebook/mms-tts-aka 0.088 0.319
This original fine-tune (ablation) 0.324 0.769
Gentle retrain (submitted; see -gentle repo) 0.232 0.662

At noise 1.0: base 0.107 / original 0.424 / gentle 0.315 (measured Oct 9 runs; re-verification on CPU in progress).

Interpretation: on this judge this checkpoint sits far above its base (documented regression) and above the gentle retrain; it is retained (not deleted) as the baseline the improvement claim is measured against. Human listening panel (blinded MOS kit; Twi teacher recruited) is the designed perceptual check — results ship with the submission; ASR numbers are the objective, reproducible layer, not the perceptual gold standard.

Environmental Impact (estimate, Lacoste et al. 2019)

Hardware: 1× Tesla T4 · ~4.07 h training + ~0.6 h evaluation · cloud region: US (Colab) · ≈ 0.02 kg CO₂e (estimate; T4 draws ~50–70 W; grid-intensity assumption documented in repo).

Limitations and Bias

  • Worse than its base model on the validated judge (see table) — do not use where the base suffices
  • Single narrator, Bible domain; everyday-domain outputs show prosody flattening and ɛ→e articulatory blur (measured: nea→niɛ confusions)
  • Untone-marked orthography → prosody acquired implicitly, not tone-controlled
  • Short-clip metallic artifacts (<2 s rows, excluded by the duration window); residual breath insertions from the reading register

Intended / Out-of-Scope Use

  • Research use: negative/ablation documentation, reproduction harness for low-resource TTS
  • Out of scope: commercial deployment (CC BY-NC 4.0), voice cloning of persons, tone-pair-critical applications, use beyond Akan text

How to Get Started

from transformers import VitsModel, VitsTokenizer
import torch, scipy.io.wavfile, numpy as np
model = VitsModel.from_pretrained("Dickson32-cell/akan-twi-mms")
tok = VitsTokenizer.from_pretrained("Dickson32-cell/akan-twi-mms")
tok(noise_scale=...)  # VITS sampling settings are LIVE attributes - see src/infer.py apply_inference_settings
inputs = tok(text="Mema wo akye, me nuanom. Wo ho te sɛn?", return_tensors="pt")
with torch.no_grad():
    wav = model(**inputs).waveform[0]
scipy.io.wavfile.write("out.wav", rate=model.config.sampling_rate,
                       data=(np.clip(wav.numpy(), -1, 1)*32767).astype(np.int16))

Citation

@misc{akanTwimms2026,
  author = {Abdul Rashid Dickson},
  title  = {AkanTwi-MMS: Akan (Asante Twi) Text-to-Speech Model},
  year   = {2026},
  doi    = {10.57967/hf/10778},
  url    = {https://huggingface.co/Dickson32-cell/akan-twi-mms}
}

APA: Dickson, A. R. (2026). AkanTwi-MMS: Akan (Asante Twi) text-to-speech model. Hugging Face. https://doi.org/10.57967/hf/10778

Model Card Contact

Abdul Rashid Dickson — dicksonapam@gmail.com — https://github.com/Dickson32-cell/akan-tts-asante

Downloads last month
117
Safetensors
Model size
83M params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for Dickson32-cell/akan-twi-mms

Finetuned
(10)
this model

Dataset used to train Dickson32-cell/akan-twi-mms