web-vad
Version:
Web Voice Activity Detection (VAD)
3 lines (2 loc) • 1.75 kB
JavaScript
var e,t;(t=e||(e={})).AudioFrame="AUDIO_FRAME",t.SpeechStart="SPEECH_START",t.VADMisfire="VAD_MISFIRE",t.SpeechEnd="SPEECH_END",t.SpeechStop="SPEECH_STOP";class s{options;inputBuffer;constructor(e){this.options=e,this.process=e=>{let t=[];for(let s of e)for(this.inputBuffer.push(s);this.hasEnoughDataForFrame();){let e=this.generateOutputFrame();t.push(e)}return t},e.nativeSampleRate<16e3&&console.error("nativeSampleRate is too low. Should have 16000 = targetSampleRate <= nativeSampleRate"),this.inputBuffer=[]}process;hasEnoughDataForFrame(){return this.inputBuffer.length*this.options.targetSampleRate/this.options.nativeSampleRate>=this.options.targetFrameSize}generateOutputFrame(){let e=new Float32Array(this.options.targetFrameSize),t=0,s=0;for(;t<this.options.targetFrameSize;){let i=0,r=0;for(;s<Math.min(this.inputBuffer.length,(t+1)*this.options.nativeSampleRate/this.options.targetSampleRate);){let e=this.inputBuffer[s];void 0!==e&&(i+=e,r++),s++}e[t]=i/r,t++}return this.inputBuffer=this.inputBuffer.slice(s),e}}class i extends AudioWorkletProcessor{resampler=null;_initialized=!1;_stopProcessing=!1;options;constructor(t){super(),this.options=t.processorOptions,this.port.onmessage=t=>{t.data.message===e.SpeechStop&&(this._stopProcessing=!0)},this.init()}init=async()=>{this.resampler=new s({nativeSampleRate:sampleRate,targetSampleRate:16e3,targetFrameSize:this.options.frameSamples}),this._initialized=!0};process(t){if(this._stopProcessing||!this.resampler)return!1;let s=t[0][0];if(this._initialized&&s instanceof Float32Array)for(let t of this.resampler.process(s))this.port.postMessage({message:e.AudioFrame,data:t.buffer},[t.buffer]);return!0}}registerProcessor("vad-helper-worklet",i);
//# sourceMappingURL=worklet.js.map