diff --git a/src/livekit/SileroVADGate.ts b/src/livekit/SileroVADGate.ts index 86814bcf..2fd7cae9 100644 --- a/src/livekit/SileroVADGate.ts +++ b/src/livekit/SileroVADGate.ts @@ -6,6 +6,8 @@ Please see LICENSE in the repository root for full details. */ import { MicVAD, getDefaultRealTimeVADOptions } from "@ricky0123/vad-web"; +// ort is not re-exported from the index, import from submodule +import { ort } from "@ricky0123/vad-web/dist/real-time-vad"; import { logger } from "matrix-js-sdk/lib/logger"; const log = logger.getChild("[SileroVADGate]"); @@ -52,6 +54,10 @@ export class SileroVADGate { log.info("initialising MicVAD, baseAssetPath:", VAD_BASE_PATH); + // Avoid requiring SharedArrayBuffer (COOP/COEP headers) by running + // single-threaded. Performance is sufficient for 16kHz speech frames. + ort.env.wasm.numThreads = 1; + this.vad = await MicVAD.new({ ...getDefaultRealTimeVADOptions("legacy"), audioContext, diff --git a/vite.config.ts b/vite.config.ts index 792f5327..19e4a04b 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -50,6 +50,10 @@ export default ({ src: "node_modules/onnxruntime-web/dist/*.wasm", dest: "vad", }, + { + src: "node_modules/onnxruntime-web/dist/ort-wasm-simd-threaded.mjs", + dest: "vad", + }, ], }), react(), @@ -118,6 +122,11 @@ export default ({ key: fs.readFileSync("./backend/dev_tls_m.localhost.key"), cert: fs.readFileSync("./backend/dev_tls_m.localhost.crt"), }, + // Required for SharedArrayBuffer (used by onnxruntime-web threaded WASM) + headers: { + "Cross-Origin-Opener-Policy": "same-origin", + "Cross-Origin-Embedder-Policy": "require-corp", + }, }, worker: { format: "es",