Audiobook chapters with TTS jobs (up to 500k chars) — Audra

An audiobook is the stress test for a TTS pipeline: a single title is 60,000–120,000 characters per chapter-hour and 8–15 hours total, far past what any synchronous API should hold open. This is exactly what POST /v2/speech/jobs exists for — queue the chapter, walk away, come back to a finished MP3.

This post is the chapter-to-audiobook pipeline: job sizing, polling versus webhooks, chapter consistency, and what a full-length title costs on Essential at $25/1M prepaid.

The persona: a 12-chapter nonfiction title

Take a 12-chapter nonfiction book: chapters run 8,000–30,000 characters each, totaling roughly 250,000 characters — about 5.5 hours of finished audio. Every chapter fits the 50k sync limit, but you should still use jobs: a 30k-character sync render can run tens of minutes with the HTTP connection held open, while a queued job is fire-and-forget with a status URL.

Queue a chapter as a job

curl
curl https://audratalks.com/v2/speech/jobs \
  -H "Authorization: Bearer sk-audra-..." \
  -H "Content-Type: application/json" \
  -d '{"model":"audra-essential","voice":"arthur","text":"Chapter One: ...","format":"mp3","webhook_url":"https://yourapp.example/hooks/audiobook"}' 
Python
import requests, time

# enqueue
resp = requests.post(
    "https://audratalks.com/v2/speech/jobs",
    headers={"Authorization": "Bearer sk-audra-..."},
    json={"model": "audra-essential", "voice": "arthur", "text": chapter, "format": "mp3"},
    timeout=60,
)
job = resp.json()

# poll (or use webhook_url instead)
while True:
    time.sleep(30)
    st = requests.get(
        f"https://audratalks.com/v2/speech/jobs/{job['job_id']}",
        headers={"Authorization": "Bearer sk-audra-..."},
        timeout=30,
    ).json()
    if st["status"] in ("completed", "failed"):
        break

if st["status"] == "failed":
    raise RuntimeError(st["error"])
audio = requests.get(st["audio_url"], timeout=600).content
JavaScript
const res = await fetch("https://audratalks.com/v2/speech/jobs", {
  method: "POST",
  headers: { Authorization: "Bearer sk-audra-...", "Content-Type": "application/json" },
  body: JSON.stringify({ model: "audra-essential", voice: "arthur", text: chapter, format: "mp3" }),
});
const { job_id } = await res.json();

let st;
do {
  await new Promise((r) => setTimeout(r, 30000));
  st = await (await fetch(`https://audratalks.com/v2/speech/jobs/${job_id}`, {
    headers: { Authorization: "Bearer sk-audra-..." },
  })).json();
} while (st.status === "queued" || st.status === "processing");

Two ways to learn a job finished: poll GET /v2/speech/jobs/{id} until status is completed, then download audio_url — or pass webhook_url when creating the job and receive a POST with { job_id, status, chars } the moment it completes. Webhooks are the right default for book-length batches: 12 chapters, 12 callbacks, zero polling loops.

Sizing: one job per chapter, not per book

Jobs accept up to 500,000 characters, but do not send the whole book as one job. One job per chapter gives you parallel renders, per-chapter retries, and per-chapter QA signals — and chapter boundaries are where you want file boundaries anyway for retail chaptering.

Economy mode for non-urgent titles

Jobs support mode: "economy" — deferred rendering at 0.75x credits (25% off). If you are converting a back catalog with no deadline, economy mode cuts a 250k-character title from $6.25 to $4.69. Delivery is best-effort on the next scheduled sweep (roughly every 12 hours), which is fine for catalog work and wrong for anything time-sensitive.

Consistency across 12 chapters

One voice slug for every chapter, set once in the batch script. arthur suits long-form nonfiction; there is no cloning, so chapter 12 is rendered by the same deterministic pipeline as chapter 1 — no drift, no 'the narrator changed halfway through' reviews.

Cost of a full title

250,000 characters × $25/1M = $6.25 per title on Essential standard mode. A 10-title back catalog at similar length is ~$63, or ~$47 on economy mode. Premium quality via audra-pro (2.0x) doubles those figures — the Pro post covers when that is worth it. Model your catalog on /calc.

Watch-outs for audiobooks

Full jobs/webhooks API detail: the async jobs post. Pro-engine narration quality: the MOSS post.