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.
That is the whole object. There is no 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.
turn_handling.interruption.min_words needs interim transcripts, so it does nothing on a batch model. Publishing the combination warns rather than fails: “word-count interruption needs interim transcripts, which batch speech-to-text models do not produce - the agent will only notice the interruption once the caller stops speaking.” See turn handling.

What ends a turn

There is no turn_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 practical lever: a batch model plus one of the fourteen languages is the only pipeline that hears meaning rather than silence. Everything else ends turns on a stopwatch.

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, under turn_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

Remember that a config write is the whole config — read it, change it, send it back — and that nothing reaches a caller until you publish.

Troubleshooting

Reference: speech-to-text models

“Auto” is the code the model runs on when config.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.