Spaces:
Running
Running
| /** | |
| * Copyright 2024 Google LLC | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| const AudioRecordingWorklet = ` | |
| class AudioProcessingWorklet extends AudioWorkletProcessor { | |
| // send and clear buffer every 2048 samples, | |
| // which at 16khz is about 8 times a second | |
| buffer = new Int16Array(2048); | |
| // current write index | |
| bufferWriteIndex = 0; | |
| constructor() { | |
| super(); | |
| this.hasAudio = false; | |
| } | |
| /** | |
| * @param inputs Float32Array[][] [input#][channel#][sample#] so to access first inputs 1st channel inputs[0][0] | |
| * @param outputs Float32Array[][] | |
| */ | |
| process(inputs) { | |
| if (inputs[0].length) { | |
| const channel0 = inputs[0][0]; | |
| this.processChunk(channel0); | |
| } | |
| return true; | |
| } | |
| sendAndClearBuffer(){ | |
| this.port.postMessage({ | |
| event: "chunk", | |
| data: { | |
| int16arrayBuffer: this.buffer.slice(0, this.bufferWriteIndex).buffer, | |
| }, | |
| }); | |
| this.bufferWriteIndex = 0; | |
| } | |
| processChunk(float32Array) { | |
| const l = float32Array.length; | |
| for (let i = 0; i < l; i++) { | |
| // convert float32 -1 to 1 to int16 -32768 to 32767 | |
| const int16Value = float32Array[i] * 32768; | |
| this.buffer[this.bufferWriteIndex++] = int16Value; | |
| if(this.bufferWriteIndex >= this.buffer.length) { | |
| this.sendAndClearBuffer(); | |
| } | |
| } | |
| if(this.bufferWriteIndex >= this.buffer.length) { | |
| this.sendAndClearBuffer(); | |
| } | |
| } | |
| } | |
| `; | |
| export default AudioRecordingWorklet; | |