Most “new TTS” drops still mean prettier presets. Gemini 3.8 text-to-speech isn’t that. It treats your script as a stage, not a paragraph, and the people still stuffing “say this cheerfully:” into the text field are getting those words read aloud on day one.
gemini-3.8-flash-tts and gemini-3.8-flash-lite-tts landed around 23 September 2026. Voice design from a sentence, ~30s replication with consent, two-speaker scenes – the threads covered all of it. Skip that reel. What follows is the transcript/style contract, a non-demo walkthrough, the breaks that wreck old pipelines, and Flash vs Lite costs without the fine-print surprise.
The core idea: transcript vs direction
Per the official speech-generation docs, Gemini 3.8 TTS splits three jobs cleanly:
- Voice – who speaks (prebuilt name, library ID, designed
voice_..., or replicated ID) - Style – how the whole turn lands (
speech_metadata.style: “whispered urgently”, “warm and dry”) - Text – the exact words, plus point events in angle brackets (
<laugh>,<sigh>,<short pause>)
Sustained emotion belongs in metadata. Momentary sounds go inline. The transcript stays clean. That’s the contract.
Think of it like a table read: the actor gets lines, the director gets notes on a separate sheet. Hand the director’s notes to the actor as dialogue and the scene dies – same failure mode here when style leaks into text.
Pro tip: Design the persona once with Voice design, save the ID, then keep per-turn
styleshort or empty. Long “audio profile” blocks on every call invite drift – the docs warn against them for a reason.
Flash: studio work, dialects, heavy acting, multi-minute narration that has to hold. Lite: volume, agents, everyday single-speaker jobs. Same request shape. Swap the model string.
Step-by-step: your first Gemini 3.8 text-to-speech clip
API key plus current google-genai client. Or poke around with zero code risk in Google AI Studio first – useful when you only want to hear whether a style lands.
- Install/upgrade the SDK and set
GEMINI_API_KEY. - Call Interactions (or generateContent) with model
gemini-3.8-flash-tts(or lite),response_formataudio, and a voice inspeech_config. - Spoken line only in
text. Style in annotations/metadata. - Decode base64 and write bytes straight to a
.wavfile – unary already includes the RIFF header.
import base64
from google import genai
client = genai.Client()
interaction = client.interactions.create(
model="gemini-3.8-flash-tts",
input=[{
"type": "user_input",
"content": [{
"type": "text",
"text": "Day forty-one. <sigh> The storm broke at four. <short pause> There's a bottle on the rocks.",
"annotations": [{
"type": "speech_metadata",
"style": "tired, quiet, slightly amused",
}],
}],
}],
response_format={"type": "audio"},
generation_config={
"speech_config": [{"voice": "Charon"}],
},
)
with open("island.wav", "wb") as f:
f.write(base64.b64decode(interaction.output_audio.data))
Not the official demo line on purpose. Sigh, pause, style outside the words. If you hear the style phrase spoken, the field mapping is wrong – fix that before you touch production config.
Two speakers: mode: "conversational", both on prebuilt voices, each turn tagged with speaker and optional style. Three custom characters? Synthesize turn-by-turn, request audio/l16 (or strip the RIFF header), concat 24 kHz mono frames.
Common pitfalls that waste a whole afternoon
These show up the moment you leave the playground.
- Stage directions in text get spoken. “Say cheerfully: Hello” becomes dialogue. Move cheer to
style. Official docs treattextas a verbatim transcript – no director channel there. - WAV header surprise. Turns out unary 3.8 defaults to ready WAV (AUDIO_WAV, 24 kHz mono 16-bit PCM with RIFF). Streaming stays headerless AUDIO_L16. Old 3.1 pipelines that wrapped raw PCM now double-header or fail with “file does not start with RIFF id.” Match the path you’re on.
- Custom multi-speaker in one shot fails. Single-request multi-speaker: 2 speakers, prebuilt only. Designed or replicated IDs need per-turn synthesis, then header-safe concat.
- Voice storage limits. Stateful prompted/replicated voices: 200 per project, 1-year TTL. Stateless
voicekey_: 7 days. Plan cleanup. - Replication regions. AI Studio voice replication isn’t available in Illinois, Texas, EEA, UK, Switzerland, and India (Google launch note). Consent audio must match an allowed phrase exactly. Output carries a SynthID watermark.
Billing math is easy to misread. Official rate: 25 audio tokens per second of output. Some forum runs land higher on messy jobs – meter your own traffic before you freeze a unit-economics slide.
Flash vs Lite (and everything else)
Does cheaper always mean “good enough” for a course narrator who has to stay in character for forty minutes? Not always – and that’s the fork this table is for.
Same API. Different jobs and price curves. Standard paid tier from the Gemini API pricing page, as of late September 2026:
| Model | Best for | Langs (approx.) | Text in / audio out (to 31 Dec 2026) | From 1 Jan 2027 |
|---|---|---|---|---|
| gemini-3.8-flash-tts | Audiobooks, dialects, heavy acting, long-form | 130 | $0.50 / $9.00 per 1M | $1.00 / $18.00 |
| gemini-3.8-flash-lite-tts | Agents, dubbing volume, read-aloud | 101 | $0.50 / $6.00 per 1M | $1.00 / $12.00 |
| gemini-3.1-flash-tts-preview | Legacy only | – | Higher legacy rates | Check current pricing page |
At 25 tokens/sec, Flash launch pricing sits near $0.00225 per 10 seconds of audio; Lite near $0.0015. Batch, Flex, and Priority shift those numbers – confirm on the pricing page when you budget. Free tier exists for tests. Google’s launch post leads with Hume Voice Design Benchmark (#1 overall 71.4) and product hooks; the January 2027 double is easy to miss if you only read the blog. Budget both rate cards now.
Need real-time back-and-forth? Live API. Need exact words plus line-level direction for podcasts, courses, dubbing? This TTS path.
FAQ
Do I need paid API access to try Gemini 3.8 TTS?
No. Free tier covers testing in AI Studio and the API. Paid rates start after the free allowance.
Why does my old 3.1 prompt sound wrong or get spoken as dialogue?
3.8 stopped treating the prompt as a director’s note bag. Old pattern: “Audio profile: tired lighthouse keeper… Say softly: Day forty-one…”. New split: persona → one-time Voice design (voice_... ID); soft delivery → speech_metadata.style; only “Day forty-one…” in text; <sigh> inline at the breath. One wrong field and the profile gets narrated.
Is voice cloning unlimited and global?
No. Short reference clip plus matching consent recording; SynthID on the output. Stateful storage: 200 voices/project, one-year TTL (stateless voicekey_ is a 7-day window). AI Studio replication is blocked in several regions – same list as above. Rights and consent stay on you; the API does not invent legal cover.
Open AI Studio, design one weird narrator voice, generate a 20-second scene with two inline tags, and save the WAV. When that path feels boring, wire the same call into your pipeline – Flash-Lite for volume, Flash when the performance has to hold.