The Realtime Speech-to-Text API organizes transcription around user turns, not raw transcript segments. The model itself signals when a user turn begins and ends, so your voice agent reacts to events rather than running its own voice activity detection. The end result is a more human-like voice agent that:Documentation Index
Fetch the complete documentation index at: https://docs.cartesia.ai/llms.txt
Use this file to discover all available pages before exploring further.
- Handles pauses and phone numbers
- Pulls in context from the conversation for more accuracy
Events
The API emits these events to describe the state of the conversation.| Event | Fires when | Carries transcript? |
|---|---|---|
turn.start | The user begins speaking. | No |
turn.update | Repeatedly, as the model transcribes the user’s speech. | Yes |
turn.eager_end [PREVIEW] | The model predicts the user might be done speaking. | Yes |
turn.resume [PREVIEW] | The user turn is continuing and the last turn.eager_end event should be ignored. | No |
turn.end | The uesr turn is definitively complete. | Yes |
transcript field is cumulative within a turn — it contains the full text transcribed so far in this user turn, not a delta. You do not need to concatenate partial results across events.
All emitted text is final. Later events only append to the transcript; the model never revises text it has already sent. You can use the partial transcript from a turn.update the moment it arrives without worrying about it changing.
A separate connected event fires once when the WebSocket is established. You do not need to wait for it before sending audio.
State machine
Between user turns, the session is idle. When the user begins speaking,turn.start fires, followed by turn.update events as the transcript builds. The turn ends in one of two ways:
- Confident end —
turn.endfires directly. The user turn is over. - Eager end —
turn.eager_endfires first, flagging that the user might be done. Then eitherturn.endconfirms the user turn is over, orturn.resumefires and the user turn continues.
Using turn.eager_end to cut latency [PREVIEW]
turn.eager_end lets your agent start generating a reply before the model is confident that the user is done speaking. The moment it fires, send the transcript to your LLM — you’ll have a response ready to play the instant turn.end arrives.
This is an optimization that might not be necessary for your use case. We would recommend focusing on turn.start and turn.end events earlier in development, then thinking about incorporating more events later on as your agent matures.
Two things can happen after turn.eager_end:
turn.resume: the user kept talking. Cancel any in-progress LLM and TTS generation and wait for the turn to end.turn.end: the user really is done. Play the prepared response.
turn.eager_end and turn.resume work.
Example: one turn
The user says “Hi I need to cancel my subscription please.”- Start preparing a reply on the first
turn.eager_end. - Cancel it on
turn.resume. - Start preparing again on the second
turn.eager_end. - Speak the prepared reply on
turn.end.
Guarantees
- The first event in every turn is
turn.start. turn.eager_endwill be followed byturn.endorturn.resume.turn.resumeonly fires after a precedingturn.eager_end.turn.resumewill always fire if the transcript fromturn.eager_endis not complete.turn.endalways closes a turn; the next turn begins with a newturn.start.- Events append to the turn’s transcript without modifying earlier text.
Edge cases
Client disconnects mid-turn
If the client stops sending audio while the user is still speaking, the session may not emitturn.eager_end or turn.end for that turn.