Direct answer first: you keep AI character voices consistent the same way you keep faces consistent - by casting once and locking the configuration, not by re-describing the voice each time. Concretely: assign each character one TTS preset (or cloned voice) plus a fixed random seed, store that pair in a casting table, and generate every line of that character from the same pair. Style and emotion go into a per-line instruction; identity stays in the locked voice-plus-seed. Described-from-scratch voices drift between sessions exactly like described-from-scratch faces.
The voice-casting workflow
- Audition before casting. Generate the same two test lines (one calm, one emotional) across every candidate preset. Pick per character, considering contrast between characters who share scenes - two similar male voices in one dialogue reads as one person arguing with himself.
- Lock voice + seed in a casting table. Ours is literally a JSON map: character, preset, seed, default style note. Every dubbing run reads it; nothing about identity is decided at generation time.
- Direct with instructions, not with new voices. Per-line acting ("whispered, out of breath", "cold, threatening") goes into the instruction field. The voice stays put; the performance changes. This split is what makes 10 episodes sound like one cast.
- Batch with a resumable manifest. Dubbing a series is hundreds of lines; engines fail on a few. Generate against a manifest that records completed lines so retries do not regenerate - and re-audit any engine after an update, because presets can shift.
Placement and the mix
Dubbing quality dies at the mix more often than at the TTS:
- Place dialogue on cut boundaries. We align each line to its cut's start plus a small offset, nudging collisions apart - dialogue that straddles a cut reads as bad ADR.
- Sidechain-duck the ambience. Route dialogue as the sidechain key against the ambient/music bed. Our working values: threshold low, ratio around 8:1 - measured effect is dialogue sitting 7-23 dB above the bed only while someone speaks.
- Keep subtitles as overlays, not burn-ins. The dub and the subtitle system should be independent layers, so adding a language later never re-renders video.
Traps we hit so you do not
- Some engines read malformed emotion parameters out loud - a formatting bug becomes a character saying "excited tone" on screen. Validate instruction strings.
- Short commands hallucinate extra words on some engines; pad very short lines with punctuation or regenerate with a longer instruction.
- License-check the engine for commercial dubbing before you commit a series to it. We auditioned several engines and retired one mid-production over exactly this - swapping voices mid-season is the audio equivalent of recasting a lead.
All 40+ dubbed episodes on our catalog run this exact chain, and the same casting-table idea drives our character-image consistency - one doctrine, two media.
What we could not verify
We have not run listener studies on voice-identity perception (whether audiences notice seed-level drift the way they notice face drift) - our bar is that we, editing daily, stopped being able to tell takes apart. Formal ABX testing is on the list.