Choosing the right noise cancellation for your agent
Learn the difference between NC and BVC, and how to select the right noise cancellation model based on your participant type.
Last Updated:
LiveKit offers multiple noise cancellation models for agents. This guide explains when to use each.
NC (Noise Cancellation) vs BVC (Background Voice Cancellation)
| Model | What it removes |
|---|---|
NC() | Background noise (typing, traffic, HVAC) |
BVC() | Background noise + non-primary speakers |
For voice AI, use BVC. Standard NC still lets background conversations through. Your STT transcribes everyone, confusing your agent. BVC filters out non-primary speakers so only your user's voice reaches the STT.
Consider a user calling from a busy coffee shop. With NC, your agent hears the barista calling out orders. With BVC, only the user's voice comes through.
See the Enhanced noise cancellation docs for audio samples comparing the models.
Choose one, not both
Use either NC or BVC in your agent, not both. If using agent-side noise cancellation, disable krisp_enabled on your SIP trunk and frontend to avoid double-processing.
Why this matters: Noise cancellation models are trained on raw audio. When audio passes through multiple noise cancellation stages, the second stage receives pre-processed audio instead of raw audio. This can cause worse STT accuracy, filtered speech, and missing first words.
Performance and cost considerations
Noise cancellation runs on your agent's CPU and adds minimal latency (typically less than 10ms). The processing happens locally before audio reaches your STT provider, so there's no additional API cost for the noise cancellation itself.
However, cleaner audio can indirectly reduce costs: STT providers charge per audio duration, and BVC's ability to filter out background speakers can reduce unnecessary transcription of non-user speech. The primary tradeoff is CPU usage on your agent infrastructure.
Match the model to your participant
| Participant type | Model to use |
|---|---|
| WebRTC | BVC() |
| SIP/Telephony | BVCTelephony() |
BVCTelephony() is optimized for narrower-band telephony audio (8kHz sample rate typical of phone calls). Use it for SIP participants. Using BVC() for telephony audio may produce suboptimal results since it expects full-bandwidth WebRTC audio.
Dynamic selection (Python)
from livekit import rtcfrom livekit.plugins import noise_cancellation
participant = await ctx.wait_for_participant()
filter = ( noise_cancellation.BVCTelephony() if participant.kind == rtc.ParticipantKind.PARTICIPANT_KIND_SIP else noise_cancellation.BVC())
await session.start( room_options=room_io.RoomOptions( audio_input=room_io.AudioInputOptions(noise_cancellation=filter), ),)
Dynamic selection (Node.js)
import { BackgroundVoiceCancellation, TelephonyBackgroundVoiceCancellation } from '@livekit/noise-cancellation-node';
const participant = await ctx.waitForParticipant();
const filter = participant.kind === ParticipantKind.SIP ? TelephonyBackgroundVoiceCancellation() : BackgroundVoiceCancellation();
await session.start({ inputOptions: { noiseCancellation: filter, },});
Read related documentation
- Enhanced noise cancellation - Full guide with audio samples comparing NC and BVC
- LiveKit Agents overview - Get started with voice AI agents
- Telephony overview - Connect agents to phone calls via SIP
Find more Agents guides
- Troubleshooting STT not picking up utterances - Diagnose speech detection issues
- How to detect when an agent has finished speaking - Track playback completion events