Voice consistency across episodes: picking one Audra slug — Audra
A show sounds like itself when every episode is rendered the same way: same voice slug, same model, same delivery settings, episode after episode. None of that is a cloning feature — it is discipline in how you store and reuse render parameters. This post is the parameter checklist that keeps episode 40 sounding like episode 4.
Pin the whole render signature, not just the voice
- model: one value forever — audra-essential, stored next to the script, never defaulted. Audra upgrades the engine underneath a model name over time, but switching models mid-show is the one change guaranteed to shift timbre.
- voice: a fixed slug with a fixed blend. june is a voice; june(2)+wren(1) is a blend, and the blend weights are part of your show's identity. Store the exact string — not 'june-ish'.
- format: mp3 at 128 kbps, mastered to −16 LUFS at the API. Because every render gets the same loudness target, your podcast feed never needs a re-master pass between episodes — the consistency comes from the pipeline, not post-editing.
- language: if you set a BCP-47 hint on episode 1, set it on every episode. An unset hint lets the engine infer locale from the slug, and inference can drift with script content.
Version the signature like code
Check the render signature into the repo next to the show's scripts — voice.txt or a JSON block in the pipeline config. When you do decide to re-voice, you change one line, re-render the catalog with the same chunking boundaries, and the whole back-catalog moves together. The failure mode to avoid is five episodes rendered from a teammate's local config: same voice slug, different language hint, and a drift listeners notice before your analytics do. For long back-catalog re-renders, the jobs API (POST /v2/speech/jobs, 500k chars, webhook_url) is the only sane way — batch the catalog, not one curl per episode.
A pinned signature in practice
{
"model": "audra-essential",
"voice": "june(2)+wren(1)",
"format": "mp3",
"language": "en-US",
"chunking": "split on blank lines, max 4000 chars per request",
"idempotency": "sha256 of script + episode number"
}
Voice previews and the full slug list live at /voices. For the batch mechanics around consistent voice — chunking, jobs, webhooks — see /blog/podcast-tts-api-batch-narration.