import assert from "node:assert/strict"; import { test } from "node:test"; import { VoiceActivityDetector } from "../../src/voice_assistant/audio_gateway/web/vad.js"; test("detects speech start after minimum duration", () => { let starts = 0; const vad = new VoiceActivityDetector({ minSpeechMs: 250, onSpeechStart: () => starts++, }); vad.start(); vad.process(0.04, 0); vad.process(0.04, 100); assert.equal(starts, 0); vad.process(0.04, 260); assert.equal(starts, 1); }); test("detects speech end after silence", () => { let ends = 0; const vad = new VoiceActivityDetector({ minSpeechMs: 100, silenceMs: 800, onSpeechEnd: () => ends++, }); vad.start(); vad.process(0.04, 0); vad.process(0.04, 120); vad.process(0.04, 300); vad.process(0.001, 600); vad.process(0.001, 1000); assert.equal(ends, 0); vad.process(0.001, 1101); assert.equal(ends, 1); }); test("ignores short noise spikes", () => { let starts = 0; const vad = new VoiceActivityDetector({ minSpeechMs: 250, onSpeechStart: () => starts++, }); vad.start(); vad.process(0.05, 0); vad.process(0.001, 80); vad.process(0.001, 300); assert.equal(starts, 0); }); test("stop disables detection", () => { let starts = 0; const vad = new VoiceActivityDetector({ minSpeechMs: 100, onSpeechStart: () => starts++, }); vad.start(); vad.stop(); vad.process(0.05, 0); vad.process(0.05, 200); assert.equal(starts, 0); });