import { log } from "./logger" declare global { class RNNoiseNode extends AudioWorkletNode { static register(context: AudioContext): Promise constructor(context: AudioContext) onstatus: (data: any) => void update(something: boolean): void } } export async function rnnoise_track(track: MediaStreamTrack): Promise { log("misc", "rnnoise enabled") const context = new AudioContext({ sampleRate: 48000 }) //@ts-ignore let RNNoiseNode: typeof RNNoiseNode = window.RNNoiseNode; let script: HTMLScriptElement; if (!RNNoiseNode) { log("misc", "loading rnnoise...") script = document.createElement("script") script.src = "/static/rnnoise/rnnoise-runtime.js" script.defer = true document.head.appendChild(script) //@ts-ignore while (!window.RNNoiseNode) await new Promise(r => setTimeout(() => r(), 100)) //@ts-ignore RNNoiseNode = window.RNNoiseNode; log("misc", "rnnoise loaded") } await RNNoiseNode.register(context) const source_stream = new MediaStream() source_stream.addTrack(track) const source = context.createMediaStreamSource(source_stream) const destination = context.createMediaStreamDestination() const rnnoise = new RNNoiseNode(context) source.connect(rnnoise) rnnoise.connect(destination) // rnnoise.onstatus = console.log // rnnoise.update(true) return destination.stream.getAudioTracks()[0] }