config.stt is one provider/model pair from the catalog. It decides two things
that feel unrelated and are not: how the caller’s words are transcribed, and
what ends their turn. Turn detection has no setting of its own — it falls
out of the speech-to-text model plus config.language.
If your agent talks over people, or leaves long dead air, this is the page.
The stt object
string
default:"sarvam"
deepgram, openai, elevenlabs, soniox, sarvam, raya or xai.string
default:"saaras:v3"
A model that provider offers. It must be in the catalog and support the
agent’s channel.
object | null
A second provider/model to switch to mid-call. It must match the primary’s
streaming/batch kind — see model fallbacks.
language here; the agent’s single
config.language reaches every model, each in its own spelling.
Voice and video agents need one. Text agents have no stt at all, and neither
does an agent running a speech-to-speech model.
Streaming versus batch
A streaming model holds a socket open and transcribes as the caller speaks, emitting interim results and its own end-of-speech signal. A batch model (streaming: false in the catalog) transcribes one utterance
per HTTP request. LiveKit’s local voice-activity detector cuts the audio into
utterances and posts each one.
Batch is meaningfully cheaper —
xai/xai-stt-batch is half the price of the
streaming variant of the same service — and it is the only pipeline that can
hear whether a sentence is finished. Streaming is the better default for
latency.
What ends a turn
There is noturn_detection field. Storing one would let you pick something
your models cannot do. Which detector runs is derived, and there are exactly
three outcomes.
1
Streaming model → the provider's own detector
The model that produces the transcript also decides when the caller stopped,
so the turn can never commit on a half-finished transcript. It can keep
listening when it hears the caller is not finished, which means
min_silence_duration is the window it gets rather than the whole wait, and
its transcription round-trip lands on top.2
Batch model + a language the end-of-turn model knows → meaning
A batch model has no endpointer, so LiveKit’s local audio end-of-turn model
takes over — but only for the fourteen languages it was trained on. It
judges whether the sentence sounds finished, so it waits through a caller
who pauses mid-thought (“I need to think about that for… a moment”). It runs
locally, and costs nothing extra.
3
Batch model + anything else → plain silence
Any other language, and Auto, fall back to the local voice detector alone:
the turn ends when the caller has been quiet for
min_silence_duration,
whatever they were in the middle of saying.The fourteen languages
Arabic, Chinese, Dutch, English, French, German, Hindi, Indonesian, Italian, Japanese, Korean, Portuguese, Spanish, Turkish. The model keys off the primary subtag, so every regional variant counts:en-GB, en-IN, pt-BR, es-419, zh-TW, fr-CA, ar-EG and hi-Latn all
qualify because en, pt, es, zh, fr, ar and hi do.
GET /v1/catalog returns this set as turn_detector_languages, so you never
have to hard-code it.
Speech-to-speech agents are a fourth case, and they are not on this page:
the model detects turns inside the provider’s own socket. The whole
min_silence_duration budget is handed to it as its silence window, and
max_silence_duration never applies.Endpointing
Two numbers, underturn_handling.endpointing.
number
default:"0.5"
Seconds of silence before the agent takes the turn. Minimum 0.25 — below
that the local voice detector could never reach the threshold the session
needs, so the write is refused.
number
default:"2.5"
How long to wait instead when the end-of-turn model judges the caller is
mid-thought. Must be at least
min_silence_duration, or the write is refused:
“maximum silence must be at least the minimum - the agent waits the maximum
only when the turn detector judges the caller is mid-thought.”max_silence_duration does something on exactly one pipeline — batch model plus
one of the fourteen languages. On every other pipeline nothing produces the
“they are not finished” judgement it answers, and the value is ignored. The
dashboard hides the field entirely unless the agent resolves to that pipeline.
min_silence_duration always does something, but what depends on the model:
The same number also tunes the local voice detector for the whole call, which
is what makes
interruption.min_speech_duration measure one turn rather than
one word.
Fixing an agent that mistimes turns
Troubleshooting
Reference: speech-to-text models
“Auto” is the code the model runs on whenconfig.language is null.
Every entry runs on
voice and video. All four batch models are marked
No under Streaming: xai/xai-stt-batch, raya/bakbak-stt,
elevenlabs/scribe_v2 and openai/gpt-4o-transcribe.
Prices are per audio second and billed to your own provider key. A streaming
model bills the whole call; a batch model bills only the speech it was sent.
Next
Language
The one setting every model shares, and where Auto is a trap.
Turn handling
Interruptions, false-interruption recovery and preemptive generation.
Audio processing
Cleaning up a noisy caller before the transcriber hears them.