Newsletter to podcast: TTS pipeline for weekly editions — Audra
Your newsletter already ships every Tuesday at 6am. The podcast feed is the same content on a different channel, yet most operators never ship it because re-recording an episode every week is a human bottleneck. Batch TTS removes the human from the loop entirely: the edition is the script.
This post is the edition-to-episode pipeline for newsletter operators: converting an email edition to speakable audio, sizing a typical edition, and the per-edition cost on Essential at $25/1M prepaid.
The persona: a weekly written newsletter going audio
A typical weekly edition is 1,200–1,800 words — say 8,000 characters — becoming a 10–12 minute episode. That fits one sync POST. The work is in the conversion, not the render: strip tracking pixels and footers, expand shortlinks to descriptive text, rewrite subject lines that only make sense in an inbox, and pull the header/call-to-action blocks your listeners cannot click.
Edition to episode in one request
Build the audio script from the edition body, then POST to /v2/speech with delivery_profile podcast_v4 — podcast-oriented pacing and paragraph pauses suited to episodic listening. Output is MP3 at 128 kbps and −16 LUFS, meeting Apple Podcasts and Spotify loudness targets without a mastering pass.
curl
curl https://audratalks.com/v2/speech \
-H "Authorization: Bearer sk-audra-..." \
-H "Content-Type: application/json" \
-d '{"model":"audra-essential","voice":"june","delivery_profile":"podcast_v4","text":"Issue 142: ...","format":"mp3"}' \
--output issue-142.mp3
Python
import requests
resp = requests.post(
"https://audratalks.com/v2/speech",
headers={"Authorization": "Bearer sk-audra-..."},
json={
"model": "audra-essential",
"voice": "june",
"delivery_profile": "podcast_v4",
"text": edition_script,
"format": "mp3",
},
timeout=3600,
)
resp.raise_for_status()
open("issue-142.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-essential",
voice: "june",
delivery_profile: "podcast_v4",
text: editionScript,
format: "mp3",
}),
});
if (!res.ok) throw new Error(await res.text());
await writeFile("issue-142.mp3", Buffer.from(await res.arrayBuffer()));
Trigger the render from your publishing webhook: edition sends → script builder runs → render → MP3 lands in the episode folder with publish-date metadata. Your feed updates before the inbox send finishes its first open.
What must be rewritten for the ear
- Link calls-to-action ('click here') become spoken ones ('link in the show notes').
- normalize (default true) speaks URLs and email addresses as words — check how it reads your domain before the first episode ships.
- Tables and charts cannot be narrated; replace with a sentence summarizing the takeaway, or drop the section with a note.
- Sponsor blocks belong at a consistent timestamp; render them as a separate request if you swap sponsors independently of content.
Voice: the host who never misses a week
Pick one Essential slug and keep it forever — the voice becomes the show's identity as much as the logo. june is a common pick for warm editorial reads; cole suits news-style roundups. Because the catalog is fixed, next year's 52 episodes sound like this year's.
Cost at edition scale
An 8,000-character edition at $25/1M is $0.20 per episode on Essential. A full year of weekly editions is about $10.40 — less than one month of most podcast hosting plans. A daily edition at the same length runs ~$73/year. Model your cadence on /calc.
Co-hosted or interview formats: the multi-speaker Conversations post. Loudness and delivery_profile details: the podcast post.