aboutsummaryrefslogtreecommitdiff
path: root/source/client/rnnoise.ts
diff options
context:
space:
mode:
Diffstat (limited to 'source/client/rnnoise.ts')
-rw-r--r--source/client/rnnoise.ts45
1 files changed, 45 insertions, 0 deletions
diff --git a/source/client/rnnoise.ts b/source/client/rnnoise.ts
new file mode 100644
index 0000000..6bd632e
--- /dev/null
+++ b/source/client/rnnoise.ts
@@ -0,0 +1,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]
+} \ No newline at end of file