Multi-speaker podcast TTS without stitching files — Audra
Two hosts bantering is the hardest thing to fake with single-voice TTS: render each speaker separately and stitch with ffmpeg, and the inter-speaker timing is wrong — pauses too uniform, energy not reacting, joins audible. audra-conversations renders 2–5 speakers in one request at a 3.2x multiplier (~$80/1M prepaid), with turn-taking generated as part of the render, not stitched after.
This post is the Conversations API: how to structure a multi-speaker script, what one request looks like, and the economics versus per-speaker renders.
One request, multiple voices
The script encodes speaker turns inline; each speaker maps to a distinct voice, and the engine handles turn timing, overlap feel, and reaction beats. One POST returns one mastered file — no stitching, no loudness-matching two renders, no crossfade engineering.
curl
curl https://audratalks.com/v2/speech \
-H "Authorization: Bearer sk-audra-..." \
-H "Content-Type: application/json" \
-d '{"model":"audra-conversations","text":"Host: Welcome back... Guest: Thanks for having me...","format":"mp3","delivery_profile":"podcast_v4"}' \
--output episode.mp3
Python
import requests
resp = requests.post(
"https://audratalks.com/v2/speech",
headers={"Authorization": "Bearer sk-audra-..."},
json={
"model": "audra-conversations",
"text": dialogue_script,
"format": "mp3",
"delivery_profile": "podcast_v4",
},
timeout=3600,
)
resp.raise_for_status()
open("episode.mp3", "wb").write(resp.content)
JavaScript
const res = await fetch("https://audratalks.com/v2/speech", {
method: "POST",
headers: { Authorization: "Bearer sk-audra-...", "Content-Type": "application/json" },
body: JSON.stringify({
model: "audra-conversations",
text: dialogueScript,
format: "mp3",
delivery_profile: "podcast_v4",
}),
});
if (!res.ok) throw new Error(await res.text());
await writeFile("episode.mp3", Buffer.from(await res.arrayBuffer()));
When 2-5 speakers in one request is right
- Co-hosted shows where chemistry/interjection is the format.
- Interview-style content generated from structured dialogue.
- Audio drama and character scenes with 2-5 distinct voices.
- Any script where natural turn-taking beats clean isolated lines.
When per-speaker renders are right
If each speaker's lines are fully independent segments — alternating monologues, narrator plus separate interview answers — single-speaker engines (Essential, 1.0x) are 3x cheaper and give you per-segment files for editing. Conversations pays its multiplier when the interaction itself needs to sound live.
Economics
A 15,000-character two-host episode: ~$1.20 on Conversations, versus $0.38 on Essential — you are paying about $0.82 per episode for dialogue that does not sound stitched. A weekly show spends ~$62/year for that. Run your format's numbers on /calc.
Failure mode: the speaker-count assumption
Conversations handles 2-5 speakers; scripts with more voices than that need consolidation or splitting into scenes. Also note that dialogue scripts are character-heavier than monologue per minute of audio (speaker labels, back-channel turns) — budget characters, not minutes, or the 50k sync limit surprises you on what looks like a 25-minute episode. QA-gated billing applies per render as usual.
Single-voice show pipeline and delivery_profile: the podcast post. Engine multiplier reference: /pricing#engines.