MP3 vs WAV on a TTS API: when to request each format — Audra

The format parameter on POST /v2/speech takes exactly two values — mp3 (default, 128 kbps) and wav (lossless) — and picking wrong either bloats storage or compounds artifacts. The right choice follows one rule: pick the container for what happens to the file after the API returns it.

This post is the format decision: what each format actually is on Audra, the byte math at real script sizes, and the pipeline patterns that demand each one.

What you get in each

MP3 output is 128 kbps CBR at −16 LUFS — broadcast-ready for podcasts, YouTube, course players, and anything humans stream. WAV output is lossless PCM, typically 44.1 kHz 16-bit stereo: the editing master. Same text, same voice, same $25/1M billing either way — format does not change cost.

The byte math

At real script sizes the difference is roughly 10x. A 7,500-character narration (about 10 minutes of audio) is ~9.6 MB as MP3 and ~100 MB as WAV. A 250k-character audiobook title is ~320 MB as MP3 versus 3+ GB as WAV — per title. The size you choose multiplies across storage, egress, and backup.

curl
curl https://audratalks.com/v2/speech \
  -H "Authorization: Bearer sk-audra-..." \
  -H "Content-Type: application/json" \
  -d '{"model":"audra-essential","voice":"june","text":"Chapter one...","format":"wav"}' \
  --output chapter-01.wav
Python
import requests

resp = requests.post(
    "https://audratalks.com/v2/speech",
    headers={"Authorization": "Bearer sk-audra-..."},
    json={"model": "audra-essential", "voice": "june", "text": text, "format": "wav"},
    timeout=3600,
)
resp.raise_for_status()
open("chapter-01.wav", "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", text, format: "wav" }),
});
if (!res.ok) throw new Error(await res.text());
await writeFile("chapter-01.wav", Buffer.from(await res.arrayBuffer()));

Choose MP3 when the file ships as-is

Choose WAV when the file gets processed again

Failure mode: the double-encode

The classic mistake is requesting MP3, importing into a DAW, editing, and exporting MP3 again — two lossy generations on one voice track. The fix is structural: your pipeline stores either the shipped artifact (MP3, never touched again) or the master (WAV, re-encoded once on each publish). Never both roles in one file. One legacy note: the v1 API used response_format for this field; v2 is format — the migration guide at /migrate covers the rename.

Format defaults and SSML interaction: /docs#formats-ssml. The loudness story for show pipelines: the podcast post.