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.
inworld-tts-2.
Write for the ear
Speech text is not display text. The way you write shapes the delivery more than any parameter:- 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.
- 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*). - Vary sentence length — Short sentences speed things up and add urgency; longer sentences slow the pace for calm, measured delivery.
- Add filler words for conversational speech — Natural human conversation is full of
uh,um,well,like, andyou 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. - 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 thesynthesisContext field to pass the text of previous requests from the same session or conversation, in the order they were synthesized:
Speak the right language
Set thelanguage 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”
applyTextNormalization parameter:
ON— always normalizeOFF— skip normalization entirelyAPPLY_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.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
Forinworld-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 as12/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: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: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: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: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.- Companion / Conversational
- Support / Sales
- Dev Tools / Technical
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.7and 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.