Skip to main content

Murf BVC for LiveKit Agents

Background voice cancellation for voice agents. Murf BVC keeps the person talking to your agent and removes everyone and everything else (TV, other people in the room, street and office noise) before your agent's VAD, turn detection and speech-to-text see the audio. Fewer false interruptions, fewer transcripts of someone else's words.

It runs on CPU inside your agent process, like LiveKit's own noise-cancellation plugin. No GPU, no network calls, no extra services.

Requirements

  • Python 3.10+ and livekit-agents 1.2+
  • Linux (glibc 2.28+: Ubuntu 20.04+, Debian 10+, RHEL/Rocky/Alma 8+, Amazon Linux 2023) on x86_64 or aarch64, or macOS 11+ (Apple Silicon) / 10.15+ (Intel)
  • x86_64 CPUs need AVX2 and FMA (Intel Haswell / 2013 or newer, any AMD Zen); on ARM, AWS Graviton2 or newer, or any Apple Silicon Mac
  • A Murf BVC license key (contact Murf)

Install

pip install livekit-plugins-murf-bvc

Quick start

  1. Set your license key where the agent runs:

    export MURF_BVC_LICENSE="mbvc1...."
    
  2. Pass murf_bvc.BVC() as the noise cancellation for the room's audio input:

    from livekit.agents import Agent, AgentSession, JobContext, WorkerOptions, cli, room_io
    from livekit.plugins import murf_bvc
    
    
    async def entrypoint(ctx: JobContext):
        session = AgentSession(...)  # your STT, LLM, TTS, VAD, turn detection
    
        await session.start(
            room=ctx.room,
            agent=Agent(instructions="You are a helpful assistant."),
            room_options=room_io.RoomOptions(
                audio_input=room_io.AudioInputOptions(noise_cancellation=murf_bvc.BVC()),
            ),
        )
    
    
    if __name__ == "__main__":
        cli.run_app(WorkerOptions(entrypoint_fnc=entrypoint))
    

That's all most agents need. The defaults are what we recommend for production.

Options: when to change them

murf_bvc.BVC(restore=True, normalize=True, license_key=None, native=True)
Option Default Change it when
license_key read from MURF_BVC_LICENSE You load secrets in code (from a secrets manager, say) rather than the environment.
restore True Leave on. While only the caller is talking, it gives back anything the model removed, so the caller's own voice is never thinned and STT accuracy holds up on clean calls. It runs a speaker check every 0.5 s of speech. Set False only if you'd rather have maximum removal at all times, or need to save that bit of CPU.
normalize True Leave on. It levels quiet and loud callers before the model so both get the same quality. There is no production reason to turn it off.
native True Leave on. It runs BVC inside LiveKit's audio pipeline. It falls back to a Python processor on its own if your livekit version predates audio-filter plugins, so you only set False when debugging.

Rooms with several participants

Nothing to change: one BVC() value serves every participant, each with its own independent state.

If you use native=False (or BVCProcessor directly), each processor handles one track, so pass a selector instead:

noise_cancellation=lambda params: murf_bvc.BVC(native=False)

What to expect

  • Latency: 10 ms at 16 kHz, about 13.6 ms at 24 or 48 kHz (resampling included).
  • CPU: about 3% of one core per active participant on an AWS AMD EPYC instance, plus a speaker check every 0.5 s of speech while caller restore is on. Processing is single-threaded per stream, so it scales with the number of concurrent calls.
  • Audio: any sample rate LiveKit delivers (8–96 kHz); stereo input is mixed to mono.

License behaviour

The license is checked offline (signature and expiry), once per process. Without a valid license BVC does not stop your agent: it logs an error and passes audio through unchanged, delayed by the same few milliseconds, so calls keep working and a license expiring mid-call never knocks audio out of sync.

Check it at startup:

murf_bvc.set_license(key)   # raises ValueError with the reason if the key is invalid
assert murf_bvc.licensed()

Troubleshooting

You see Meaning
murf_bvc: no license ...; audio passes through unprocessed MURF_BVC_LICENSE isn't set in the agent's environment and no license_key was passed.
murf_bvc: license for '...' has expired Renew the key with Murf.
this license does not carry a model key; reissue it An older-format key; ask Murf for a reissued one.
Illegal instruction when the agent starts The CPU lacks AVX2/FMA (very old x86, or some emulated/virtualized CPUs). Use a newer instance type.
pip finds no matching distribution Python older than 3.10, an unsupported platform, or glibc older than 2.28.

Metadata

Release files for livekit-plugins-murf-bvc 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for livekit-plugins-murf-bvc 0.1.1
File Actions
livekit_plugins_murf_bvc-0.1.1-py3-none-manylinux_2_28_x86_64.whl Python 3 none Linux glibc 2.28+ x86-64 Details for livekit_plugins_murf_bvc-0.1.1-py3-none-manylinux_2_28_x86_64.whl
livekit_plugins_murf_bvc-0.1.1-py3-none-manylinux_2_28_aarch64.whl Python 3 none Linux glibc 2.28+ ARM64 Details for livekit_plugins_murf_bvc-0.1.1-py3-none-manylinux_2_28_aarch64.whl
livekit_plugins_murf_bvc-0.1.1-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details for livekit_plugins_murf_bvc-0.1.1-py3-none-macosx_11_0_arm64.whl
livekit_plugins_murf_bvc-0.1.1-py3-none-macosx_10_15_x86_64.whl Python 3 none macOS 10.15+ x86-64 Details for livekit_plugins_murf_bvc-0.1.1-py3-none-macosx_10_15_x86_64.whl

Total release size: 157.1 MB

Release files / livekit_plugins_murf_bvc-0.1.1-py3-none-manylinux_2_28_x86_64.whl

Download URL livekit_plugins_murf_bvc-0.1.1-py3-none-manylinux_2_28_x86_64.whl
Size 39.2 MB
Tags Linux glibc 2.28+ x86-64 Python 3
SHA-256 checksum
How to use checksums
b36eaa4698ba5132cad57c104b93d8e485c3c17701d640d2647b5c216a73384c
BLAKE2b-256 checksum
How to use checksums
2d691d396cbaaeccbafdc394124ee3f5b779bfb7c4de20be6a7a276f83ea310c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.

Transparency log

Release files / livekit_plugins_murf_bvc-0.1.1-py3-none-manylinux_2_28_aarch64.whl

Download URL livekit_plugins_murf_bvc-0.1.1-py3-none-manylinux_2_28_aarch64.whl
Size 39.2 MB
Tags Linux glibc 2.28+ ARM64 Python 3
SHA-256 checksum
How to use checksums
a8a06af369222747caeaff351d73f29349c98b768000fa6c0d890db4bf5153be
BLAKE2b-256 checksum
How to use checksums
7d727450e10f301d445e1c69a3f349248825fafd84a171fffb4e806e073c2bdb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.

Transparency log

Release files / livekit_plugins_murf_bvc-0.1.1-py3-none-macosx_11_0_arm64.whl

Download URL livekit_plugins_murf_bvc-0.1.1-py3-none-macosx_11_0_arm64.whl
Size 39.5 MB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
80b802a484104546096b2eeeba81043ee311c3c42f3d364d67fd0df737539235
BLAKE2b-256 checksum
How to use checksums
1ae9e30d40daa8fbfec52c55ad2cfe911406d5605d8a3dc44829eba0829b8851
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.

Transparency log

Release files / livekit_plugins_murf_bvc-0.1.1-py3-none-macosx_10_15_x86_64.whl

Download URL livekit_plugins_murf_bvc-0.1.1-py3-none-macosx_10_15_x86_64.whl
Size 39.2 MB
Tags Python 3 macOS 10.15+ x86-64
SHA-256 checksum
How to use checksums
6ae4093be907fd5c272d4d317b591c549b56f1216b39f7e136cb548ff54bd2c2
BLAKE2b-256 checksum
How to use checksums
6f6e34670d961dba78fdee4921e6b19a6a5a95970db58ad69c68cc59d975b9ea
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.

Transparency log

Security for livekit-plugins-murf-bvc 0.1.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 4 files in this release have been uploaded with provenance metadata.

Select from 4 files

Attestation for livekit_plugins_murf_bvc-0.1.1-py3-none-manylinux_2_28_x86_64.whl

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page