| Different voice | voice_id (batch) / voice (streaming). Built-ins from GET /v1/tts/voices: eve (default), ara, rex, leo, luna, atlas, aurora, orion, … 28 total, all multilingual, case-insensitive. Custom voice: 8-char id from the console or GET /v1/custom-voices |
| Non-English or mixed | language: en, ar-EG, ar-SA, ar-AE, bn, zh, fr, de, hi, id, it, ja, ko, pt-BR, pt-PT, ru, es-MX, es-ES, tr, vi, or auto |
| Faster or slower | speed 0.7–1.5 |
| “$5”, “Dr.”, “3/4” spoken as words | text_normalization: true |
| Brand names, acronyms, jargon | replace: { "Acme Mobile": "Acme Mobull", "nginx": "/ˈɛndʒɪn ˈɛks/" }; ≤200 entries, keys ≤100 chars (letters, digits, apostrophes, spaces), values ≤128; whole-word, case-insensitive, longest match wins. Streaming: session.update { replace } before the first text.delta |
| Expressive delivery | Inline [pause], [long-pause], [laugh], [chuckle], [giggle], [cry], [sigh], [breath], [inhale], [exhale], [tsk], [tongue-click], [lip-smack], [hum-tune]. Wrapping <whisper>, <soft>, <loud>, <emphasis>, <build-intensity>, <decrease-intensity>, <slow>, <fast>, <higher-pitch>, <lower-pitch>, <singing>, <sing-song> around whole phrases |
| Captions, karaoke, lip-sync | with_timestamps: true → JSON { audio (base64), content_type, duration, audio_timestamps: { graph_chars[], graph_times[][start,end] } }; step through graph_chars in order, never slice input by index |
| First audio sooner (streaming) | optimize_streaming_latency=1 (docs also list 2; API reference lists 0/1) |
| Telephony / IVR | output_format: { codec: "mulaw" | "alaw", sample_rate: 8000 }; not playable in browsers |
| Editing, post-production | codec: "wav", sample_rate: 44100 or 48000 |
| Smaller files | codec: "mp3", bit_rate: 64000 |