File size: 1,349 Bytes
c409a15
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class SilenceDetectorProcessor extends AudioWorkletProcessor {
    static get parameterDescriptors() {
        return [{name: 'threshold', defaultValue: 0.01}];
    }

    constructor() {
        super();
        this.silenceStart = 0;
        this.SILENCE_DELAY = 1.5;
    }

    process(inputs, outputs, parameters) {
        const input = inputs[0];
        const threshold = parameters.threshold[0];

        if (input.length > 0) {
            const inputChannelData = input[0];
            let sum = 0;
            for (let i = 0; i < inputChannelData.length; i++) {
                sum += inputChannelData[i] * inputChannelData[i];
            }
            let volume = Math.sqrt(sum / inputChannelData.length);

            if (this.silenceStart === 0) this.silenceStart = currentTime;

            if (volume < threshold) {
                if (currentTime - this.silenceStart > this.SILENCE_DELAY) {
                    this.port.postMessage({type: 'silence', silenceDuration: currentTime - this.silenceStart});
                    this.silenceStart = currentTime;
                }
            } else {
                this.silenceStart = currentTime;
                this.port.postMessage({type: 'sound'});
            }
        }

        return true;
    }
}

registerProcessor('silence-detector-processor', SilenceDetectorProcessor);