Spark-TTS 0.5B for Eʋegbe (Ewe) — mixed-register
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 the mixed-register variant. It was adapted in a second stage on
non-scriptural speech, to move the voice away from the slow, declamatory
delivery that training on Bible readings alone produces.
For the scriptural-register version, see
analist/spark-tts-ewe-cotia.
A research baseline, not a production voice. Read the limitations before
using it for anything.
Status
| |
|---|
| Stage 1 data | ~69 h single-speaker scriptural read speech |
| Stage 2 data | WAXAL Ewe (google/WaxalNLP) |
| Eval loss | 3.31 (stage 1 finished at 3.427) |
| Formal evaluation | none — no MOS, no intelligibility study |
Caveat on that loss figure: the evaluation split is drawn from the mixture, so
it is still majority scriptural and does not directly measure whether the
register shifted. The register claim rests on listening, not on the number.
Audio samples
No audio samples are published with this release yet.
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 is mispronounced with no obvious sign
of what went wrong. ewe_text.py is included for exactly this reason.
1from ewe_text import normalize_ewe
2text = normalize_ewe("Ŋdi na mi. Èfɔa?", digit_policy="verbalize")
See inference_example.py for a full script. You also need the Spark-TTS
source:
1git clone https://github.com/SparkAudio/Spark-TTS
2pip install omegaconf einx soundfile librosa soxr
Temperature 0.5–0.6. Pass <|im_end|> and <|end_semantic_token|> as
stop tokens or generation runs past the end of the utterance.
Training
Two stages. The first teaches the language; the second only shifts register,
which is a far smaller adjustment and needs a much lower learning rate.
| Stage 1 | Stage 2 |
|---|
| Data | BibleTTS Ewe | mixture, 35% new register |
| Epochs | 4 | 2 |
| Learning rate | 3e-5 | 8e-6 |
| Init from | Spark-TTS 0.5B | stage-1 weights |
Stage 2 deliberately retains a majority of the stage-1 data. A pure
second-register run on a few thousand clips overfits quickly and can undo the
phonetics learned in stage 1 — the model stops seeing scriptural vocabulary
and forgets how to pronounce it.
Text pipeline in both stages: Unicode NFC, confusable-codepoint repair, digits
dropped from training text, over-length sequences dropped rather than
truncated (truncation removes the trailing <|im_end|> and teaches the model
never to stop).
Limitations
- Register is shifted, not solved. Stage 2 data is still largely read
speech. Spontaneous conversational prosody remains out of domain.
- Tone is implicit. Ewe is tonal; there is no tone-aware front end.
Tone is learned from acoustics and is not reliable on minimal pairs.
- No formal evaluation. No MOS, no intelligibility testing, no native
speaker panel.
- Alignment unverified in the stage-1 corpus.
Intended use
Research on low-resource and African-language TTS; a checkpoint for further
fine-tuning; prototyping where output is checked by a speaker. Not for
unsupervised production use.
Attribution
Stage 1 speech data from BibleTTS (Meyer et al., Interspeech 2022;
OpenSLR 129), CC BY-SA 4.0.
Stage 2 speech data from WAXAL (Google Research and the Gates Foundation,
2026; google/WaxalNLP), Ewe portions collected by the University of
Ghana, CC BY-4.0.
Base model Spark-TTS by SparkAudio. Fine-tuning with Unsloth.
Licensing note: WAXAL's Ewe data is CC BY-4.0, which is permissive, but
ShareAlike propagates from BibleTTS — so this model is released under
CC BY-SA 4.0. Credit both corpora.
Contributions welcome
The binding constraint is still data: genuinely spontaneous, multi-speaker Ewe
speech would do more for this model than any change to architecture or
compute.