careful-tiger-18580
02/13/2026, 6:00 AMtall-airline-16756
02/13/2026, 6:01 AMtall-airline-16756
02/13/2026, 6:01 AMnoise_cancellation.BVC() on the participant/audio input that feeds your STT pipeline.
• For SIP/telephony (8 kHz) calls: use noise_cancellation.BVCTelephony() which is optimized for those audio rates.
• Make sure you use either BVC or standard Noise Cancellation (NC), not both.
• Disable any other endpoint or SIP-level noise cancellation (for example Krisp) so audio isn’t double-processed.
Example (Python):
from livekit.plugins import noise_cancellation
await session.start(
room_options=room_io.RoomOptions(
audio_input=room_io.AudioInputOptions(
noise_cancellation=noise_cancellation.BVC()
),
),
)
Why this helps
• BVC identifies and favors the primary speaker (typically the loudest/closest) and suppresses other human voices before audio is sent to STT. That prevents background conversations from being transcribed and should reduce interruptions to your agent.
If you’d like, tell me:
• Whether these are browser or SIP callers,
• Which STT provider you’re using,
• And where you apply LiveKit processing (client-side, server-side, or a bot/agent connector).
I can then give step-by-step code for your exact setup and any tuning tips.
Sources: Choosing the right noise cancellation for your agent | LiveKitcareful-tiger-18580
02/13/2026, 6:02 AMtall-airline-16756
02/13/2026, 6:03 AMBVC() and BVCTelephony()) run in the agent process via the LiveKit Agents SDK, so they work the same in self-hosted deployments as in LiveKit Cloud.
Key points and next steps
• Enable the plugin in your agent code using the livekit-plugins-noise-cancellation package (example: noise_cancellation.BVC() for WebRTC, noise_cancellation.BVCTelephony() for SIP/8kHz).
• Noise cancellation runs locally on the agent’s CPU, so ensure your agent host has sufficient CPU resources.
• Install the noise-cancellation plugin in the agent environment where processing occurs.
• Disable any other endpoint/SIP-level noise cancellation (for example, Krisp) to avoid double-processing.
• No special server-side configuration is required in the self-hosted LiveKit server; the filtering is applied by the agent before audio is sent to STT.
If you want, tell me:
• Whether your agents are handling browser WebRTC callers or SIP/telephony callers,
• Where the agent process runs (on-prem, cloud VM, container), and
• Which STT provider you use.
With that I can give a short, specific code snippet or resource sizing guidance for your environment.
Sources: Choosing the right noise cancellation for your agent | LiveKitcareful-tiger-18580
02/13/2026, 6:05 AMlivekit-plugins-noise-cancellation.
this is already enabled, but still agent is not able to ignore background voices.tall-airline-16756
02/13/2026, 6:05 AMlivekit-plugins-noise-cancellation with BVC but background voices are still getting through and being transcribed. Let’s troubleshoot this together and narrow down the root cause.
Quick checklist to confirm first
• Which participant type are you processing? (Browser/WebRTC or SIP/telephony)
• Which model are you actually using in your agent code: noise_cancellation.BVC() or noise_cancellation.BVCTelephony()?
• Where does the agent process run (on-prem VM, container, cloud VM) and does it have plenty of CPU available?
• Are there any other noise cancellation layers enabled (endpoint apps like Krisp, SIP trunk krisp_enabled, or host-level audio processing)?
• Is the STT receiving the processed audio (filtered) or the raw audio? Where in your pipeline do you apply the filter?
Immediate things to check and try
1. Confirm correct model for participant kind
◦ Use BVC() for full-bandwidth WebRTC callers and BVCTelephony() for narrowband 8kHz SIP calls. Using the wrong model reduces effectiveness.
1. Ensure no double-processing
◦ Disable any other noise suppression (Krisp, system-level filters, SIP-side NC). Double-processing can worsen results.
1. Verify filter placement in the pipeline
◦ Make sure the noise cancellation plugin is applied before audio is sent to your STT. If STT is receiving raw audio, BVC won’t help.
1. Resource check
◦ Noise cancellation runs locally on the agent’s CPU. If the agent host is resource-constrained, the model may underperform. Try running the agent on a machine with more CPU and see if suppression improves.
1. Test toggles to isolate behavior
◦ Compare three test runs and examine resulting audio/STT output:
1) No noise cancellation 2) BVC() (or BVCTelephony()) enabled 3) Any other NC (if previously active) enabled
• This helps determine if BVC is being applied and whether it helps or hurts.
1. Audio characteristics that limit suppression
◦ If the primary speaker is very quiet or distant compared to background talkers, aggressive suppression may either fail or remove parts of the primary voice. Confirm the primary speaker is typically the loudest/closest source.
If you can share any of the following, I can give exact next steps:
• A short description of your pipeline (where you instantiate the noise filter and where STT ingests audio).
• Which STT provider you use and whether you use speaker diarization at the STT level.
• Whether the callers are WebRTC or SIP, and an example of the agent code that sets up `room_io`/audio input.
If you prefer, paste a minimal snippet of how you apply noise_cancellation in your agent and I’ll review it for misconfiguration and suggest a precise fix.
Sources: Choosing the right noise cancellation for your agent | LiveKit | Speechmatics STT plugin guide | LiveKit Documentation | Troubleshooting STT not picking up utterances | LiveKit | Agent session | LiveKit Documentationcareful-tiger-18580
02/13/2026, 6:07 AMtall-airline-16756
02/13/2026, 6:07 AMnoise_cancellation.BVC() in room_io.AudioInputOptions, which is the correct place to apply agent-side filtering. Let’s walk through targeted checks and quick fixes to find why background voices are still reaching your STT.
What I’m responding to
• You enabled livekit-plugins-noise-cancellation.BVC() in the agent but STT still transcribes background human voices.
Immediate things to verify (quick checklist)
• Participant type: Are callers WebRTC (browser) or SIP? If SIP/telephony, use BVCTelephony() instead of BVC().
• Double-processing: Confirm no other NC is enabled:
◦ Any endpoint-level tools (Krisp or OS-level NC)?
◦ Any SIP trunk setting like krisp_enabled?
• Filter placement: Ensure the STT receives the processed audio. Confirm your STT ingest reads from the AgentSession audio path (session.stt) after session.start() applies the RoomOptions filter — not from a raw track copy or server-side egress that captures unfiltered audio.
• CPU & performance: Is the agent process CPU-starved? BVC runs locally; under-provisioned CPU can reduce effectiveness.
Code-specific notes and suggestions 1) Participant selection logic
• You have this block that subscribes only the first remote participant:
for p in list(ctx.room.remote_participants.values())[1] # Only first participant That subscribes only the first participant in the room object list — if callers or agents join in different orders this may not be the actual primary speaker. Make sure the participant you subscribe to is the one whose audio should go through BVC. Consider subscribing based on role/metadata or selecting the actively-speaking participant instead of list index.
2) Confirm BVC is applied to the same audio path used by STT
• You set:
room_options=room_io.RoomOptions( audio_input=room_io.AudioInputOptions( noise_cancellation=noise_cancellation.BVC(), ), ) This is correct when the AgentSession STT pulls audio from `session`’s audio input pipeline. Verify your build_local_stt() / build_cloud_stt() implementations consume the AgentSession audio stream (not a raw egress file or a different track). If STT is reading the room composite egress or an unfiltered track, it will get raw audio.
3) Egress vs live STT path
• You start a room composite egress to record to S3/OGG. Egress captures the server-side mixed audio and may not include agent-applied filtering. Confirm whether STT is using live agent audio or the egress file:
◦ If STT uses the egress recording, that may be unfiltered. Try pointing STT to the AgentSession audio directly (live) or ensure egress uses the filtered stream.
4) Use BVCTelephony for 8kHz SIP calls
• If callers are PSTN/SIP (8 kHz), switch to noise_cancellation.BVCTelephony() dynamically:
filter = noise_cancellation.BVCTelephony() if participant.kind == rtc.ParticipantKind.PARTICIPANT_KIND_SIP else noise_cancellation.BVC()
5) Debugging steps to confirm behavior
• Log whether filter is active at session start:
◦ After await session.start(...), add a debug log indicating which noise filter instance is in use.
• Capture and inspect a short processed audio sample that is fed to STT:
◦ Write out a 10–15s clip from the agent pipeline (post-filter) and from the raw track, and compare audibly or with a spectrogram to confirm background voices are suppressed in the processed clip.
• Run isolation tests:
a. No NC (remove noise_cancellation), record STT output.
b. BVC() enabled, record STT output.
c. BVCTelephony() if SIP, record STT output.
Compare transcripts to confirm which stage is most effective.
6) VAD and interruption settings
• You use turn_detection="vad" and a Silero VAD instance. If VAD thresholds are too aggressive or permissive, it may mark background speech as valid turns. Try adjusting VAD activation thresholds or min speech duration to better detect the primary voice versus background chatter.
7) Resource sizing
• If your agent runs in a constrained container or VM, try launching it on a beefier machine temporarily to check if suppression quality improves.
If you’re willing, please share one of the following so I can give exact code-level fixes:
• Is the incoming audio WebRTC or SIP?
• The build_local_stt() / build_cloud_stt() function (the part that connects STT to session audio).
• Whether STT is fed live from AgentSession or from the egress/recording file.
If you paste the STT connection snippet I’ll:
• Verify the audio path is post-BVC,
• Suggest an updated minimal code sample to ensure STT reads the filtered audio,
• And provide a short test snippet to produce a post-filter WAV so you can confirm suppression locally.careful-tiger-18580
02/13/2026, 6:15 AMtall-airline-16756
02/13/2026, 6:15 AMBVC() is enabled, but background voices still reach your live STT (OpenAI). For SIP you should use the telephony-optimized model, confirm the filter is on the STT audio path, and rule out other causes.
Actionable fixes and checks (in order)
1) Use BVCTelephony for SIP
• Change the noise cancellation to BVCTelephony() for SIP participants. Replace your current static BVC() with telephony-aware selection when starting the session:
# if all incoming are SIP, use BVCTelephony()
room_options=room_io.RoomOptions(
audio_input=room_io.AudioInputOptions(
noise_cancellation=noise_cancellation.BVCTelephony(),
),
)
• If a mix of SIP and WebRTC exists, detect participant kind and choose the filter per participant (or per session) dynamically.
2) Confirm STT is receiving the post-filter audio
• You said STT is fed live from AgentSession — ensure the agent’s audio input pipeline (the RoomOptions you set when calling session.start(...)) is the same pipeline your STT implementation consumes.
• Verify build_cloud_stt() reads from the AgentSession audio (it should, since you pass stt=stt_engine into AgentSession). If you’ve modified STT wiring, confirm no alternate path (egress, raw track) is used.
3) Ensure no double-processing (disable other NC)
• Make sure SIP trunks, endpoints, or OS-level tools (Krisp) are not applying noise suppression. Double-processing can reduce BVC effectiveness.
4) Check agent CPU and performance
• BVCTelephony runs locally in the agent process. If the agent host is CPU constrained, suppression can underperform. Try running the agent on a machine with more CPU to see if suppression quality improves.
5) Confirm subscription to the correct participant
• Your code subscribes to only the first remote participant in room list:
for p in list(ctx.room.remote_participants.values())[1]
• The SIP caller you expect may not be the first in that list. Ensure you subscribe to the actual SIP participant (match by metadata or participant identity) or subscribe to all audio and apply filtering to the agent input path you expect.
6) VAD / interruption settings
• You use Silero VAD. If VAD thresholds consider background speech valid, STT may still be triggered. Try tuning Silero VAD activation_threshold / min_speech_duration to be stricter so background chatter isn’t treated as a speech turn.
7) Debugging tests to isolate the problem
• Short A/B transcript test:
1) Run with no NC and record STT results. 2) Run with BVCTelephony() and record STT results. 3) If available, run with endpoint NC enabled (only to compare). Compare transcripts to confirm which reduces background transcriptions.
• Capture post-filter audio sample:
◦ Temporarily write a 10–15 second WAV from the AgentSession audio pipeline (post-filter) and compare it against the raw track/egress file. This proves what STT actually hears.
• Log filter use at startup:
◦ After await session.start(...), log which noise_cancellation class instance you passed so you know BVCTelephony is active.
Suggested minimal edits (example)
• Replace your session start block with telephony filter:
await session.start(
agent=Assistant(system_prompt=SYSTEM_PROMPT),
room=ctx.room,
room_options=room_io.RoomOptions(
audio_input=room_io.AudioInputOptions(
noise_cancellation=noise_cancellation.BVCTelephony(),
),
)
)
<http://logger.info|logger.info>("Started session with BVCTelephony noise cancellation")
If you want, next I can:
• Review your build_local_stt() if you also use a local STT path, or
• Provide a short snippet to record a post-filter WAV from the AgentSession pipeline so you can listen/inspect what STT receives.
Tell me which you prefer and paste (if possible) the participant metadata or how SIP participants are identified in your environment — I can then suggest a robust participant selection approach so you always apply BVCTelephony to actual SIP callers.