Where the time goes
Synthesis dominates, for a structural reason worth understanding before you
tune anything else.
Synthesis happens per sentence
The model’s output is split at sentence boundaries, and each complete sentence is synthesized as one piece while the earlier ones play. Nothing is heard until the first sentence has been generated and rendered. Two things follow, and they are the whole page:- The length of the first sentence decides time to first audio.
- The length of the whole reply decides how long the turn takes to finish, and therefore how long somebody has to wait to speak again.
Skip synthesis when nobody is listening
If a turn’s output is going to a screen rather than a speaker, ask for text and the pipeline does not synthesize at all:Pace your audio in real time
Send about 20 ms of 16 kHz mono PCM16 per message, at the rate it was recorded. The detector reads arrival timing to find the end of a turn, so pushing a whole file into the socket at once does not make the answer come sooner. It makes endpointing wrong: everything looks like one continuous burst of speech with no pauses in it. A microphone feeding the socket in real time is the case the detector is tuned for. Endpointing itself is a small, adjustable part of the budget: lowersilence_duration_ms and the agent answers sooner and interrupts more; raise
it and it waits. See Turn-taking.
Cut playback on speech_started
When someone interrupts, generation cancels server-side and queued audio is
dropped. Your client has to do the same thing locally:
What does not help
Measure it, do not estimate it
Every turn is timed frominput_audio_buffer.speech_stopped to the first audio
frame you could hear, and stored. Use that instead of a stopwatch. The
organization aggregate below is recorded on every deployment, whatever it does
with session audio.
turns and median_reply_ms without shipping you the transcript. Open
one and every assistant entry has its own ttfb_ms, so you can see which turn
was slow and read what the model was asked to say in it.
median_reply_ms comes back null — fall back to the aggregate.
Nine times out of ten a slow session is a verbose one, and the fix is in
instructions.
Batch synthesis is a different problem
POST /v1/audio/speech supports incremental phrase synthesis with nur-tts-v1
when response_format: "pcm" and stream_format: "sse" are combined. This
lets playback start before the whole request finishes. File formats such as
MP3 and WAV still wait for complete synthesis before their encoded bytes stream.
For bulk generation, split long text into paragraph-sized pieces and write to
disk as the response arrives. Limit concurrency when sharing GPU capacity with
Live sessions.
See Stream speech to a file.
Next
Turn-taking and barge-in
The detector’s knobs, and how to tell a timing bug from a slow one.
Live
The protocol, and the sample-rate trap that presents as a bad model.
Pricing and limits
What an open socket costs while nobody is talking into it.
Sessions
Per-session timing, transcripts and recordings.