Fatiman-mini-V1
A small Haitian Creole (Kreyòl) text-to-speech model for phones and browsers: Gradium's
phonon-31m-en (a 31 M-parameter flow language model) trained on
Kreyòl, with Kyutai's Pocket TTS Mimi codec. It runs in Gradium's ptts
runtime: Rust CLI, Python, Android, iOS and the browser (WebAssembly). The q8 build is 65 MB and reads at about
20× real time on a laptop CPU and 10–15× inside a browser.
It is the small sibling of Fatiman-TTS-v2: it was taught by it, is more intelligible, as close to the speaker, and less natural. Try it live next to the big models on the showcase page of this repo's author.
Results
Voice lab (the same 12 assistant-style sentences, seeds, human recordings and judges as Fatiman's production sweep; 5 studio speakers both systems know, 60 takes each; CER by Oswald V3, a Kreyòl recognizer; naturalness = UTMOS, similarity = speaker similarity against the recording's own ceiling; score = mean of the three):
| score | UTMOS | similarity | CER % | cut short | |
|---|---|---|---|---|---|
| Fatiman-TTS-v2 (t 0.3, 4 steps) | 0.761 | 3.11 | 0.805 | 5.16 | 0/60 |
| Fatiman V3 (t 0.3, 4 steps; not published) | 0.752 | 3.21 | 0.797 | 9.34 | 3/60 |
| Fatiman-mini-V1 (t 0.3, 1 step, q8) | 0.728 | 2.59 | 0.817 | 2.87 | 0/60 |
Paired against Fatiman-TTS-v2 over voice × sentence (95 % intervals): more intelligible +0.023 [+0.009, +0.040]; as close to the speaker +0.011 [−0.010, +0.033]; less natural −0.132 [−0.158, −0.106]; overall −0.032 [−0.044, −0.021]. Naturalness is the whole remaining gap.
Wide eval, 252 held-out sentences × 7 voices = 1,757 takes at temperature 0.3 (CER by Oswald V1): score 0.752, CER 2.99 %, UTMOS 2.90, similarity 0.809, nothing ran on or was cut short. CER by set: dev 1.49 %, sweep 2.94 %, CMU-80 1.88 %, Klara-120 (phone numbers, prices, dates) 4.22 %.
Speed (Apple M3 Pro): q8 22.5× real time on the CPU through ptts; 13.6× inside Chrome through phonon-tts
(WebAssembly, threads on). q8 CER is 3.12 % against 2.81 % for f32 on the 60 voice-lab takes.
Voices
Eleven voices in voices/, as ptts voice embeddings. female1, female2, female3, female5, man1,
man2 and man3 are the Fatiman speakers, recorded with their signed consent to this use; nouvo1–nouvo4 are
no real person. female1, female2 and man1 score best (0.81 on the wide eval). The model cannot clone a voice
from audio: voices are learned embeddings.
Use
pip install ptts huggingface_hub
hf download jsbeaudry/Fatiman-mini-V1 --local-dir Fatiman-mini-V1
import sys
import ptts
sys.path.insert(0, "Fatiman-mini-V1")
from kreyol_text import normalize # numbers, prices, dates and symbols written out as Kreyòl words
tts = ptts.TTS("Fatiman-mini-V1", lang="none", quant="q8") # quant=None for the f32 weights
tts.save("bonjou.wav", normalize("Bonjou! Li fè 31 degre jodi a."), voice="female1", temperature=0.3)
Always pass text through normalize and use lang="none": the model was trained on words, not digits.
Temperature 0.3 and one flow step are the production settings. config.json carries the settings these weights
need (time_rms_norm: "rms", eos_threshold: -2.0, mimi.gelu: "tanh"); ptts 0.5 or newer reads them.
In the browser, with phonon-tts:
import { PhononTTS } from 'phonon-tts';
const tts = await PhononTTS.load({ lang: 'none', quant: 'q8', model: 'hf://jsbeaudry/Fatiman-mini-V1' }); // weights, config and voices/ from this repo
const pcm = await tts.synth('Bonjou! Kijan ou ye jodi a?', { voice: 'female1', temperature: 0.3 }); // Float32Array, tts.sampleRate
Write numbers out as words on the page too (the kreyol_text.py rules), since the Rust normalizer has no Kreyòl.
How it was made
- Base:
gradium/phonon-31m-en(flow LM, 6 layers × 512), with Pocket TTS's Mimi codec in place of Gradium's. - Data: 44 h of human Kreyòl from 89 speakers (Bible readings, studio sets, paid phone readings from Datamio contributors), plus 135 h of clean takes read by Fatiman-TTS-v2 in 16 consented voices from 330k filtered Kreyòl lines, each take kept only when Oswald heard it at CER ≤ 3 %. Every evaluation sentence was held out.
- Training: 60k steps on two A100s (5.1 h). The published weights are the average of the EMA snapshots at 44k, 46k, 52k, 54k, 56k and 60k, which ties the best single snapshot on score with the lowest error rate.
- Files:
model.safetensors(f32),model.q8.gguf(the phone and browser build),tokenizer.json,tokenizer.model,config.json,voices/,kreyol_text.py.
License
CC-BY-4.0. Based on phonon-31m-en by Gradium (Apache 2.0) and on Pocket TTS by Kyutai (CC-BY 4.0): credit "Pocket TTS by Kyutai". The voices are published with their speakers' consent; never use a voice to deceive.
- Downloads last month
- 44
Model tree for jsbeaudry/Fatiman-mini-V1
Base model
gradium/phonon-31m-en