State transitions for transcribed text in a realtime session. Understanding these states is essential for building caption UIs.
State flow
audio input
↓
speech_started (VAD detects speech)
↓
[upstream processing — segment in progress]
↓
speech_stopped (VAD detects silence / flush)
↓
transcription.completed (stable text)
Event semantics
speech_started
VAD detected the start of a speech segment.
utterance_index is fixedspeech_stopped
VAD detected the end of a speech segment (silence, flush, or max speech duration).
conversation.item.input_audio_transcription.completed
A speech segment has been transcribed. This is the primary output.
text is stable and will not change::callout{icon="i-lucide-info" color="primary"} When is text stable?
The text in a conversation.item.input_audio_transcription.completed event is final. Once received, it will never be modified for that utterance.
::
utterance_index
Each speech segment has a unique, incrementing utterance_index. Use it to:
Concurrent utterances
The upstream may process multiple speech segments simultaneously. limits.max_concurrent_utterances limits concurrency. When exceeded, frames are dropped and lanson.throttled is sent.
No partial text
In the current version:
transcription.completedcompleted eventThis means clients do not need to handle caption jitter — each segment's text arrives in its final form.