Chatterbox TTS Guide: How to Control Emotion and 22 Languages with Text Alone
Most TTS models give you SSML tags and emotion sliders. Chatterbox ships with a text box and nothing else.
Built by Resemble AI on a ~0.5B parameter LLM backbone, Chatterbox learned prosody from massive amounts of natural speech. Punctuation and capitalization drive emotion directly – no markup language in between. In blind evaluations by Podonos, 63.75% of listeners preferred Chatterbox over ElevenLabs. It ships under MIT license with 22 languages and one default voice per language.
On deAPI, Chatterbox runs as a single API call. You pick a language, write your text, and get back an mp3 at 24 kHz.
When to Use Chatterbox (and When Not To)
deAPI offers three TTS models. Each fills a different role:
| Need | Model | Why |
|---|---|---|
| Polished preset voices, zero config | Kokoro | 41 voices across 7 languages |
| Voice cloning or custom voice design | Qwen3 TTS | Clone from audio sample or design via text description |
| Multilingual + emotion from text | Chatterbox | 22 languages, CAPS as emphasis, one voice per language |
Kokoro ignores CAPS entirely. Chatterbox treats them as emphasis. That single difference changes how you write for each model.
How Chatterbox Reads Your Text
Chatterbox is autoregressive – it generates audio tokens sequentially, like an LLM generating words. Its prosody comes from the text itself. Here’s what each punctuation mark does:
| Mark | Effect |
|---|---|
. | Long pause, falling intonation. Resets the sentence. |
, | Short breath pause. Keeps flow going. |
... | Suspended tone – uncertainty, drama, hesitation. |
— or -- | Strong parenthetical pause. Chatterbox reacts to em-dashes more visibly than most TTS models. |
; : | Intermediate pauses, between a comma and a period. |
? | Rising intonation on yes/no questions. Wh-questions (what, how, why) get a natural falling contour. |
! | Clear emphasis. Stack !! for extra intensity – the LLM backbone picks that up. |
?! | Surprise and disbelief – one of Chatterbox’s strongest inflections. |
ALL CAPS = Emphasis
This is the big difference from Kokoro. Write I told you NOT to touch it! and Chatterbox will stress NOT with more volume and slower delivery. The LLM heritage means the model has seen enough text where CAPS imply shouting.
The rule: limit CAPS to 1-3 key words per sentence. A full-CAPS sentence fatigues prosody and distorts the output.
What Doesn’t Work
Emoji. Chatterbox reads :) as “colon paren” or drops it entirely. Strip all emoji before sending.
Emotion markers. [happy], [whisper], [sad] – not supported as commands. The model has no inline tag parser.
SSML. <break time="500ms"/> is read as literal text.
Writing for Emotion
Chatterbox has no emotion sliders or style tags. You control delivery through the text itself – word choice, punctuation, and capitalization. Compare these two versions of the same message:
That sounds limiting until you see how well it works. Compare these two versions of the same message:
Calm:
The results are in. We exceeded the target by twelve percent.
Excited:
The results are IN. We didn't just hit the target — we CRUSHED it by twelve percent!
Same information. CAPS on key words, an em-dash for dramatic pause, and a closing ! give Chatterbox enough signal to shift delivery.
Three techniques that consistently land:
Hesitation. Use ... to create pauses that sound like thinking mid-sentence. I thought it was... no, never mind. produces a genuine stall before the redirect.
Disbelief. ?! is Chatterbox’s sweet spot. You did WHAT?! sounds authentically shocked – the combination of CAPS and ?! stacks two emphasis signals at once.
Build-up. Em-dash before a reveal: The winner is — Sarah Chen. The marked pause before the name lands harder than writing it flat.
Numbers, Abbreviations, and Formatting
Chatterbox handles most common formats cleanly, but a few patterns need attention.
Numbers up to 4 digits read correctly. Years like 2024 and 1999 work as expected.
Large numbers (1,234,567) are safer spelled out. Write “one point two million” instead of hoping the model picks the right grouping.
Codes and PINs work better broken into individual digits: 5 5 5, 1 2 3 4 instead of 555-1234.
Common abbreviations (Mr., Dr., USA, NASA) expand correctly. Domain-specific abbreviations (MRR, ARR) – expand them yourself or expect letter-by-letter spelling.
Mixed languages in a single generation don’t work. Hello, nazywam się Piotr forces the model to pick one phoneme set and mangle the other. Run separate generations per language and stitch the audio in post-production.
Language Selection
Chatterbox supports 22 languages, each with a single default voice:
| Language | Code | Language | Code |
|---|---|---|---|
| Arabic | ar | Korean | ko |
| Chinese (Mandarin) | zh | Malay | ms |
| Danish | da | Dutch | nl |
| English | en | Norwegian | no |
| Finnish | fi | Polish | pl |
| French | fr | Portuguese | pt |
| German | de | Russian | ru |
| Hebrew | he | Spanish | es |
| Hindi | hi | Swahili | sw |
| Italian | it | Swedish | sv |
| Japanese | ja | Turkish | tr |
Greek (el) is listed in the model card but has no voice in the current deployment – generation will fail for that language code.
Polish is worth noting specifically. Chatterbox is one of the few open-source TTS models with native Polish training data, making it a practical option if ElevenLabs pricing doesn’t fit your project.
API Call
Chatterbox runs on deAPI’s v2 audio endpoint. Here’s a complete request-and-poll flow:
Python:
import requests
import time
API_KEY = "your-api-key"
BASE = "<https://api.deapi.ai>"
# 1. Submit generation request
response = requests.post(
f"{BASE}/api/v2/audio/speech",
headers={
"Authorization": f"Bearer {API_KEY}",
"Accept": "application/json"
},
data={
"text": "The results are IN. We didn't just hit the target — we CRUSHED it!",
"model": "Chatterbox",
"mode": "custom_voice",
"voice": "default",
"lang": "en",
"speed": 1,
"format": "mp3",
"sample_rate": 24000
}
)
request_id = response.json()["data"]["request_id"]
# 2. Poll for result
while True:
poll = requests.get(
f"{BASE}/api/v1/client/request-status/{request_id}",
headers={"Authorization": f"Bearer {API_KEY}"}
).json()
status = poll["data"]["status"]
if status == "done":
audio_url = poll["data"]["result_url"]
break
elif status == "error":
raise Exception("Generation failed")
time.sleep(2)
# 3. Download audio
audio = requests.get(audio_url)
with open("output.mp3", "wb") as f:
f.write(audio.content)
curl:
curl -X POST <https://api.deapi.ai/api/v2/audio/speech> \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json" \
-F "text=The results are IN. We didn't just hit the target — we CRUSHED it!" \
-F "model=Chatterbox" \
-F "mode=custom_voice" \
-F "voice=default" \
-F "lang=en" \
-F "speed=1" \
-F "format=mp3" \
-F "sample_rate=24000"
A few things to note about the parameters:
modemust becustom_voice. Voice clone and voice design are not supported on Chatterbox.voiceis alwaysdefault– one preset per language, no alternatives.speedis fixed at1. Changing it has no effect. For playback speed adjustments, post-process with ffmpeg’satempofilter (preserves pitch).
Three Example Prompts
1. Commercial Voiceover – CAPS Emphasis
Lang: en | Voice: default
This Friday, everything changes. The new NovaPhone 12 — faster, lighter,
BRIGHTER than anything you've seen. Pre-order now and save 200 dollars.
This is NOT a drill.
Why it works: BRIGHTER and NOT get extra stress from the model. The em-dash introduces the feature reveal with a marked pause. Short sentences after a longer one break the pattern before the ear gets comfortable.
2. Character Dialogue – Emotion Through Punctuation
Two separate generations to simulate a conversation:
Character A (shocked):
You... you did WHAT?! Tell me you're joking. Please, tell me this is a joke.
Character B (calm reply):
I'm not joking. I signed the papers this morning. It's done.
Why it works: ... adds hesitation before the outburst. WHAT?! combines CAPS with question-exclamation for maximum disbelief. Character B contrasts with flat, period-terminated statements – same default voice, completely different energy. Since Chatterbox has one voice per language, you create character contrast through phrasing, not voice selection.
3. Podcast Intro – High Energy
Lang: en | Voice: default
Hey, hey, hey — welcome back to Deep End, the podcast where we ask the
questions nobody else dares to. I'm your host, and today? Today we go DEEP.
Strap in.
Why it works: Repeating “hey, hey, hey” builds rhythmic momentum. The ? after “today” followed by the emphatic Today we go DEEP. creates call-and-response energy. Strap in. closes with a two-word punch that works better than a full sentence would.
Common Mistakes
Text over ~1,500 characters. Chatterbox is autoregressive and can hallucinate or repeat words past that length. Break long content into 200-500 character chunks and generate each one separately.
No punctuation. hello how are you today my name is peter produces flat, robotic output. Chatterbox needs periods and commas to know where to breathe.
Mixing languages in one call. The model picks one phoneme set per generation. Anything in the other language gets mangled.
Emoji in text. Strip them before sending. The model tries to spell them out or drops them unpredictably.
Full-CAPS sentences. I CAN'T BELIEVE THIS IS HAPPENING RIGHT NOW fatigues prosody across the whole sentence. Use CAPS on 1-3 words that actually carry the emphasis.
Watermarking
Every Chatterbox generation includes Resemble AI’s PerTh watermark – an inaudible neural watermark embedded at inference time. It survives common audio processing (compression, format conversion) and doesn’t affect perceived quality. The watermark enables AI audio detection and provenance tracking.
Generate your first clip in 22 languages. $5 free credits, no card required.