Expression Tags
Add emotional depth to your audio with expression tags.
Expression tags are only supported by Aura models (aura-lite, aura-prime, aura-max). Rapid models do not support expressions.
Available Expressions
| Tag | Description | Usage |
|---|---|---|
<chuckle> |
Light, brief laughter | Self-contained |
<laugh> |
Full laughter | Self-contained |
<sigh> |
Sighing sound | Self-contained |
<gasp> |
Surprised gasp | Self-contained |
<yawn> |
Yawning sound | Self-contained |
<cough> |
Coughing sound | Self-contained |
<whisper>...</whisper> |
Whispered speech | Wraps text |
<emphasis>...</emphasis> |
Emphasized speech | Wraps text |
Usage Examples
Self-Contained Expressions
These tags produce a sound effect at that position:
import requests
# Laughter
response = requests.post(
"https://yourvoic.com/api/v1/tts/generate",
headers={"X-API-Key": "your_api_key"},
json={
"text": "That's hilarious! <laugh> I can't believe it!",
"voice": "Peter",
"language": "en-US",
"model": "aura-prime"
}
)
# Chuckle
response = requests.post(
"https://yourvoic.com/api/v1/tts/generate",
headers={"X-API-Key": "your_api_key"},
json={
"text": "Well, that's funny <chuckle> but let's continue.",
"voice": "Emma",
"language": "en-US",
"model": "aura-prime"
}
)
# Sigh
response = requests.post(
"https://yourvoic.com/api/v1/tts/generate",
headers={"X-API-Key": "your_api_key"},
json={
"text": "<sigh> It's been a really long day.",
"voice": "Peter",
"language": "en-US",
"model": "aura-prime"
}
)
# Gasp
response = requests.post(
"https://yourvoic.com/api/v1/tts/generate",
headers={"X-API-Key": "your_api_key"},
json={
"text": "<gasp> I didn't expect that at all!",
"voice": "Emma",
"language": "en-US",
"model": "aura-prime"
}
)
Wrapping Expressions
These tags modify how the enclosed text is spoken:
# Whisper
response = requests.post(
"https://yourvoic.com/api/v1/tts/generate",
headers={"X-API-Key": "your_api_key"},
json={
"text": "I have a secret. <whisper>Don't tell anyone.</whisper>",
"voice": "Peter",
"language": "en-US",
"model": "aura-prime"
}
)
# Emphasis
response = requests.post(
"https://yourvoic.com/api/v1/tts/generate",
headers={"X-API-Key": "your_api_key"},
json={
"text": "This is <emphasis>very important</emphasis> information.",
"voice": "Peter",
"language": "en-US",
"model": "aura-prime"
}
)
Combining Expressions
# Multiple expressions in one text
response = requests.post(
"https://yourvoic.com/api/v1/tts/generate",
headers={"X-API-Key": "your_api_key"},
json={
"text": """
<sigh> I'm so tired today.
But wait <gasp> what's that?
<whisper>I think someone is coming.</whisper>
<laugh> Just kidding! It was nothing.
""",
"voice": "Peter",
"language": "en-US",
"model": "aura-max"
}
)
Audiobook Example
Creating expressive narration for storytelling:
story_text = """
The detective looked at the evidence. <sigh> "It doesn't make sense," he muttered.
Suddenly, the door burst open! <gasp>
"I know who did it!" shouted Maria, breathless from running.
The detective <chuckle> leaned back in his chair.
<whisper>This was going to be interesting.</whisper>
"""
response = requests.post(
"https://yourvoic.com/api/v1/tts/generate",
headers={"X-API-Key": "your_api_key"},
json={
"text": story_text,
"voice": "Peter",
"language": "en-US",
"model": "aura-max" # Best quality for audiobooks
}
)
Best Practices
- Use sparingly - Too many expressions can sound unnatural
- Match the context - Use expressions that fit the emotional tone
- Test with your content - Preview how expressions sound with your specific text
- Use Aura Max - For best expression quality, use aura-max model
Expression tags work best with natural conversational text. They add authenticity to audiobooks, character dialogues, and voice assistants.
Break Tag — Timed Silence
Insert precise pauses anywhere in your audio using the <break time="..."/> tag. Control
pacing, add dramatic effect, or cleanly separate sections.
<break> tags only work with the standard generate endpoint
(POST /v1/tts/generate). They are not supported in the streaming endpoint
(POST /v1/tts/stream). Break tags in streaming requests will be silently stripped.
Break tags work with all Aura models (aura-lite, aura-prime, aura-max). Rapid models do not support break tags.
Syntax
| Format | Duration | Example |
|---|---|---|
<break time="Xs"/> |
X seconds (e.g. 0.5s, 1s, 3s) | <break time="2s"/> |
<break time="Xms"/> |
X milliseconds (e.g. 250ms, 500ms) | <break time="500ms"/> |
Maximum break duration is 20 seconds per tag. Values above 20s are automatically clamped. Multiple break tags are allowed per request.
Basic Usage
import requests
# 1-second pause between sentences
response = requests.post(
"https://yourvoic.com/api/v1/tts/generate",
headers={"X-API-Key": "your_api_key"},
json={
"text": 'Welcome to YourVoic. <break time="1s"/> Let\'s get started.',
"voice": "Peter",
"language": "en-US",
"model": "aura-prime"
}
)
# 500ms pause using milliseconds
response = requests.post(
"https://yourvoic.com/api/v1/tts/generate",
headers={"X-API-Key": "your_api_key"},
json={
"text": 'Step one: open the app. <break time="500ms"/> Step two: sign in.',
"voice": "Emma",
"language": "en-US",
"model": "aura-prime"
}
)
Multiple Breaks
response = requests.post(
"https://yourvoic.com/api/v1/tts/generate",
headers={"X-API-Key": "your_api_key"},
json={
"text": """
Welcome to the evening news.
<break time="1s"/>
Our top story: a major breakthrough in renewable energy.
<break time="500ms"/>
Scientists say this could change everything.
<break time="2s"/>
More details after the break.
""",
"voice": "Alan",
"language": "en-US",
"model": "aura-max"
}
)
Combining with Expression Tags
response = requests.post(
"https://yourvoic.com/api/v1/tts/generate",
headers={"X-API-Key": "your_api_key"},
json={
"text": '<sigh> It\'s been a long day. <break time="1s"/> But we made it! <laugh>',
"voice": "Emma",
"language": "en-US",
"model": "aura-prime"
}
)
How It Works
- Text is split at each
<break>tag into segments - All text segments are synthesized in parallel for fast response
- Precise silence of the exact requested duration is inserted between each segment
- All segments are stitched into a single continuous audio file in the correct order
- If any segment fails after retries, the full request fails — you will never receive incomplete audio