many-forest-60185
03/13/2026, 2:11 AMtall-airline-16756
03/13/2026, 2:12 AMtall-airline-16756
03/13/2026, 2:12 AMeager_eot_threshold (0.3–0.9) and eot_threshold (0.5–0.9) to control when an eager end-of-turn fires and when a final turn is finished. These influence when the STT node considers a transcription complete.
• AssemblyAI (with LiveKit Inference)
◦ You can pass extra_kwargs to send provider-specific options like VAD-related thresholds (for example vad_threshold) that affect voice-activity and turn detection behavior.
• Speechmatics
◦ You can adjust end_of_utterance_silence_trigger (silence duration that triggers end-of-utterance), which indirectly affects when a transcription is considered complete.
If your goal is specifically to:
• Filter out low-confidence words in the transcript: That capability is not guaranteed to be built into every STT node. You can check whether your chosen provider returns per-word confidence scores and then apply post-processing on the transcript to drop or flag words below your desired confidence threshold.
• Change when the node emits a final transcript versus interim results: Use the provider-specific end-of-turn / VAD / silence thresholds noted above.
Which STT provider are you using, and do you want help with: 1) adjusting end-of-turn / VAD thresholds for more/less aggressive turn completion, or 2) filtering words by confidence after transcription (post-processing)?
Tell me your provider and which of the two goals above matches your need and I’ll give exact parameter names and a short example for configuring it.
Sources: Deepgram STT | LiveKit Documentation | AssemblyAI STT | LiveKit Documentation | Speechmatics STT plugin guide | LiveKit Documentationmany-forest-60185
03/13/2026, 2:13 AMtall-airline-16756
03/13/2026, 2:13 AMmany-forest-60185
03/13/2026, 2:14 AMtall-airline-16756
03/13/2026, 2:14 AMstt_node hook so you intercept transcription events as they stream from Soniox.
• For each transcription event (interim or final), read the words/tokens and their confidence values.
• Build a filtered transcript by excluding words below your chosen threshold (for example 0.5).
• Replace the event’s text/alternatives with the filtered text before yielding the event so downstream components only see the cleaned transcript.
Example concept (Python-style pseudocode)
• The snippet below demonstrates the pattern: call the base implementation to get events, filter words by word.confidence, update the event.alternatives[0].text, then yield the event.
async def stt_node(self, audio: AsyncIterable[rtc.AudioFrame], model_settings: ModelSettings):
# Stream transcription events from the default STT processing
async for event in super().stt_node(audio, model_settings):
# Only process transcript events that include word-level data
if event.type in (stt.SpeechEventType.FINAL_TRANSCRIPT, stt.SpeechEventType.INTERIM_TRANSCRIPT):
alt = event.alternatives[0] if event.alternatives else None
if alt and hasattr(alt, "words"):
threshold = 0.5 # set your confidence threshold here
filtered_words = [
w.text for w in alt.words
if getattr(w, "confidence", 1.0) >= threshold
]
# Join remaining words; you can preserve spacing/punctuation as needed
alt.text = " ".join(filtered_words)
yield event
Notes and tips
• Choose your threshold based on testing. 0.5 is a common starting point but you may prefer higher for cleaner transcripts.
• If Soniox sometimes omits per‑word confidence for certain tokens, guard with a default confidence (as shown) or treat missing values as low confidence.
• Decide whether to apply filtering to interim results, final results, or both. Filtering interim results may make streaming feel choppy; many choose to filter only final transcripts.
• If you want to discard entire segments instead of removing words, compute an average or minimum confidence across the segment and skip yielding the event when it’s below your cutoff.
• Keep downstream consumers in mind: removing words can change timestamps or semantics. If you rely on precise timing, you may prefer flagging low‑confidence words rather than removing them.
If you’d like, I can:
• Provide a more concrete code example in the exact language/framework you’re using.
• Show an example that flags low‑confidence words (e.g., wraps them in markers) instead of dropping them.
• Suggest a simple test plan to pick an appropriate threshold.
Which would you prefer?
Sources: Soniox STT plugin guide | LiveKit Documentation | Pipeline nodes and hooks | LiveKit Documentation