aboutsummaryrefslogtreecommitdiff
path: root/source/client/rnnoise.ts
blob: 6bd632ede4c503c4cf4cc47cf853ce4ee4ee5f79 (plain)
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
43
44
45
import { log } from "./logger"

declare global {
    class RNNoiseNode extends AudioWorkletNode {
        static register(context: AudioContext): Promise<void>
        constructor(context: AudioContext)
        onstatus: (data: any) => void
        update(something: boolean): void
    }
}


export async function rnnoise_track(track: MediaStreamTrack): Promise<MediaStreamTrack> {
    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<void>(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]
}