Instructions to use jsbeaudry/Fatiman-TTS-v2 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Pocket-TTS
How to use jsbeaudry/Fatiman-TTS-v2 with Pocket-TTS:
from pocket_tts import TTSModel import scipy.io.wavfile tts_model = TTSModel.load_model("jsbeaudry/Fatiman-TTS-v2") voice_state = tts_model.get_state_for_audio_prompt( "hf://kyutai/tts-voices/alba-mackenna/casual.wav" ) audio = tts_model.generate_audio(voice_state, "Hello world, this is a test.") # Audio is a 1D torch tensor containing PCM data. scipy.io.wavfile.write("output.wav", tts_model.sample_rate, audio.numpy()) - Notebooks
- Google Colab
- Kaggle
Fatiman-TTS-v2
A Haitian Creole (Kreyòl) text-to-speech model: Kyutai's Pocket TTS (French 24-layer model) fine-tuned on Kreyòl speech. It runs on a CPU and streams, like Fatiman-TTS-v1.
What changed from v1: v2 is trained on human speech only. v1's data included synthetic speech from other
TTS services; v2 uses none, and reads as accurately as v1. The ONNX export for phones and browsers is
Fatiman-TTS-v2-onnx. More on the
Fatiman page of thetrio.space.
Results
Character error rate (CER) after reading sentences aloud and transcribing them back with Oswald, a Kreyòl speech recognizer; lower is better.
Against OpenAI and Google TTS (2026-10-19). 120 sentences sampled from our datasets of OpenAI TTS
(onyx, shimmer, nova) and Google TTS (zefi, kore, charles) Kreyòl audio, 20 per voice, 6–18 words,
no digits. Fatiman v2 read the same sentences once each (no best-of), voices man3 and female1 alternating.
None of the sentences is in v2's training data.
| Sentences | Their audio | Fatiman-TTS-v2 | Difference, 95% bootstrap interval | Sentences where Fatiman is better / worse |
|---|---|---|---|---|
| 60 from OpenAI TTS | 5.8% | 3.9% | 1.9 points [1.0, 2.8] | 35 / 8 |
| 60 from Google TTS | 1.9% | 1.8% | 0.1 points [−1.1, 1.3]: a tie | 17 / 14 |
The OpenAI and Google clips were generated in early 2026; those services may score differently today.
Against v1 (the same 80 held-out sentences as v1's card, six voices pooled, scored by Oswald-ASR-0.6-V1):
| v1 | v2 | |
|---|---|---|
| CER, 80 held-out sentences | 2.70% | 2.68% |
| CER, Klara-120 (assistant-style sentences with numbers and names) | 5.73% | 5.89% |
| First word wrong, 80 sentences × 6 voices | 38 / 480 | 39 / 480 |
Voices
The same nine voices as v1, in voices/, re-computed for this model. Each was made from about 7–10 s of a
speaker's recording, collected with their signed consent to this use: female1–female6, man1–man3.
man3 and female1 are the most accurate.
How it was made
- Base:
kyutai/pocket-tts,languages/french_24l, its tokenizer kept (a fresh fine-tune, not continued from v1). - Data: 18,970 clips, 40.1 h, all human speech.
- Kreyòl Bible readings, 24.7 h (
jsbeaudry/bible-kreyol-aligned, round-trip ASR CER ≤ 15%, capped so scripture is not most of the audio). - Six studio-recorded Kreyòl sets, 13.9 h (justice, everyday speech, numbers, social media, finance, e-commerce).
- Paid phone readings from Datamio contributors, 1.5 h, kept only if approved, clean (SNR ≥ 45 dB), wide-band (≥ 9 kHz) and transcribed back correctly (Oswald ≥ 0.9). Used for training only, not as voice presets.
- The evaluation sentences were removed from training.
- Kreyòl Bible readings, 24.7 h (
- Text: numbers and symbols are spelled out before training (
17→disèt); do the same, or digits will be read poorly. - Training: lr 1e-4, 1,000 warm-up steps, batch 64, Kyutai's fine-tuning code. Checkpoints every 1,000 steps were scored on 40 dev sentences; step 4,000 had the lowest CER (1.86%) and is the one published.
Use
pip install pocket-tts==3.3.0 soundfile huggingface_hub
import os, tempfile
import numpy as np, soundfile as sf
from huggingface_hub import snapshot_download
from pocket_tts import TTSModel
folder = snapshot_download("jsbeaudry/Fatiman-TTS-v2")
config = os.path.join(tempfile.gettempdir(), "fatiman-v2.yaml")
with open(config, "w") as f: # the config ships with @MODEL_DIR@ to fill in
f.write(open(os.path.join(folder, "config.template.yaml")).read().replace("@MODEL_DIR@", folder))
model = TTSModel.load_model(config=config)
voice = model.get_state_for_audio_prompt(os.path.join(folder, "voices", "man3.safetensors"))
# or your own: model.get_state_for_audio_prompt("my_voice.wav"), ~10 s of clean Kreyòl speech
audio = np.concatenate([c.detach().cpu().numpy().reshape(-1)
for c in model.generate_audio_stream(voice, "Bonjou! Kijan ou ye jodi a?")])
sf.write("bonjou.wav", audio, model.sample_rate)
A new voice comes from a short reference clip: about 10 s of clean speech, starting and ending between words.
Consent. This model can imitate a voice from a short recording. The nine voices above are published with their speakers' signed consent; for anyone else's voice, get their permission first, and never use a voice to deceive (Kyutai's terms for Pocket TTS apply).
License
CC-BY-4.0, as the base model. Based on Pocket TTS by Kyutai.
- Downloads last month
- -