careful-tiger-18580
02/13/2026, 7:30 AMtall-airline-16756
02/13/2026, 7:30 AMtall-airline-16756
02/13/2026, 7:30 AMnoise_cancellation.BVCTelephony() for SIP/telephony audio. BVCTelephony is optimized for narrowband/8kHz telephony and will filter background speakers better than the generic `BVC()`:
◦ Set it in your RoomOptions/audio input before you call session.start() so audio arriving from Exotel gets processed by the correct filter.
1. Avoid double noise processing
◦ Do not enable both trunk-level noise (e.g., krisp_enabled on SIP trunk) and agent-side BVC simultaneously. Use one layer only (prefer agent-side BVCTelephony for more control). Double-processing can distort speech and increase transcription errors.
1. Tune endpointing/VAD/interruption thresholds
◦ Increase thresholds so the agent doesn’t treat short bursts or background voices as an interruption. For example:
▪︎ min_interruption_duration — require longer speech (e.g., 0.6–0.8s) to count as an interruption.
▪︎ min_interruption_words — require at least 1–2 words to trigger an interruption.
▪︎ false_interruption_timeout — increase (e.g., 1.0–1.5s) to avoid resuming too quickly after noise.
◦ These parameters reduce false positives for brief background talk.
1. Confirm participant kind and sample rate
◦ Log the participant kind to confirm the incoming track is SIP. If it’s SIP, ensure your logic picks BVCTelephony based on that:
▪︎ participant.kind or other room metadata should show SIP.
◦ If Exotel is sending 8kHz audio, prefer BVCTelephony; converting or resampling can reduce performance.
1. Validate STT pipeline and avoid manual audio distortion
◦ Ensure your STT engine (build_cloud_stt/build_local_stt) expects the post-noise-cancelled stream and is not receiving extra gain/preprocessing that could amplify background voices.
◦ If you perform any manual gain/filters before STT, try disabling them to verify they aren’t worsening the problem.
1. Testing steps
◦ Run a focused test where you:
i. Enable BVCTelephony in the session.
ii. Disable any trunk-level noise-cancel features.
iii. Increase interruption thresholds as above.
iv. Make a few Exotel calls with background voices present and check both agent interruption behavior and STT transcripts.
◦ Enable debug logs for LiveKit and the noise_cancellation plugin to verify the filter is active.
Small code pointers (where to change)
• In your `entry`/`session.start()` flow, set noise cancellation in room_io.RoomOptions audio input (don’t leave it commented):
room_options=room_io.RoomOptions(
audio_input=room_io.AudioInputOptions(
audio_sample_rate=16000,
noise_cancellation=noise_cancellation.BVCTelephony(),
),
room_output_options=room_io.RoomOutputOptions(transcription_enabled=True),
)
• Tune AgentSession parameters where you create `session = AgentSession(...)`:
session = AgentSession(
stt=stt_engine,
llm=llm_engine,
tts=tts_engine,
max_endpointing_delay=0.2,
min_interruption_duration=0.8,
min_interruption_words=1,
false_interruption_timeout=1.5,
resume_false_interruption=True,
vad=ctx.proc.userdata["vad"],
preemptive_generation=True,
)
If these changes don’t reduce interruptions
• Tell me:
◦ The exact noise cancellation configuration you applied (code snippet).
◦ Whether your SIP trunk has any provider-side noise filter enabled (krisp or similar).
◦ A short sample: are the background voices always from another human participant (agent on the line) or sometimes from recorded IVR prompts/hold music?
I’ll then suggest next steps (e.g., deeper VAD tuning, adjusting STT settings, or a small repro setup to inspect audio streams). If you want, paste the minimal snippet where you set RoomOptions and create the AgentSession and I’ll review it for any missed settings.
Sources: Choosing the right noise cancellation for your agent | LiveKit | Turns overview | LiveKit Documentation | VAD and turn detection configuration guide | LiveKit | Troubleshooting STT not picking up utterances | LiveKit | Interrupt User | LiveKit Documentationcareful-tiger-18580
02/13/2026, 7:56 AMtall-airline-16756
02/13/2026, 7:57 AMBVCTelephony() and confirmed no trunk-level filtering, but the agent is still getting interrupted by other human participants’ audio. That strongly points to the agent subscribing to multiple participant tracks (so noise filtering inside a single track can’t stop the agent from hearing other people).
What I recommend next (short, actionable)
1) Restrict the agent to a single participant (prevent subscribing to other people)
• Use RoomIO (or the participant option when creating RoomIO/RoomOptions) so the agent only subscribes to the intended caller’s audio track. This prevents the agent from receiving any other participant’s audio entirely.
• Example snippet (where you create your session/room I/O):
# identify the intended participant identity (e.g., caller identity)
participant_identity = "caller-123" # replace with actual identity
room_io = room_io.RoomIO(
session=session,
room=ctx.room,
participant=participant_identity,
)
await room_io.start()
await session.start(agent=Assistant(system_prompt=SYSTEM_PROMPT))
Why: BVCTelephony filters inside a single participant’s stream; it cannot stop the agent from receiving separate tracks belonging to other participants.
2) Confirm and log which participants the agent is subscribed to
• Add runtime logs to ensure the agent isn’t subscribed to extra participants or duplicate joins:
for p in ctx.room.remote_participants.values():
<http://logger.info|logger.info>(f"remote participant: identity={p.identity} kind={p.kind} subscribed_tracks={list(p.track_publications.keys())}")
• Also log when the agent starts processing audio from a participant:
@session.on("user_speaking")
def on_user_speaking(participant):
<http://logger.info|logger.info>(f"user speaking: {participant.identity}")
Why: This shows which identity is actually triggering the session and whether the agent is hearing unexpected participants.
3) Ensure no duplicate joins / multiple devices
• Verify callers/agents aren’t joining the same LiveKit room from phone + web (or call-forward). If the same user is joined twice, the agent will receive both audio tracks and might transcribe both.
4) Keep BVCTelephony enabled (good) and avoid trunk-side filters simultaneously
• You already have BVCTelephony referenced — ensure it is actively set in the RoomOptions audio input (not just imported/commented). Since your trunk has no filtering, keep BVCTelephony active and let it handle per-stream noise.
5) If you must allow multiple participants, treat them as separate inputs
• If your workflow requires other participants in the room (e.g., supervisor, agent), then:
◦ Only subscribe to the caller’s audio for STT/agent processing; keep other participants unsubscribed for the agent.
◦ Or implement per-participant routing: only route the caller’s track into the AgentSession/STT pipeline.
Diagnostic information I need if this persists
• Paste the minimal snippet where you set up RoomOptions/RoomIO and start the session (the exact lines where you set noise_cancellation and participant selection).
• A list of ctx.room.remote_participants printed at runtime (the logging snippet above).
• Whether callers sometimes join via multiple devices (phone + web) or call transfers happen (that can create multiple tracks).
If you share those three items I’ll:
• Confirm if RoomIO is being used correctly or if the agent is inadvertently auto-subscribing to all tracks.
• Suggest the exact code changes to force single-participant audio and, if needed, a short test plan to validate the fix.
Would you like me to review the RoomOptions/RoomIO snippet next?
Sources: How to set a fixed participant for agent audio processing | LiveKit | How to Test Your Agent Using Another Agent | LiveKit | Agents Framework | livekit/livekit_composite | DeepWikicareful-tiger-18580
02/13/2026, 8:00 AMtall-airline-16756
02/13/2026, 8:01 AMBVC() instead of `BVCTelephony()`:
▪︎ Use BVCTelephony() only when the incoming audio is truly narrowband 8 kHz SIP on the server side.
• Increase VAD selectivity so short/low-confidence speech is ignored:
◦ activation_threshold → 0.6–0.8
◦ min_speech_duration → 0.2–0.3 s
◦ min_silence_duration → 0.8–1.5 s
• Raise interruption requirements:
◦ min_interruption_duration → ~0.6–0.8 s
◦ min_interruption_words → 1–2
◦ false_interruption_timeout → 1.0–1.5 s
• Temporarily disable automatic interruptions while the agent speaks:
◦ Use allow_interruptions=False during agent TTS output or when the agent is mid-turn to avoid reacting to ambient speech.
Why these help (short)
• BVC is better for device/close-mic audio; BVCTelephony is tuned for narrowband SIP streams. Using the right model increases separation quality.
• Tightening VAD and interruption thresholds reduces false triggers from brief background mutter or overlapping low-volume speech.
• Disabling interruptions during agent speech prevents the agent from flipping state due to short bursts nearby.
Hardware / environment suggestions (important)
• Use a close-talk headset or directional mic — physical isolation is often the single most effective fix for co-located human voices.
• If available, enable hardware-level beamforming/noise-suppression (e.g., NVIDIA Broadcast/RTX Voice) rather than stacking software filters.
• Reduce competing sound sources (move others away, close doors) where possible.
Diagnostic info I need if this continues Please share these minimal items so I can give a precise tweak:
1. The exact RoomOptions / noise_cancellation lines you set (paste 6–12 lines).
2. Whether the microphone is built-in or an external headset.
3. A short excerpt of logs showing an interruption event and the transcript the STT produced (timestamps if possible).
If you prefer, paste the RoomOptions + AgentSession snippet you use to create session and start the agent — I’ll point out the smallest change to test first.
Sources: Choosing the right noise cancellation for your agent | LiveKit | Voice AI quickstart | LiveKit Documentation | Google AI and LiveKit | LiveKit Documentation | Agents Framework | livekit/livekit_composite | DeepWiki | examples/voice_agents | livekit/livekit_composite | DeepWikicareful-tiger-18580
02/13/2026, 10:25 AMallow_interruptions=False during agent TTS output or when the agent is mid-turn to avoid reacting to ambient speech.
where to allow this?tall-airline-16756
02/13/2026, 10:25 AMallow_interruptions=False when you create the AgentSession. The agent will not be interrupted for the entire session.
session = AgentSession(
stt=stt_engine,
llm=llm_engine,
tts=tts_engine,
vad=ctx.proc.userdata["vad"],
preemptive_generation=True,
allow_interruptions=False, # disable interruptions globally
min_interruption_duration=0.8,
false_interruption_timeout=1.5,
)
2) Disable interruptions only while the agent is speaking (recommended) Keep interruptions enabled generally, but temporarily turn them off while you generate/play TTS. Use the per-call option on the `say`/`generate_reply` or control the agent’s speaking handle. The API may expose an allow_interruptions argument when starting a speak action — set it False there, then restore behavior afterward.
Example pattern (pseudocode showing the idea):
# allow normal interruptions by default
session = AgentSession(..., allow_interruptions=True, ...)
# when agent is about to speak:
speak_handle = await session.say("I will explain now...", allow_interruptions=False)
# `allow_interruptions=False` keeps the agent's TTS output from being interrupted by ambient speech
# optionally await completion
await speak_handle.wait_done()
# after done, session resumes normal interruptible behavior
If your SDK version does not accept allow_interruptions on say, use these alternatives:
• Temporarily set session.allow_interruptions = False right before say() and set it back to True after the TTS completes.
• Use generate_reply(allow_interruptions=False) if your agent uses that method to produce spoken replies.
Where to add this in your code
• Put per-turn allow_interruptions=False in the same place you call session.say(...) or session.generate_reply(...) inside your entry function or in the Agent’s on_enter / reply flow. That ensures the agent is protected from background noise while it’s speaking.
If you want, paste the snippet where you call session.say(...) or where AgentSession is created, and I’ll show the exact line to add in your script.careful-tiger-18580
02/13/2026, 11:13 AMtall-airline-16756
02/13/2026, 11:13 AMBVC() may perform better than BVCTelephony().
room_output_options=RoomOutputOptions(transcription_enabled=True)
• What it is: Enables LiveKit to produce live transcription output (text) tied to the room’s audio. Transcriptions are published to the room’s text stream (e.g., lk.transcription).
• Why it matters: When enabled, STT results are emitted and can be used by your agent logic and logs. This is how you see what the engine detected from audio in real time.
• How it helps you: It gives you visibility into what’s being transcribed (so you can confirm whether background voices are being transcribed and tune VAD/filters accordingly). If background speech is still appearing in these transcriptions, it indicates the audio pipeline is feeding that speech to STT (either because the mic captured it, or the agent is subscribed to an extra track).
Putting them together — how to use these intentionally
• Match audio_sample_rate to the actual audio you receive or resample accordingly (8 kHz SIP vs. 16 kHz device mic). Mismatches can harm VAD and STT.
• Use BVCTelephony() when your input is genuinely narrowband SIP (8 kHz). Use BVC() for device/local full-bandwidth audio. Don’t double-apply noise cancellation (no trunk-side Krisp + agent-side BVC).
• Keep transcription_enabled=True while debugging so you can see exactly what the STT is picking up; use those transcripts to decide whether to change VAD thresholds, mic hardware, or which noise filter to use.
Practical checklist to reduce background human voices being transcribed
• Confirm the actual incoming sample rate (8 kHz vs 16 kHz) and set or resample to match.
• If the mic is local and captures multiple co-located people, try `BVC()`; if the audio is server-side SIP/narrowband, use BVCTelephony().
• Disable other noise-processing layers (trunk-side Krisp, client-side filters) while testing.
• Increase VAD/interruption thresholds (activation threshold, min_speech_duration, min_silence_duration, min_interruption_duration) so short background speech is ignored.
• Use a close-talk headset or hardware beamforming if possible — physical isolation often gives the biggest improvement.
If you want, paste the exact RoomOptions block you currently pass in (the few lines where you set sample rate, noise_cancellation, and room_output_options). I’ll recommend the minimal change (switch to BVC vs BVCTelephony, adjust sample rate, or turn on transcription) to test next.
Sources: Silero VAD plugin | LiveKit Documentation | Speechify TTS plugin guide | LiveKit Documentation | Live Conversations with AI using ChatGPT and WebRTC | Rime TTS plugin guide | LiveKit Documentation | Troubleshooting STT not picking up utterances | LiveKit