Skip to main content
This guide covers how to get the most natural, expressive speech out of Inworld TTS — from choosing the right voice to writing text that speaks well, steering delivery, and prompting an LLM whose output feeds into TTS. For latency techniques, see the Latency guide.

Start from the right voice

Different voices suit different applications: for a meditation app, pick a steady, calm voice; for an encouraging fitness coach, pick an expressive, excited one. Choose a voice that matches the emotional range you’re looking for — no amount of text engineering will make the wrong voice sound right.
By default, the model is designed to closely reproduce the voice sample it was given. The delivery you hear — energy, pace, warmth — mirrors the delivery in the sample, so an instant voice clone made from a calm, flat recording will speak calmly and flatly no matter what the text says. If you need an energetic voice, clone from an energetic sample. Professional voice cloning trains on much more audio, so a PVC voice captures a broader expressive range than any single sample can.
For recording tips and sample scripts, see Voice Cloning best practices. To push a voice’s delivery beyond its sample for a specific line or turn, use steering on inworld-tts-2.

Write for the ear

Speech text is not display text. The way you write shapes the delivery more than any parameter:
  1. Pay attention to punctuation — Use exclamation points (!) to make the voice more emphatic and excited. Use periods to insert natural pauses, and commas for shorter breaks. Where possible, include punctuation at the end of every sentence.
  2. Capitalize for emphasis — Emphasize specific words by capitalizing them: “We NEED a real vacation” stresses need, while “We need a REAL vacation” stresses real. Capitalizing individual syllables works too: “AbsoLUTEly”. Alternatively, wrap a word in single asterisks (*word*).
    Use single asterisks only (*word*). Double asterisks (**word**) will cause TTS to read the asterisk characters aloud instead of emphasizing the word.
  3. Vary sentence length — Short sentences speed things up and add urgency; longer sentences slow the pace for calm, measured delivery.
  4. Add filler words for conversational speech — Natural human conversation is full of uh, um, well, like, and you know. The models generate the requested text as-is, so if you want conversational imperfection, write it in: “Uh, I’m not uh too sure about that.” Skip fillers for formal applications like narration or customer support.
  5. Use pause controls for precise pauses — When punctuation isn’t enough, add SSML break tags like <break time="1s" />. See Pause Controls.

Add non-verbal sounds

Non-verbal tags insert organic, human sounds — a laugh, a sigh, a sharp breath — exactly where you place them:
I told him what happened, and he just [laugh] couldn’t believe it!
They work on both inworld-tts-2 and inworld-tts-2-flash. The most reliable ones are [laugh] [breathe] [clear throat] [sigh] [cough] [yawn]; see the full list of recognized sounds. Place them inline where the sound naturally belongs — each tag produces one occurrence and doesn’t change how the surrounding words are spoken.

Steer the delivery on inworld-tts-2

On inworld-tts-2, steering lets you direct delivery in natural language — emotion, pacing, volume, and vocal style — with instruction tags placed before the text they apply to, or a request-level instruction field:
[say excitedly with a high pitch and fast pace] I have great news. Your package has arrived!
Two things to keep in mind:
  • Don’t overuse it. The model already reproduces the character of the voice sample; steering is for the moments where the delivery should change. A tag stays in force until you change it or write [reset], so one tag at the start covers a whole passage — re-tagging every sentence gives the model less continuity to work with and can make delivery uneven.
  • Match the instruction to the text. [sound sad] on celebratory text sends contradictory signals and degrades output quality.
inworld-tts-2-flash does not support steering — instruction tags and the instruction field are ignored, though non-verbal tags like [laugh] work as usual.

Give the model conversation context

Speech doesn’t happen in a vacuum: how “Yeah.” should sound depends entirely on what came before it. Use the synthesisContext field to pass the text of previous requests from the same session or conversation, in the order they were synthesized:
This gives the model additional context and can improve the quality of the generation — especially for short or ambiguous input where the text alone doesn’t determine the right intonation.

Speak the right language

Set the language field for the most consistent results when generating cross-lingual audio, and localize the voice for native-sounding speech in the target language. See Language Support for details.

Normalize complex text

Text like phone numbers, dollar amounts, and dates often isn’t written the way it’s spoken. Inworld TTS includes an optional normalization step that expands these into their spoken forms before synthesis:
  • Phone numbers: “(123)456-7891” → “one two three, four five six, seven eight nine one”
  • Dates: 5/6/2025 → “may sixth twenty twenty five”
  • Times: “12:55 PM” → “twelve fifty-five PM”
  • Emails: test@example.com → “test at example dot com”
  • Monetary values: $5,342.29 → “five thousand three hundred and forty two dollars and twenty nine cents”
  • Symbols: 2+2=4 → “two plus two equals four”
Toggle it with the applyTextNormalization parameter:
  • ON — always normalize
  • OFF — skip normalization entirely
  • APPLY_TEXT_NORMALIZATION_UNSPECIFIED (default) — TTS decides per-request
Server-side normalization is available for many of the supported languages. It’s language-specific, not locale-specific (e.g., en-US and en-GB are normalized the same way). For languages where normalization doesn’t apply, expand the text yourself before sending it.
Normalization adds slight latency to each TTS request. For latency-sensitive applications, expand the text in your LLM prompt or application instead and set applyTextNormalization to OFF.
With normalization on (recommended for most cases), standard expansions are handled for you; you only need to guide edge cases that normalization may not cover — ambiguous dates (01/02/2025 could be January 2nd or February 1st), domain-specific abbreviations (RDS, k8s, HIPAA), and uncommon acronyms. With normalization off, your application or LLM must handle all text expansion — no digits, no symbols, no shorthand. Use this when you need full control over how text is spoken, or when your domain has pronunciation requirements that conflict with the default expansion rules.

Tune the delivery mode

For inworld-tts-2, use the deliveryMode field to control the trade-off between stability and variability. STABLE produces more consistent, predictable output (best when the output must closely match the input). CREATIVE produces more varied speech with greater emotional range (useful for creative use cases like barks or demo clips). BALANCED (the default) sits in between.

Prompting your LLM

When an LLM generates text that gets fed into TTS, the default output often sounds flat and unnatural. LLMs tend to produce clean, well-formatted text, but clean text isn’t the same as speakable text: dates stay as 12/04, acronyms aren’t expanded, and there are no cues for emphasis, pauses, or emotion. This section shows what to add to your LLM system prompt so its output follows the practices above.
On inworld-tts-2, you can go further and have the LLM embed steering tags directly in its output. See Prompting for TTS-2 for steering-aware prompt templates.

Emphasis

Prompt snippet:
Before (no emphasis guidance):
I think this is a really important point and you should consider it carefully.
After (with emphasis guidance):
I think this is a *really* important point, and you should consider it *carefully*.

Pronunciation

For uncommon words like brand names, proper nouns, and technical terms, Inworld TTS supports inline IPA phoneme notation. You can provide a pronunciation dictionary in your system prompt that the LLM substitutes inline. Prompt snippet:
Before (no pronunciation guidance):
You should visit Crete for your honeymoon.
After (with IPA substitution):
You should visit /kriːt/ for your honeymoon.
Use standard English IPA phonemes only (not CMU dictionary or ARPAbet) — see Custom Pronunciation for finding the right phonemes. Alternatively, run a string parser over the LLM output that substitutes entries from your pronunciation dictionary before passing text to TTS — useful when the same dictionary must apply consistently across multiple LLM providers.

Pauses and pacing

Prompt snippet:
Before (flat pacing):
The results are in and we exceeded our target by 40 percent so this is the best quarter we have ever had.
After (with pacing guidance):
The results are in. We exceeded our target… by *forty percent*. This is the *best* quarter we have ever had.

Conversational naturalness

Prompt snippet:
Filler words are best for casual, conversational use cases. Skip them for formal applications like news reading, professional narration, or customer support.

Output length

LLMs tend to be verbose. A detailed paragraph may read well on screen, but sounds unnatural and exhausting when spoken aloud. Keeping responses short produces better-sounding speech and reduces latency. A good default is to ask your LLM to respond in 1–2 sentences unless the user’s query specifically demands a longer answer. Use sentences as your length unit, not words or characters — LLMs operate on tokens, so word and character counts are unreliable constraints. Prompt snippet:

Example prompt templates

Below are complete, copyable system prompt blocks tailored for common use cases. Each template combines the techniques above into a ready-to-use prompt.
Use this template for chatbots, AI companions, virtual friends, and other informal conversational applications.

Tips for iterating

  • Test with the TTS Playground: Use the TTS Playground to quickly hear how your LLM output sounds when synthesized. Paste in sample outputs and iterate on your prompt until the speech quality meets your needs.
  • Tune LLM temperature for consistency: Lower temperatures produce more consistent output that follows your formatting rules reliably. Higher temperatures can produce more expressive text but may ignore specific instructions. Start around 0.7 and adjust based on results.
  • Iterate on your pronunciation dictionary: Start with a small set of terms and expand as you discover mispronunciations during testing. Ask an LLM to generate IPA for new terms.

Next Steps

Prompting for TTS-2

Have your LLM embed steering tags for expressive, directed speech on inworld-tts-2.

Latency

Streaming, chunking, and connection techniques for the fastest time to first audio.

Voice Cloning

Best practices for producing high-quality voice clones.