JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 15
  • Score
    100M100P100Q86252F
  • License MIT

Custom audio processor with DeepFilterNet3 noise filtering integrated with LiveKit client

Package Exports

  • deepfilternet3-worker-test

Readme

LiveKit DeepFilterNet3 Noise Filter

DeepFilterNet3-based noise suppression designed to plug into LiveKit’s TrackProcessor API.

Install

yarn add livekit-deepfilternet3-noise-filter

Peer dependency expected at runtime: livekit-client.

Quick start (LiveKit TrackProcessor)

import { DeepFilterNoiseFilter } from 'livekit-deepfilternet3-noise-filter';
import { Room, LocalAudioTrack } from 'livekit-client';

const room = new Room();
await room.connect('wss://your-livekit-server', '<token>');

const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const mic = stream.getAudioTracks()[0];
const localAudioTrack = await LocalAudioTrack.create(mic);

const processor = DeepFilterNoiseFilter({ enabled: true, sampleRate: 48000, frameSize: 480 });
await localAudioTrack.setProcessor(processor);
await room.localParticipant.publishTrack(localAudioTrack);

// Toggle bypass
await processor.setEnabled(false);
await processor.setEnabled(true);

// Adjust suppression level (0..100)
processor.setSuppressionLevel(75);

// Cleanup
await processor.destroy();

Browser requirements

SharedArrayBuffer requires:

  • Cross-Origin-Opener-Policy: same-origin
  • Cross-Origin-Embedder-Policy: require-corp

Our dev server sets these for test/sample.html.

Also exported (advanced)

  • DeepFilterNet3Processor: low-level control over Worker + AudioWorklet graph.
import { DeepFilterNet3Processor } from 'livekit-deepfilternet3-noise-filter';
const df3 = new DeepFilterNet3Processor({ sampleRate: 48000, frameSize: 480, enableNoiseReduction: true });
await df3.initialize();
const ac = new AudioContext({ sampleRate: 48000 });
const node = await df3.createAudioWorkletNode(ac);
df3.setNoiseSuppressionEnabled(true);
df3.setSuppressionLevel(60);
df3.destroy();

Build

yarn
yarn build

Outputs:

  • dist/index.esm.js, dist/index.js
  • dist/worker/worker.js (Dedicated Worker)
  • dist/worker/audio-processor.js (AudioWorklet)
  • dist/pkg/* (WASM glue + df_bg.wasm)
  • dist/deepfilternet3/DeepFilterNet3_onnx.tar.gz (model)

Model source

The included model archive DeepFilterNet3_onnx.tar.gz is downloaded from the DeepFilterNet project:

Please refer to the upstream repository for licensing and updates.

Building assets from source (contributors)

To regenerate the WASM package and copy resources from the upstream project:

git clone https://github.com/Rikorose/DeepFilterNet/
cd DeepFilterNet
bash scripts/build_wasm_package.sh

# Copy WASM glue into this repo's pkg/
cp -r libdf/pkg ../livekit-deepfilternet3-noise-filter/pkg

# Copy DF3 model archive into this repo's deepfilternet3/
cp models/DeepFilterNet3_onnx.tar.gz ../livekit-deepfilternet3-noise-filter/deepfilternet3/

cd ../livekit-deepfilternet3-noise-filter

Notes:

  • Ensure the destination paths match this repo's layout (pkg/ and deepfilternet3/).
  • After copying, run yarn build.

Local React example

A minimal Vite + React app is included under examples/react-app to verify the built package works in a browser with SharedArrayBuffer.

  1. Build the library so dist/ exists:
yarn build
  1. Install example deps (links local package automatically via file:../..):
yarn --cwd examples/react-app
  1. Run the example dev server (sets COOP/COEP headers):
yarn example:dev

Then open http://localhost:5173, grant mic permission, and you should hear processed audio. Use the Enable checkbox and Level slider to adjust suppression.

Optional:

yarn example:build
yarn example:preview