Spaces:
Running
Running
| const MIN_CHUNK_SIZE = 512; | |
| let globalPointer = 0; | |
| let globalBuffer = new Float32Array(MIN_CHUNK_SIZE); | |
| class VADProcessor extends AudioWorkletProcessor { | |
| process(inputs, outputs, parameters) { | |
| const buffer = inputs[0][0]; | |
| if (!buffer) return; // buffer is null when the stream ends | |
| if (buffer.length > MIN_CHUNK_SIZE) { | |
| // If the buffer is larger than the minimum chunk size, send the entire buffer | |
| this.port.postMessage({ buffer }); | |
| } else { | |
| const remaining = MIN_CHUNK_SIZE - globalPointer; | |
| if (buffer.length >= remaining) { | |
| // If the buffer is larger than (or equal to) the remaining space in the global buffer, copy the remaining space | |
| globalBuffer.set(buffer.subarray(0, remaining), globalPointer); | |
| // Send the global buffer | |
| this.port.postMessage({ buffer: globalBuffer }); | |
| // Reset the global buffer and set the remaining buffer | |
| globalBuffer.fill(0); | |
| globalBuffer.set(buffer.subarray(remaining), 0); | |
| globalPointer = buffer.length - remaining; | |
| } else { | |
| // If the buffer is smaller than the remaining space in the global buffer, copy the buffer to the global buffer | |
| globalBuffer.set(buffer, globalPointer); | |
| globalPointer += buffer.length; | |
| } | |
| } | |
| return true; // Keep the processor alive | |
| } | |
| } | |
| registerProcessor("vad-processor", VADProcessor); | |