Skip to main content
Traditional TTS generates the entire audio before returning it. Streaming returns audio chunks as they’re generated, providing:
  • Lower latency: First audio arrives in tens of milliseconds instead of waiting for full generation — see Latency for what to expect
  • Better UX: Users hear audio immediately while more is being generated
  • LLM integration: Process text token-by-token as it arrives from language models

The four rules

Streaming integrations live or die by these. Each links to the page that explains it in depth:
  1. One session per LLM turn. Keep the same streaming session open for the entire assistant turn — never one session per sentence. See Turn lifecycle.
  2. Send LLM tokens directly, without flushing. The server accumulates text and starts generating at natural sentence boundaries. Every client-side flush is a fresh model prefill. See Chunking & per-segment latency.
  3. Flush exactly once, at the end of the turn. This emits any trailing text, then ends the turn. See Turn lifecycle.
  4. Pre-connect at startup. Don’t pay the WebSocket handshake inside the first user interaction. See Latency.

Simple streaming

The simplest pattern — stream a complete text:

LLM token streaming

Stream text token-by-token as it arrives from an LLM. Let the server handle chunking at sentence boundaries — do not flush on every sentence from the client.
Do not flush on every sentence from the client. Calling send(token, flush=True) per sentence bypasses the server’s semantic chunking, forces a cold model prefill on every segment, and makes latency worse, not better. Use autoMode / chunkLengthSchedule and let the server decide boundaries — see Chunking & per-segment latency.

Complete agent turn

The full shape of one assistant turn, LLM to audio:

Spelling out text mid-stream

Use <spell> tags to spell out text letter by letter. Spell content bypasses text normalization automatically, while normalize: true still applies to the surrounding text. Set an explicit language for character names:
When streaming token-by-token, spell tags that span multiple chunks are handled automatically: the server buffers text until the closing </spell> tag arrives before generating audio, and auto-closes incomplete tags if the stream ends unexpectedly. See Text processing for the full spell-tag reference.

Audio playback

Error handling

Going deeper

Turn lifecycle

How turns start and end — flush, idle auto-flush, session reuse, usage

Chunking & per-segment latency

Chunk-size ordering, tuning auto-chunking, backpressure

Barge-in

Cancel the current turn when the user interrupts

Multi-context streaming

Up to 20 independent audio streams over one connection

Word timestamps

Word-level time alignments alongside streaming audio

WebSocket API reference

The full wire format: every message type, field by field