> ## Documentation Index
> Fetch the complete documentation index at: https://docs.inworld.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Best Practices Overview

> The short version — how to make Inworld TTS expressive, fast, and production-ready.

This page is the TL;DR of everything in this section: the checklist we walk new teams through before launch. Each item links to a deeper guide.

## Make it as expressive as possible

1. **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](/tts/instant-voice-cloning) a voice whose sample already has the energy and emotional range you want.
2. **Write for the ear.** Punctuation, capitalization for emphasis, and filler words shape delivery more than any parameter. Speech text is not display text.
3. **Use non-verbal sounds.** Inline tags like `[laugh]`, `[sigh]`, and `[breathe]` add human texture — and they work on both `inworld-tts-2` and `inworld-tts-2-flash`.
4. **Steer delivery on `inworld-tts-2`.** [Instruction tags](/tts/capabilities/steering) 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.
5. **Give the model context.** Pass the text of earlier requests from the same conversation in the [`synthesisContext`](/api-reference/ttsAPI/texttospeech/synthesize-speech-stream#body-synthesis-context) field so short replies like *"Yeah."* are delivered with the right intonation.

<Card title="Generating Naturally Sounding Speech" icon="waveform-lines" href="/tts/best-practices/generating-speech" horizontal>
  The full guide: voice selection, writing for speech, non-verbals, steering, context, normalization, and LLM prompting.
</Card>

## Make it as fast as possible

1. **Pick the fastest model.** `inworld-tts-2-flash` delivers 20 ms time to first audio byte (P90, measured server-side) — 5× faster than `inworld-tts-2` at 100 ms. If your use case doesn't need [steering](/tts/capabilities/steering) or [professional voice cloning](/tts/professional-voice-cloning), Flash is the fastest and cheapest choice.
2. **Stream everything.** Use [WebSocket streaming](/api-reference/ttsAPI/texttospeech/synthesize-speech-websocket) (lowest latency) or [HTTP streaming](/api-reference/ttsAPI/texttospeech/synthesize-speech-stream) 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.
3. **Turn off text normalization.** Server-side normalization adds latency to every request. For latency-sensitive applications, set [`applyTextNormalization`](/api-reference/ttsAPI/texttospeech/synthesize-speech-stream#body-apply-text-normalization) to `OFF` and have your LLM or application write numbers, dates, and symbols in spoken form instead.
4. **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](/portal/regions) 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](https://inworld.ai/contact-sales). For full control over placement, consider an [on-premises deployment](/tts/on-premises).
5. **Reuse connections.** Keep connections alive between requests to skip repeated TCP/TLS handshakes, and don't wait for acknowledgments the protocol doesn't require.

<Card title="Latency" icon="gauge-high" href="/tts/best-practices/latency" horizontal>
  The full guide: streaming setups, connection reuse, chunking, and WebSocket-specific techniques.
</Card>

## Get ready for your production launch

1. **Be on the right plan.** [Concurrency limits](/resources/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](https://inworld.ai/pricing) and make sure your plan covers your expected peak *before* launch day.
2. **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.
3. **Handle limit errors gracefully.** Requests over your concurrency limit are best-effort and may be rejected with a `429` (HTTP) or `code: 8` error (WebSocket). Implement [retries with backoff](/resources/rate-limits#handling-rate-limited-requests) instead of failing the user's turn.
4. **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](/tts/capabilities/long-text-input) for ready-to-run scripts.

<CardGroup cols={2}>
  <Card title="Concurrency Limits" icon="layer-group" href="/resources/concurrency-limits">
    How concurrency is counted per protocol, and how to estimate what you need.
  </Card>

  <Card title="Rate Limits" icon="traffic-light" href="/resources/rate-limits">
    Limits by plan and retry strategies for rate-limited requests.
  </Card>
</CardGroup>
