@tensamin/audio
v0.2.6
Published
DeepFilterNet3-based noise suppression and realtime speaking detection for LiveKit.
Readme
@tensamin/audio
DeepFilterNet3-based noise suppression and realtime speaking detection for LiveKit.
Features
- DeepFilterNet3 WASM noise suppression
- Realtime
speakingboolean + dB level - Automatic mute/unmute for LiveKit tracks
- Simple min/max dB speaking thresholds
Noise suppression is provided via the
deepfilternet3-noise-filterpackage. That package is based on DeepFilterNet by Rikorose.
Installation
npm install @tensamin/audio livekit-clientQuick Start (LiveKit)
import { LocalAudioTrack } from "livekit-client";
import { attachSpeakingDetectionToTrack } from "@tensamin/audio";
const localTrack = await LocalAudioTrack.create();
const controller = await attachSpeakingDetectionToTrack(localTrack, {
speaking: {
minDb: -60,
maxDb: -20,
},
noiseSuppression: {
enabled: true,
},
muteWhenSilent: true,
});
controller.onChange((state) => {
console.log("speaking", state.speaking);
console.log("levelDb", state.levelDb);
});
await room.localParticipant.publishTrack(localTrack);Configuration
All options are passed via LivekitSpeakingOptions to attachSpeakingDetectionToTrack.
Noise suppression (DeepFilterNet3)
noiseSuppression: {
enabled?: boolean; // default: true
noiseReductionLevel?: number; // 0-100, default: 60
assetConfig?: {
cdnUrl?: string;
};
}Speaking detection (dB-based)
speaking: {
minDb: number; // e.g. -60
maxDb: number; // e.g. -20
speakOnRatio?: number; // default: 0.6
speakOffRatio?: number; // default: 0.3
hangoverMs?: number; // default: 350
attackMs?: number; // default: 50
releaseMs?: number; // default: 120
}minDb / maxDb define the dynamic range used for level normalization. speakOnRatio and speakOffRatio (0–1) control when speech starts/stops within that range.
Output gain control
output: {
speechGain?: number; // default: 1.0
silenceGain?: number; // default: 0.0
gainRampTime?: number; // default: 0.015 (s)
maxGainDb?: number; // default: 6.0
smoothTransitions?: boolean;// default: true
}
``+
### LiveKit mute handling
```ts
muteWhenSilent?: boolean; // default: falseWhen muteWhenSilent is true, the library automatically calls track.mute() when silence is detected and track.unmute() when speech resumes (only if it muted the track itself).
