Skip to main content
POST /v1/tts/stream synthesizes speech and streams the audio back as it is generated, so you can begin playback before the whole utterance is ready. It takes the same request fields as the synchronous endpoint, with a limit of 500 characters for chariot-v0 or 1,000 for chariot-multilingual-v1.

Request

Replace VOICE_ID with a voice UUID that supports your model_type. See Models for model selection, speaking rates, and latency controls. To measure first-audio latency and connection setup from your own environment, use the latency testing tool.

Response format

The body is a chunked stream of raw audio, not a container file: There is no WAV/RIFF header on the stream. To play it, point your audio sink at a 44.1 kHz mono s16le source, or prepend your own WAV header. The X-audio-url response header is sent before the body. It points to a WAV archive uploaded after generation; archiving is best effort.

Response headers

Consuming the stream

Error handling

The server checks the upstream response and waits for initial audio before returning 200. Failures before that point return an HTTP error. A 200 still does not guarantee the whole stream succeeded: failures after the first audio chunk end the stream early. Guard against truncation:
  • Track how much audio you received and treat an unexpectedly short stream as a failure.
  • Credits are charged only after successful delivery. A generation that fails partway is not charged.
Validation and auth errors (bad voice_id, text over the selected model’s limit, missing key) happen before streaming starts and return a normal JSON error with the appropriate status code. See Errors & status codes.
For token-by-token input or sessions with multiple utterances, use the WebSocket API instead.