Text to Speech

SSML Text to Speech vs Expressive Tags: What Changed

SSML text to speech gave exact control with XML. Newer AI voices take plain-language direction and tags instead. See what each does and where support differs.

8 min read
By OndaLabs Team

SSML (Speech Synthesis Markup Language) is an XML-based W3C standard for controlling pronunciation, pauses, pitch and speaking rate in synthetic speech. Newer AI voices increasingly accept plain-language direction and bracketed or angle-bracket tags instead. SSML is still documented by Microsoft, Google and Amazon in 2026, but support is partial and differs by vendor and by voice.

What is SSML in text to speech?

SSML is a Recommendation of the W3C, the web standards body. Version 1.1 was published on 7 September 2010 by the Voice Browser Working Group, with editors Daniel C. Burnett of Voxeo and Zhi Wei Shuang of IBM. The W3C specification describes SSML as "a rich, XML-based markup language for assisting the generation of synthetic speech," covering aspects such as pronunciation, volume, pitch and rate.

SSML 1.1 defines elements including speak, break, prosody, say-as, phoneme, emphasis, voice and audio. Microsoft's implementation is based on SSML 1.0, and it notes that the elements supported by its service can differ from the W3C standard.

A quick SSML example

The markup below wraps a short line in a speak element, adds a half-second pause and slows part of the sentence. Each vendor supports a different subset of these tags, so check the docs before you rely on one.

<speak>
  Your order shipped <break time="500ms"/> today.
  <prosody rate="slow">Please keep your receipt.</prosody>
</speak>

Reserved characters must be escaped. Azure requires &amp;, &lt; and &gt; for the ampersand and angle brackets, and attribute values must be quoted.

SSML support is partial and differs by vendor

Support depends on the vendor and often on the voice class. The table summarizes the official documentation checked for this article.

| Vendor and voice | SSML support | |---|---| | Amazon Polly | A subset of SSML 1.1. Unsupported tags return an error. On neural voices, break is fully supported, prosody partly, say-as partly and phoneme fully. emphasis is not available on neural, long-form or generative voices. | | Azure DragonHD | Supports voice, lang, phoneme, lexicon (alias only), say-as, sub, break, p and s. Does not support prosody or emphasis. | | Azure Dragon HD Omni | Supports voice, express-as, lang, lexicon (alias only), say-as, sub, p and s. Does not support prosody, emphasis, break or phoneme. | | Google Cloud TTS | Many W3C elements are supported, including break, prosody, emphasis and phoneme. Not all elements are supported. | | ElevenLabs | break works on SSML-capable models only, and Eleven v4 and v3 do not support break tags. Phoneme tags work only on eleven_flash_v2. | | OpenAI gpt-4o-mini-tts | Takes free-text instructions instead. The TTS guide does not describe SSML. |

Google's documentation is also inconsistent for Chirp 3: HD. Its Chirp 3: HD page lists a supported SSML subset for synchronous requests only, marked as Preview, while its voice-types page says Chirp 3: HD does not support SSML. Check the current docs before you build on it.

What changed: expressive tags and plain-language direction

Several vendors moved toward direction that reads more like a stage note than markup:

  • Azure HD voices accept bracketed tags such as [excited] Great news - your order shipped today!, with more than 50 named styles and paralinguistic tags such as laughter and sighing. The HD voices also detect emotion from the input text.
  • ElevenLabs uses audio tags such as [whispers], [laughs] and [sighs]. Its guidance says tag-style direction can be read aloud or heard as a sound effect.
  • Gemini uses a style field for sustained delivery and angle-bracket tags such as <laugh>, <sigh> and <cough> for momentary events.
  • OpenAI takes free-text instructions that control accent, emotion, intonation, speed, tone and whispering.

These approaches do not share a standard. Square brackets, angle brackets and plain-text instructions are all vendor-specific, so none of them is portable.

SSML vs expressive tags side by side

| Dimension | SSML | Expressive tags and plain-language direction | |---|---|---| | Standard | W3C Recommendation, SSML 1.1 published 2010 | Vendor-specific, with no common spec | | Precision | Exact control over breaks, phonemes and say-as formats | Approximate control over style and emotion | | Portability | Shared element names, but each vendor supports a subset | Syntax differs by vendor | | Failure mode | Polly returns an error on unsupported tags; Google ignores unlisted tags on Chirp 3: HD | Tags may be spoken aloud, read as sound effects or ignored | | Billing | Azure bills markup characters, except the speak and voice tags | Check each vendor's pricing page |

The failure modes differ in a way that matters. A wrong SSML tag can stop a request, while a misread emotional tag can produce a slightly odd take that you only hear when you listen.

When SSML is still the better tool

SSML gives you precision when you can specify exactly what you want:

  • Deterministic pronunciation: Azure says its SSML pronunciation elements remain the recommended approach for deterministic control.
  • Exact pauses: A break with a set time gives repeatable timing on the voices that support it.
  • Say-as formats: The say-as element controls how the service reads a value on the voices that support it.
  • Repeatable pipelines: Markup is easy to version and test in code.

When plain-language direction wins

Plain direction is often faster for emotion, scene and quick iteration. Azure's HD voices adjust tone from the text itself, and Gemini's style field describes delivery in a sentence. Vendors say results vary by voice and model, so direction is not automatically more accurate than markup. It is simply easier to write and change, which helps when you are trying several readings of one line.

Can you use both?

Yes, on some platforms. On Azure's Dragon HD Omni, the express-as element accepts natural-language style descriptions, which bridges both approaches. Azure's bracket tags for HD voices are a separate feature. Because support differs by voice, check the element table for the exact voice you plan to use before you combine them.

What this means for OndaLabs users

OndaLabs controls delivery by describing it in plain words and with supported expressive tags in the script. Expressive tags are available on the Free plan. Onda Flash is the most expressive model on paid plans, at 1.5 credits per character, and Onda Lite is on all plans at 1 credit per character.

Try a short script with the delivery described in plain words, then compare the result with a second version. You can start in the OndaLabs text to speech studio or read about the pricing and plan limits. For practical script habits, see how to make an AI voice sound natural.

Frequently asked questions

What is SSML in text to speech?

SSML is an XML-based markup language from the W3C for controlling how synthetic speech is produced. It can set pauses, pronunciation, pitch, rate and volume. Version 1.1 was published as a Recommendation in 2010, and several cloud TTS services still support a subset of it.

Is SSML still used in 2026?

Yes. Microsoft, Google and Amazon all document SSML in 2026, although each supports only some elements. The accurate picture is partial support, not deprecation. Newer HD and expressive voices often support fewer SSML tags, so check the element table for your voice.

What are expressive or audio tags in text to speech?

Expressive or audio tags are vendor-specific cues that shape delivery, such as [whispers] in ElevenLabs or [excited] in Azure HD voices. Some vendors accept natural-language style fields instead. The tags are not a shared standard, so a tag that works in one tool may do nothing in another.

Do SSML tags count toward billing?

On Azure, yes. Its documentation says optional elements that adjust how text is converted, such as phonemes and pitch, count as billable characters, with the speak and voice tags excepted. For other vendors, check the pricing page before you assume markup is free.

How do I add a pause with SSML?

Use the break element. In SSML, <break time="500ms"/> adds a pause of half a second on vendors that support a time value. Azure accepts times from 0 to 20,000 ms, Amazon Polly accepts up to 10 seconds, and ElevenLabs accepts up to 3 seconds on SSML-capable models.

Which approach should I use for a podcast or voiceover?

Use SSML where you need exact timing or deterministic pronunciation and the voice supports it. Use plain-language direction for emotion, scene and quick changes, and keep the style short. Listen to a test pass on the exact voice before you record the full script.