SSML breaks on Audra TTS: pauses that survive batch chunking — Audra
Default paragraph handling gives you sentence-level pauses for free, but scripts read better with explicit control: a beat before a key claim, breathing room between list items, a long pause where a section break lands. On Audra, that control is the SSML <break> tag — inline in the text field, no separate markup mode to enable.
This post covers the break syntax that works, the supported SSML subset around it, what maps from ElevenLabs bracket notation, and the one trap that eats pauses when you batch-chunk.
The tag
Insert <break time="500ms"/> anywhere in text to add a pause of that length. Times are milliseconds ('500ms') or seconds ('1.5s'). Breaks stack with the natural pauses the engine already inserts at sentence and paragraph boundaries.
curl
curl https://audratalks.com/v2/speech \
-H "Authorization: Bearer sk-audra-..." \
-H "Content-Type: application/json" \
-d '{"model":"audra-essential","voice":"june","text":"Three things matter. <break time="600ms"/> First: price. <break time="600ms"/> Second: loudness.","format":"mp3"}' \
--output paced.mp3
Python
import requests
text = (
"Three things matter. <break time=\"600ms\"/> First: price. "
"<break time=\"600ms\"/> Second: loudness."
)
resp = requests.post(
"https://audratalks.com/v2/speech",
headers={"Authorization": "Bearer sk-audra-..."},
json={"model": "audra-essential", "voice": "june", "text": text, "format": "mp3"},
timeout=3600,
)
resp.raise_for_status()
open("paced.mp3", "wb").write(resp.content)
JavaScript
const text =
'Three things matter. <break time="600ms"/> First: price. ' +
'<break time="600ms"/> Second: loudness.';
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: "mp3" }),
});
if (!res.ok) throw new Error(await res.text());
await writeFile("paced.mp3", Buffer.from(await res.arrayBuffer()));
The supported subset around breaks
Audra accepts a pragmatic SSML subset inline in text: <break>, <prosody rate> (simulated via speed — no pitch control), <sub alias> for spoken substitutions, <say-as interpret-as="characters">, <audra emotion> (e.g. whisper), Polly's amazon:effect whispered, and ElevenLabs-style bracket tags. No full W3C SSML document mode: you send fragments inside plain text.
Mapping from ElevenLabs
ElevenLabs uses bracket notation rather than XML tags, and Audra accepts the common ones directly: [pause] maps to a short <break>, [whisper] maps to the whispered delivery. Anywhere you wrote <break strength="medium"/> for another engine, convert to an explicit time — Audra takes time values, not strength adjectives.
The batch-chunking trap
If a script exceeds the 50k sync limit and you split it, chunk at paragraph boundaries — never mid-sentence and never directly before or after a <break> tag. A chunk boundary adjacent to a break collapses both pauses into one awkward gap or none at all. Strategy: strip trailing/leading breaks at chunk edges and re-insert them in the audio timeline (or accept one natural paragraph pause there).
Where breaks earn their keep
- List items: 300–500ms between items keeps enumerations followable.
- IVR menus: 400ms+ between options — see the IVR post for the full pattern.
- Punchlines and reveals: 600–900ms before the key phrase.
- Section transitions: prefer paragraph breaks (two newlines) over long break tags; the engine paces them more naturally.
A failure mode worth knowing
Malformed tags — unclosed <break>, missing quotes on time, stray namespace — render as literal spoken text rather than erroring. Listen to the first 10 seconds of any newly tagged script; if you hear 'less than break time equals' being read aloud, fix the markup. QA-gated billing catches silence and truncation, not mispronounced markup.
Prosody and emotion tags: the formats/SSML section of /docs. Pause-driven delivery pacing per medium: the IVR and podcast posts.