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

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.