Translating a whole show in one call
A walkthrough of the translation pipeline we ship on every Podviva publish — and why we chose transcripts over dubbed audio for v1.
When an episode publishes on Podviva, three things happen in parallel: the audio lands on R2, the RSS feed updates, and a fan-out of translation jobs spins up. The latter is what this post is about.
Transcript first, dubbed audio later
We made a deliberate choice with v1: transcripts and subtitles per language, not dubbed audio. Dubbing is seductive — there's a demo moment where the host sounds like they speak five languages — but the craft gap between 'good transcript' and 'convincing dubbed voice' is two orders of magnitude. Until the agent can reliably preserve humour, rhythm, and intentional pauses, we'd rather ship text that respects the audience than audio that lies to them.
The actual call
Under the hood it's a Trigger.dev job graph: one task per language, fanning out from the source transcript. The translator is a Claude call prompted with the episode's topic cluster — not a bare translation — which keeps domain jargon consistent. Output lands in R2 as VTT + TXT, and the RSS feed advertises each language.