Skip to main content
Field Guides

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)

ModelWhat 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 typeModel to use
WebRTCBVC()
SIP/TelephonyBVCTelephony()

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 rtc
from 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

Find more Agents guides