fix(calls): wire DTLN ML denoise correctly via @workadventure JS API
The prior DTLN attempt (89a2321d) broke the build (missing dep, wrong
`cinny/` asset paths) and typecheck (`'dtln'` not in DenoiseModelId), and was
wired against an API the package doesn't expose. @workadventure/noise-
suppression is not a flat AudioWorklet — it's a self-contained ES module whose
processor name is `workadventure-noise-suppression` and which resolves its own
LiteRT WASM + TFLite models via import.meta.url. Driving it by hand-rolled
addModule + processorOptions cannot work.
- Re-add @workadventure/noise-suppression@0.0.4 (package.json + lockfile).
- vite: copy the package's whole dist/ tree intact to
denoise/workadventure/ (preserving assets/ + vendor/litert) so import.meta
resolution works at runtime; fail the build if the entry module is missing.
- shim: for the DTLN model, dynamic-import denoise/workadventure/audio-worklet
.js and use createNoiseSuppressionAudioWorklet(ctx, { bypassUntilReady })
to build the node; RNNoise/Speex keep their direct flat-worklet path. Async
init errors are logged + reported and fall back to the raw mic.
- Restore 'dtln' in DenoiseModelId (+ settings coercion), the model chart, and
the settings dropdown, labelled "(beta)".
DTLN builds and is fully self-hosted, but its in-call audio is UNVERIFIED in
this environment — needs a real-call test. DeepFilterNet stays excluded (CDN
asset loading, incompatible with self-hosting / Tauri CSP).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+17
-29
@@ -97,35 +97,6 @@ function lotusDenoise() {
|
||||
path.join(sapphi, 'noiseGate/workletProcessor.js'),
|
||||
path.join(denoiseDir, 'noiseGateWorklet.js'),
|
||||
],
|
||||
// DTLN (WorkAdventure v0.0.4)
|
||||
[
|
||||
path.resolve('cinny/node_modules/@workadventure/noise-suppression/dist/audio-worklet.js'),
|
||||
path.join(denoiseDir, 'dtlnWorklet.js'),
|
||||
],
|
||||
[
|
||||
path.resolve(
|
||||
'cinny/node_modules/@workadventure/noise-suppression/dist/assets/audio-worklet-processor.js',
|
||||
),
|
||||
path.join(denoiseDir, 'dtlnProcessor.js'),
|
||||
],
|
||||
[
|
||||
path.resolve(
|
||||
'cinny/node_modules/@workadventure/noise-suppression/dist/vendor/litert/litert_wasm_internal.wasm',
|
||||
),
|
||||
path.join(denoiseDir, 'litert_wasm_internal.wasm'),
|
||||
],
|
||||
[
|
||||
path.resolve(
|
||||
'cinny/node_modules/@workadventure/noise-suppression/dist/assets/model_quant_1.tflite',
|
||||
),
|
||||
path.join(denoiseDir, 'model_1.tflite'),
|
||||
],
|
||||
[
|
||||
path.resolve(
|
||||
'cinny/node_modules/@workadventure/noise-suppression/dist/assets/model_quant_2.tflite',
|
||||
),
|
||||
path.join(denoiseDir, 'model_2.tflite'),
|
||||
],
|
||||
];
|
||||
const missing = assets.filter(([s]) => !fs.existsSync(s)).map(([s]) => s);
|
||||
if (missing.length > 0) {
|
||||
@@ -135,6 +106,23 @@ function lotusDenoise() {
|
||||
}
|
||||
assets.forEach(([s, d]) => fs.copyFileSync(s, d));
|
||||
|
||||
// DTLN (@workadventure/noise-suppression): unlike the flat sapphi
|
||||
// worklets, this package is a self-contained ES module that resolves its
|
||||
// own AudioWorklet processor, LiteRT WASM runtime and TFLite models via
|
||||
// `import.meta.url`. So we copy its whole dist/ tree intact to
|
||||
// denoise/workadventure/ (preserving assets/ + vendor/) and let the shim
|
||||
// dynamic-import denoise/workadventure/audio-worklet.js at runtime. The
|
||||
// entry module is required — fail the build if the install is broken.
|
||||
const dtlnSrc = path.resolve('node_modules/@workadventure/noise-suppression/dist');
|
||||
const dtlnEntry = path.join(dtlnSrc, 'audio-worklet.js');
|
||||
if (!fs.existsSync(dtlnEntry)) {
|
||||
throw new Error(
|
||||
`[lotus-denoise] DTLN entry missing (${dtlnEntry}) — build aborted. ` +
|
||||
'Run `npm ci` to install @workadventure/noise-suppression.',
|
||||
);
|
||||
}
|
||||
fs.cpSync(dtlnSrc, path.join(denoiseDir, 'workadventure'), { recursive: true });
|
||||
|
||||
const shimSrc = path.resolve('build/lotus-denoise.js');
|
||||
if (!fs.existsSync(shimSrc)) {
|
||||
throw new Error(`[lotus-denoise] Missing shim source ${shimSrc} — build aborted.`);
|
||||
|
||||
Reference in New Issue
Block a user