Spark-TTS 0.5B fine-tuned for Eʋegbe (Ewe)

A text-to-speech model for Ewe (Eʋegbe), a tonal Gbe language spoken by roughly five million people in southeastern Ghana and southern Togo.

This is a research baseline, not a production voice. Please read the evaluation and limitations sections before using it for anything.

Status

Training data ~67h of single-speaker read speech
Final eval loss 3.3
Train/eval gap 0.027 (no overfitting)
Perceptual quality intelligible; prosody limited
Formal evaluation none yet — no MOS, no intelligibility study

The loss curve had flattened when training stopped, with no overfitting gap. That combination indicates the ceiling is in the data rather than the optimisation: more varied speech would help, more epochs would not.

Audio samples

Samples are in samples/. They are unedited model output with no post-processing, cherry-picking or retakes.

temperature 0.9

file
samples/t09/ewe_00.wav
samples/t09/ewe_01.wav
samples/t09/ewe_02.wav
samples/t09/ewe_03.wav
samples/t09/ewe_04.wav

A note on temperature. These were generated at temperature 0.9. That is higher than this checkpoint is happiest at: on an undertrained model, higher temperature amplifies instability, and prosody is already this model's weakest dimension. Sampling at 0.5–0.6 gives steadier output. The samples are published at the setting they were produced with rather than at the flattering one.

Usage

The text normaliser is not optional. Ewe is routinely typed with confusable codepoints — Greek ε for ɛ, γ for ɣ, ϕ for ƒ — which a byte-level tokenizer treats as unrelated symbols. This model was trained on canonicalised text, so text that skips normalisation will be mispronounced with no obvious sign of what went wrong. ewe_text.py is included for exactly this reason.

from ewe_text import normalize_ewe
text = normalize_ewe("Ŋdi na mi. Nye ŋkɔe nye Kofi.", digit_policy="verbalize")

See inference_example.py for a complete script. You will also need the Spark-TTS source:

git clone https://github.com/SparkAudio/Spark-TTS
pip install omegaconf einx soundfile librosa soxr

Generation settings that matter: temperature 0.5–0.6 (0.7+ slurs on a model this size), and pass <|im_end|> and <|end_semantic_token|> as stop tokens or generation runs on past the end of the utterance.

Training

Base unsloth/Spark-TTS-0.5B (Qwen2.5-0.5B + BiCodec)
Corpus BibleTTS Ewe (OpenSLR 129), CC BY-SA 4.0
Clips 13,903 retained, 1–22 s, 16 kHz mono
Adaptation full fine-tune, fp32 with TF32
Schedule 4 (after 3 at 1e-5) epochs, lr 3e-5, cosine, 3% warmup
Batch 2 × 8 accumulation = 16
Hardware 1 × NVIDIA L4 (24 GB)

Text pipeline: Unicode NFC, confusable-codepoint repair, digit-bearing rows dropped from training (a transcript does not record how the speaker read a numeral), over-length sequences dropped rather than truncated — truncation removes the trailing <|im_end|> and teaches the model never to stop.

Limitations

  • One speaker, one register. Liturgical read speech is slow and declamatory. Conversational prosody is out of domain and will sound wrong.
  • Tone is implicit. Ewe is tonal; there is no tone-aware front end. Tone is learned from acoustics alone and is not reliable on minimal pairs.
  • Alignment unverified. Verse alignment in the source corpus is automatic. Residual misalignment has not been quantified.
  • No formal evaluation. No MOS, no intelligibility testing, no native speaker panel. Perceptual claims here are informal.
  • Biblical vocabulary bias. Domain terms are over-represented.

Intended use

Research on low-resource and African-language TTS; a starting checkpoint for further fine-tuning; accessibility prototyping where output is checked by a speaker. Not suitable for unsupervised production deployment, and not for anything where a mispronunciation carries a cost.

Attribution

Speech data from BibleTTS (Meyer et al., Interspeech 2022; OpenSLR 129), CC BY-SA 4.0. Base model Spark-TTS by SparkAudio. Fine-tuning with Unsloth.

If you build on this, please credit the BibleTTS authors — the corpus is the reason any of this is possible for Ewe.

Contributions welcome

The single most useful thing anyone could add is non-scriptural Ewe speech, particularly conversational recordings and additional speakers. That is the binding constraint here, not model size or compute.

Downloads last month
9
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for analist/spark-tts-ewe-cotia

Finetuned
(5)
this model