Loading…
Loading…
ResembleAI/chatterboxResembleAI's Chatterbox Multilingual: expressive speech in 23 languages, with voice cloning.
Two files make one model, as with llama.cpp's multimodal projectors: the model file is the text-to-speech LM backbone, run by llama.cpp; the codec file holds the audio side (decoder / vocoder, speaker encoders and the adaptor between the two), run by codec.cpp. The runtimes below wire the two graphs together, on CPU or GPU (CUDA, Vulkan, Metal), fully offline.
Every run needs one model file + one codec file from this repo.
--backbone |
--model (codec) |
Total | |
|---|---|---|---|
| Recommended | chatterbox-mtl-q8_0.gguf |
codec-q8_0.gguf |
857 MB |
| Smallest | chatterbox-mtl-q4_k_m.gguf |
codec-q4_k_m.gguf |
496 MB |
| Best quality | chatterbox-mtl-f16.gguf |
codec-f16.gguf |
1.6 GB |
The model file carries the T3 text tokenizer as its llama.cpp vocabulary
(tokenizer.ggml.pre = chatterbox): it needs codec.cpp from 2026-10-21 on, or a
llama.cpp with codec.cpp's
chatterbox-tokenizer-llamacpp.patch.
The files of earlier releases (chatterbox-mtl-t3-*.gguf, chatterbox-mtl-codec-*.gguf,
chatterbox-mtl-s3t.gguf) remain at revision
44e18bb.
| File | Size |
|---|---|
chatterbox-mtl-bf16.gguf |
1.0 GB |
chatterbox-mtl-f32.gguf |
2.0 GB |
chatterbox-mtl-q2_k.gguf |
187 MB |
chatterbox-mtl-q3_k_l.gguf |
267 MB |
chatterbox-mtl-q3_k_m.gguf |
244 MB |
chatterbox-mtl-q3_k_s.gguf |
219 MB |
chatterbox-mtl-q4_0.gguf |
285 MB |
chatterbox-mtl-q4_1.gguf |
317 MB |
chatterbox-mtl-q4_k_s.gguf |
288 MB |
chatterbox-mtl-q5_0.gguf |
348 MB |
chatterbox-mtl-q5_1.gguf |
380 MB |
chatterbox-mtl-q5_k_m.gguf |
358 MB |
chatterbox-mtl-q5_k_s.gguf |
348 MB |
chatterbox-mtl-q6_k.gguf |
415 MB |
codec-f32.gguf |
1.2 GB |
codec-q5_k_m.gguf |
224 MB |
With codec.cpp's tts-cli (build it; it bundles llama.cpp), then:
hf download BricksDisplay/Chatterbox-Multilingual-TTS-GGUF chatterbox-mtl-q8_0.gguf codec-q8_0.gguf --local-dir Chatterbox-Multilingual-TTS
./build/tts-cli synthesize --backbone Chatterbox-Multilingual-TTS/chatterbox-mtl-q8_0.gguf --model Chatterbox-Multilingual-TTS/codec-q8_0.gguf \
--text "[en]hello, this is chatterbox speaking." --output out.wav
Clone a voice from a few seconds of clean speech (it works across languages):
./build/tts-cli synthesize ... --ref-audio my_voice.wav --text "[en]hello there." --output out.wav
All tts-cli options (voices, voice cloning, sampling, GPU) are described in the codec.cpp README.
The codec_cpp package runs the same pipeline (it builds codec.cpp with its
bundled llama.cpp, so it needs CMake and a C++ compiler):
pip install "codec-cpp @ git+https://github.com/mybigday/codec.cpp" huggingface_hub soundfile
import codec_cpp, soundfile
from huggingface_hub import hf_hub_download
tts = codec_cpp.TTS(hf_hub_download("BricksDisplay/Chatterbox-Multilingual-TTS-GGUF", "chatterbox-mtl-q8_0.gguf"),
hf_hub_download("BricksDisplay/Chatterbox-Multilingual-TTS-GGUF", "codec-q8_0.gguf"))
audio, sr = tts.synthesize("[en]hello, this is chatterbox speaking.")
soundfile.write("out.wav", audio, sr)
tts.voices() lists the builtin voices; ref_audio= clones a voice where the
model supports it; tts.stream(text) yields audio as it is generated. More in
the Python docs.
llama.rn loads the same two files on iOS and Android:
const ctx = await initLlama({ model: 'chatterbox-mtl-q8_0.gguf', embedding: true })
await ctx.initVocoder({ path: 'codec-q8_0.gguf' })
const { prompt, grammar, embedding, flow } = await ctx.getFormattedAudioCompletion({
prompt: 'Hello world',
})
const result = await ctx.completion({ prompt, grammar, embedding })
const pcm = flow === 'continuous_embd'
? await ctx.decodeAudioEmbeddings(result.embeddings, result.embedding_dim)
: await ctx.decodeAudioTokens(result.audio_tokens)
Voice cloning, saved voices and per-model notes: llama.rn TTS docs.
Prepare the text as upstream MTLTokenizer does:
[en], [fr], [de], [es], [ja], [zh], …import unicodedata
text = "[es]" + unicodedata.normalize("NFKD", "Hola, ¿cómo estás hoy?".lower())
Skipping NFKD makes accented letters (é, ó, ü, …) come out wrong.
The model files carry the recommended sampling as llama.cpp's
general.sampling.* metadata, the settings of the original ChatterboxTTS.generate();
tts-cli, tts-server, llama.rn and any llama.cpp host apply them unless
you set your own.
| Setting | Value | tts-cli flag |
|---|---|---|
| temperature | 0.8 | --temp 0.8 |
| top-k | 0 (off) | --top-k 0 |
| top-p | 1.0 (off) | --top-p 1.0 |
| min-p | 0.05 | --min-p 0.05 |
| repetition penalty | 1.2 | --repeat-penalty 1.2 |
| repetition window | 1024 (every generated token) | --repeat-last-n 1024 |
| sampler order | penalties → temperature → min-p → top-p | --samplers "penalties;temperature;min_p;top_p" |
The speech head's penalty history starts with the start-of-speech token, as
in the original. The original multilingual generate() uses a repetition
penalty of 2.0, but only together with its attention-driven end forcing,
which codec.cpp does not have; without it 2.0 often runs to the length limit,
so 1.2 is recommended.
default.--ref-audio with any short, clean clip. Save it with
--save-speaker to reuse it without the clip.mit, the same as the original model.