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

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.