Make it as expressive as possible
- Start from the right voice. The models are designed to closely reproduce the voice sample they’re given — a calm, flat sample produces calm, flat speech no matter what the text says. Pick or clone a voice whose sample already has the energy and emotional range you want.
- Write for the ear. Punctuation, capitalization for emphasis, and filler words shape delivery more than any parameter. Speech text is not display text.
- Use non-verbal sounds. Inline tags like
[laugh],[sigh], and[breathe]add human texture — and they work on bothinworld-tts-2andinworld-tts-2-flash. - Steer delivery on
inworld-tts-2. Instruction tags like[say excitedly with a fast pace]direct emotion, pacing, and vocal style. Use them at the moments where delivery should change — not on every sentence. - Give the model context. Pass the text of earlier requests from the same conversation in the
synthesisContextfield so short replies like “Yeah.” are delivered with the right intonation.
Generating Naturally Sounding Speech
The full guide: voice selection, writing for speech, non-verbals, steering, context, normalization, and LLM prompting.
Make it as fast as possible
- Pick the fastest model.
inworld-tts-2-flashdelivers 20 ms time to first audio byte (P90, measured server-side) — 5× faster thaninworld-tts-2at 100 ms. If your use case doesn’t need steering or professional voice cloning, Flash is the fastest and cheapest choice. - Stream everything. Use WebSocket streaming (lowest latency) or HTTP streaming and start playback on the first chunk. If an LLM generates your text, stream its output into TTS sentence by sentence instead of waiting for the full response.
- Turn off text normalization. Server-side normalization adds latency to every request. For latency-sensitive applications, set
applyTextNormalizationtoOFFand have your LLM or application write numbers, dates, and symbols in spoken form instead. - Be geographically close. Time to first audio includes the network round trip between your servers and ours, so run your backend as close to Inworld as your infrastructure allows. Besides the default US deployment, Inworld runs regional deployments in the EU and India that keep inference close to your users — and if you need a region we don’t cover yet, drop us a note. For full control over placement, consider an on-premises deployment.
- Reuse connections. Keep connections alive between requests to skip repeated TCP/TLS handshakes, and don’t wait for acknowledgments the protocol doesn’t require.
Latency
The full guide: streaming setups, connection reuse, chunking, and WebSocket-specific techniques.
Get ready for your production launch
- Be on the right plan. Concurrency limits are set per plan — from 5 concurrent generations on On-Demand up to 500 on Growth, with custom limits on Enterprise. Compare tiers on the pricing page and make sure your plan covers your expected peak before launch day.
- Size your concurrency realistically. Speech generates much faster than it plays, so one generation slot typically serves several simultaneous conversations — we usually see at least 4× more conversations than slots. Estimate from your traffic patterns rather than assuming one slot per user.
- Handle limit errors gracefully. Requests over your concurrency limit are best-effort and may be rejected with a
429(HTTP) orcode: 8error (WebSocket). Implement retries with backoff instead of failing the user’s turn. - Respect request size limits. The API accepts up to 2,000 characters per request. For articles, chapters, and other long content, chunk the text and stitch the audio — see Long Text Input for ready-to-run scripts.
Concurrency Limits
How concurrency is counted per protocol, and how to estimate what you need.
Rate Limits
Limits by plan and retry strategies for rate-limited requests.