fix(calls): finalize DTLN integration, stabilize build, and fix formatting

This commit is contained in:
2026-06-16 01:53:24 -04:00
parent 6634b2b8a2
commit 89a2321dd4
3 changed files with 50 additions and 5 deletions
+20 -5
View File
@@ -54,6 +54,10 @@
script: 'speexWorklet.js', script: 'speexWorklet.js',
wasm: 'speex.wasm', wasm: 'speex.wasm',
}, },
dtln: {
name: 'noise-suppression-audio-worklet',
script: 'dtlnWorklet.js',
},
gate: { gate: {
name: '@sapphi-red/web-noise-suppressor/noise-gate', name: '@sapphi-red/web-noise-suppressor/noise-gate',
script: 'noiseGateWorklet.js', script: 'noiseGateWorklet.js',
@@ -115,6 +119,7 @@
} }
// Load required modules // Load required modules
var scripts = [PROCESSORS[MODEL].script]; var scripts = [PROCESSORS[MODEL].script];
if (MODEL === 'dtln') scripts.push('dtlnProcessor.js');
if (USE_GATE) scripts.push(PROCESSORS.gate.script); if (USE_GATE) scripts.push(PROCESSORS.gate.script);
return Promise.all( return Promise.all(
@@ -166,14 +171,24 @@
} }
// 2. ML Processor // 2. ML Processor
var mlNode = new AudioWorkletNode(ctx, PROCESSORS[MODEL].name, { var mlOptions = {
channelCount: 1, channelCount: 1,
channelCountMode: 'explicit',
numberOfInputs: 1, numberOfInputs: 1,
numberOfOutputs: 1, numberOfOutputs: 1,
outputChannelCount: [1], processorOptions: { maxChannels: 1 },
processorOptions: { maxChannels: 1, wasmBinary: wasmBinary }, };
});
if (MODEL === 'rnnoise' || MODEL === 'speex') {
mlOptions.processorOptions.wasmBinary = wasmBinary;
} else if (MODEL === 'dtln') {
mlOptions.processorOptions = {
wasmBinary: wasmBinary,
model1: ASSET_BASE + 'model_1.tflite',
model2: ASSET_BASE + 'model_2.tflite',
};
}
var mlNode = new AudioWorkletNode(ctx, PROCESSORS[MODEL].name, mlOptions);
head.connect(mlNode); head.connect(mlNode);
mlNode.connect(dest); mlNode.connect(dest);
@@ -1441,6 +1441,7 @@ function Calls() {
options={[ options={[
{ value: 'rnnoise', label: 'RNNoise' }, { value: 'rnnoise', label: 'RNNoise' },
{ value: 'speex', label: 'Speex (Legacy)' }, { value: 'speex', label: 'Speex (Legacy)' },
{ value: 'dtln', label: 'DTLN (Balanced)' },
]} ]}
/> />
} }
+29
View File
@@ -97,6 +97,35 @@ function lotusDenoise() {
path.join(sapphi, 'noiseGate/workletProcessor.js'), path.join(sapphi, 'noiseGate/workletProcessor.js'),
path.join(denoiseDir, 'noiseGateWorklet.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); const missing = assets.filter(([s]) => !fs.existsSync(s)).map(([s]) => s);
if (missing.length > 0) { if (missing.length > 0) {