STT Turn Detection: Flux, Scribe, Speechmatics - Zian AI

STT Turn Detection: Flux, Scribe, Speechmatics

Choose on the endpointing surface, not word error rate. Deepgram Flux emits a semantic EndOfTurn with a confidence threshold tunable from 0.5 to 1.0 and a 500 to 60000 ms backstop. Speechmatics caps its Realtime silence trigger at 2.0 seconds and publishes no tunable for Agent STT. ElevenLabs Scribe commits segments, not turns.

Comparisons of these three rank accuracy and price per hour. Neither tells you whether the conversation will feel human. That is decided by the endpointing surface: what the engine tells you about turn boundaries, which numbers you may move, and what still ends a turn after you think you have taken control. This page compares only that. Accuracy on Australian speech is a separate axis, covered in Australian accent accuracy and word error rate for voice agents; the per-turn latency it spends is in why sub-second voice AI latency matters.

Turn detection is three different mechanisms, and vendors ship different ones

Most wasted tuning time comes from treating these as one feature. They are not, and the three vendors do not ship the same one. The framework layer above the engine — stock endpointing defaults in LiveKit Agents, Pipecat, Vapi and Retell, and how those numbers compose — is covered in why an AI voice agent interrupts callers and not repeated here. This page stays inside the speech-to-text engine.

  1. Acoustic voice activity detection. A model classifies the waveform as speech or not-speech. It has no access to words, so a breath, a cough or a speakerphone echo can score as speech. It sits under the Scribe vad commit strategy and under Agent STT in vad mode.
  2. Transcript-derived silence. The countdown runs on recognised words, not audio energy. Speechmatics Realtime documents it plainly: when a word is detected on the server a countdown begins, and a new word restarts it. Noise cannot restart that clock, because noise is not a word. It is still a clock, and a clock cannot tell a thinking pause from a finished sentence.
  3. A semantic end-of-turn model. A model scores whether the utterance sounds complete. Deepgram Flux puts an end_of_turn_confidence value on every Update event, roughly every 0.25 seconds of transcribed audio, and fires EndOfTurn when it crosses eot_threshold.

A fourth thing looks like turn detection and is not: a transcript-segment commit. Scribe v2 Realtime returns partial_transcript and committed_transcript; a commit finalises a segment of text, and whether that segment is a turn is yours to decide. Reading a commit as a turn is how an agent replies to half an answer. Barge-in is a fifth subsystem, diagnosed in why an AI voice agent interrupts itself.

The five-question endpointing surface test

Run these five against the vendor doc before you look at a benchmark. Twenty minutes per engine, and they eliminate more candidates than an accuracy table does.

  1. Does the engine emit a turn boundary at all, or only a transcript? If only a transcript, you are supplying the turn logic and this is a transcription decision, not an endpointing one.
  2. Is the boundary acoustic, transcript-derived or semantic? That determines which caller behaviour breaks it.
  3. Is the tunable published as a number with a range? A named parameter with no documented range or default is not something you can plan a launch around.
  4. Can you change it mid-call, or only at connect? The wait you want while a caller reads a policy number is not the wait you want during small talk.
  5. If you take ownership, what still ends a turn behind your back? Each engine has a backstop and they are not the same shape.

Question five is the one nobody asks, and the one that produces the mystery bug three weeks after launch.

The endpointing capability matrix

Every cell was read from the named vendor documentation on 16 September 2026. There is deliberately no best overall column: the rows disagree, and the right engine is the one whose binding row you can live with. Speechmatics ships two distinct endpointing surfaces, so it gets two columns.

What you are choosing Deepgram Flux ElevenLabs Scribe v2 Realtime Speechmatics Agent STT Speechmatics Realtime v2
Turn events from the engine StartOfTurn, EagerEndOfTurn, TurnResumed, EndOfTurn None. partial_transcript and committed_transcript only StartOfTurn, EndOfTurn; plus SpeechStarted / SpeechEnded in vad mode EndOfUtterance, only when enabled
What decides the boundary Model confidence, reported as end_of_turn_confidence Silence, under the vad commit strategy, or your own commit message Voice activity in vad mode; your ForceEndOfUtterance in external Seconds since the last recognised word
Published tunable and range eot_threshold 0.5 to 1.0, default 0.7; eager_eot_threshold 0.3 to 0.9; eot_timeout_ms 500 to 60000, default 5000 Four parameters named in the schema (vad_silence_threshold_secs, vad_threshold, min_speech_duration_ms, min_silence_duration_ms) with no range or default published None; the docs state voice activity detection is not currently configurable end_of_utterance_silence_trigger, 0 to 2 seconds, default 0 which disables it
Changeable mid-call Yes. A Configure message updates keyterms and all three thresholds without reconnecting Not documented; configuration is sent at session start Not documented; turn_config is sent with StartRecognition Not documented; conversation_config is sent with StartRecognition
If you take ownership, what still ends a turn eot_timeout_ms, maximum 60000 ms, emitting EndOfTurn with trigger of timeout Automatic commit after approximately 36 seconds of accumulated audio Nothing; in external mode no turn ends on its own Nothing, if the silence trigger is left at its default of 0
Custom vocabulary cap Up to 100 keyterms, 500 tokens total 50 keyterms of 20 characters in realtime; 1,000 of 50 in batch additional_vocab: 1,000 recommended, above 20,000 items rejected
Per-word confidence Yes, confidence on each word in the payload Yes, per-word logprob when include_timestamps is set Not in the AddSegment schema (transcript, speaker, start and end time only) Yes, 0.0 to 1.0 per alternative
Accepted input audio linear16, linear32, mulaw, alaw, opus, ogg-opus; you set the sample rate pcm_8000 through pcm_48000 and ulaw_8000; mono only pcm_f32le or pcm_s16le; sample rate a constant 16000 pcm_f32le, pcm_s16le or mulaw

Two rows decide most deployments. The audio row rules out Agent STT for raw telephony audio without a resampler, because its StartRecognition schema fixes sample_rate at 16000 and accepts no mu-law. The tunable row is the whole argument: Flux hands you three published ranges, Speechmatics Realtime one that stops at 2.0 seconds, and Agent STT none.

Worked example: a caller reading a card number in four groups

A caller reads a 16-digit number in four groups of four, looking down between groups, so the gaps run about 2.4 seconds. What do the published limits allow?

  • Speechmatics Realtime v2. The maximum end_of_utterance_silence_trigger is 2.0 seconds, so a 2.4 second gap exceeds the documented ceiling: four utterances for one number, and three chances for the agent to answer a fragment. No configuration avoids it, because 2.0 is the top of the range. Speechmatics recommends 0.5 to 0.8 seconds for voice AI, which makes fragmentation more likely, not less.
  • Speechmatics Agent STT in vad mode. The wait is neither published nor configurable, so this arithmetic cannot be done in advance at all. You measure it on your own audio.
  • ElevenLabs Scribe v2 Realtime. With the vad strategy at the 1.5 second threshold in the ElevenLabs example code, each gap commits a segment — but a commit is a transcript boundary, not a turn, so your application still decides. With the default manual strategy nothing commits until you send the message, subject to the automatic commit at roughly 36 seconds.
  • Deepgram Flux. The mechanism is a confidence score, not a clock, and the only clock is eot_timeout_ms, default 5000 ms, well clear of a 2.4 second gap. Deepgram documents raising it to 7000 to 10000 for users with frequent pauses. We have not measured what the model scores on a part-read card number, so treat this as what the parameters permit, not as a result.

The conclusion is narrow: for answers with long internal pauses, the constraint is the top of the range, not the default in the middle of it. Read the maximum first.

Who each option is wrong for

Deepgram Flux is wrong for you if you need what it deliberately does not do. Deepgram publishes the trade: against Nova-3, Flux drops smart formatting, speaker diarisation, find-and-replace and search, restricts redaction to numbers only, covers ten languages including English on flux-general-multi, and is not for pre-recorded audio, meeting transcription or call analytics. Settle one inconsistency against the API rather than the docs: Deepgram lists Profanity Filter as available on its Flux feature overview and marks it unsupported for Flux on its Flux-versus-Nova-3 comparison, both read 16 September 2026.

ElevenLabs Scribe v2 Realtime is wrong for you if you want the engine to own the turn. It emits no turn event, and its VAD parameters appear in the schema with no published defaults or ranges, so tuning is empirical from day one. It fits when you already own a detector and want a broad-language transcriber behind it: 90-plus languages, per-word timestamps, entity detection across 65 types, native ulaw_8000.

Speechmatics Agent STT is wrong for you if you want to tune the wait, or if your audio arrives at 8 kHz with nowhere to resample it. It fits the opposite case: external mode runs no voice activity detection, nothing ends a turn on its own, and your detector sends ForceEndOfUtterance with the audio timestamp to cut at. That is the cleanest ownership model of the three, and the right answer when a Pipecat or LiveKit detector is already the authority.

Speechmatics Realtime v2 is wrong for you if any caller answer contains a pause longer than two seconds. It is right when you want transcript-derived silence rather than acoustic VAD, the more robust of the two clocks on a noisy line.

What the framework integrations do not expose, as at 16 September 2026

You are usually not talking to these APIs directly. You are talking to a plugin, and the plugin is a second set of limits. Every status below was re-checked on 16 September 2026; two had changed since this page was researched.

Issue Status on 16 September 2026 What it means for the choice
pipecat-ai/pipecat #5637, opened 5 September 2026 Open DeepgramFluxSTTService serialises the three threshold values straight into the connection URL without validating them against Deepgram ranges, so an out-of-range value reaches the provider unvalidated rather than being caught client side.
pipecat-ai/pipecat #5717, opened 12 September 2026 Open Pipecat 1.10.0 inherits the pipeline input rate for Agent STT, so an 8 kHz pipeline opens the session at 8000 and Speechmatics rejects it — matching the constant 16000 in the schema.
livekit/agents #6924, opened 20 August 2026 Closed, completed, 7 September 2026 by merged PR #6945 Our research item recorded this as an open gap. It is not: the end-of-turn and VAD options are now exposed in the LiveKit Speechmatics plugin, with the maintainer noting availability in the next release.
livekit/agents #6992, opened 26 August 2026 Closed, completed, 29 August 2026 by merged PR #6993 Numerals, profanity filter and redaction are now exposed on the LiveKit Flux plugin, and the reporter verified against the live endpoint that the API accepts them — relevant to the documentation inconsistency noted above.
livekit/agents #7180, opened 9 September 2026 Open Per-word confidence is forwarded on the v2 (Flux) path but not the v1 path in the LiveKit Deepgram plugin. For an agent reading back email addresses or reference numbers, that field is the difference between re-asking one segment and re-asking the whole value.

The pattern is the point: a capability can be present in the vendor API and absent in the plugin you import, and it can appear between the day you research and the day you build. Two of these five moved in three weeks. Check the issue, not the blog post — and the pre-launch pass in how to test an AI voice agent before go-live is where these surface.

Tune it yourself or hand it over

The method above is complete and you can run it. What it costs to run is the honest part of the answer.

Your situation Do it yourself Hand it over
One language, one call type, one country Yes: five questions, one engine, a week of recordings Not worth it
Mixed inbound and outbound on one number pool Workable: two configurations, two measurement sets Marginal
Three or more languages with different pause habits Costly: each needs its own threshold and labelled sample Reasonable
Engine or plugin changes under you mid-quarter Ongoing: two of the five issues above moved in three weeks Reasonable
Audio cannot leave your infrastructure Only if you can self-host the engine Only with private model deployment on your own infrastructure

The arithmetic is yours. A single-language, single-flow agent is a week of work and then it is done. A multilingual outbound programme means re-running the five questions per language, per engine version, indefinitely. Zian AI carries that tuning inside the platform, and supports private model deployment on customer infrastructure where audio cannot leave. If you would rather own it, the matrix above is the whole method.

Frequently asked questions

Which STT should I use for turn detection in a voice agent?

If you want the engine to decide turns, Deepgram Flux is the only one of the three that emits a semantic end of turn with a published tunable range, 0.5 to 1.0 on eot_threshold. If you already own a turn detector, Speechmatics Agent STT in external mode is the cleanest handover because nothing ends a turn on its own. If you want breadth of language and will supply your own turn logic, ElevenLabs Scribe v2 Realtime covers 90 plus languages.

Does ElevenLabs Scribe do end of turn detection?

Not as a turn event. Scribe v2 Realtime returns partial and committed transcripts, and a commit is a transcript segment boundary rather than a conversational turn. You can have it commit automatically on silence using the vad commit strategy, or send commits yourself. Either way your application decides what counts as a turn.

Can I tune Speechmatics turn detection?

It depends which Speechmatics product you are on. The Agent STT turn detection page states that voice activity detection is not currently configurable, and offers an external mode instead where your application closes every turn. On the Realtime v2 API you get one number, end_of_utterance_silence_trigger, allowed between 0 and 2 seconds and disabled by default.

What happens if I turn off the engine end of turn and run my own detector?

Something still ends the turn in two of the three cases, and the shapes differ. On Deepgram Flux, setting eot_threshold to 1.0 suppresses natural end of turn but eot_timeout_ms remains as a backstop, up to a maximum of 60000 ms. On ElevenLabs Scribe v2 Realtime the model commits automatically after roughly 36 seconds of accumulated audio. On Speechmatics Agent STT in external mode, nothing does.

Does turn detection work on 8 kHz phone audio?

Two of the three accept it directly. Deepgram Flux accepts mulaw and alaw with the sample rate you set, and ElevenLabs Scribe v2 Realtime accepts a ulaw_8000 format. Speechmatics Agent STT fixes sample_rate at a constant 16000 in its StartRecognition schema and accepts only 16 or 32 bit PCM, so telephony audio has to be resampled before it arrives.

The turn boundary is the difference between a call that feels like a conversation and one that feels like a form. If you would rather have the endpointing surface chosen, tuned per language and maintained through plugin churn than own it yourself, Zian AI is in partnership-application beta. Apply For Partnership.

Related Blogs

Related from Zian AI