feat(denoise): browser-native default, quality-ordered model picker, wire native-NS
CI / Build & Quality Checks (push) Successful in 11m15s
CI / Trigger Desktop Build (push) Successful in 18s

- Model dropdown is now ordered by quality/CPU, best first (DeepFilterNet 3 →
  DTLN → RNNoise → Speex); fix RNNoise's inaccurate "High" voice-quality label.
- When a user opts into the ML tier, default to the highest-quality model
  (DeepFilterNet 3). The tier default stays browser-native (known-good, best
  perceived in testing so far).
- Wire the "Series Suppression" (native-NS-before-ML) toggle into the real call
  path — it was applied only in the settings tester, so the tester could sound
  better than the actual call. Default it OFF (a single NS stage is best
  practice; it's an opt-in test aid).
- isMLDenoiseSupported now also requires WebAssembly, so ML isn't offered on
  strict-CSP shells where it would silently fall back to the raw mic.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-30 23:02:41 -04:00
co-authored by Claude Opus 4.8
parent 7939dc92d4
commit ebc782b16c
4 changed files with 61 additions and 43 deletions
+3 -7
View File
@@ -1,18 +1,14 @@
import { test, beforeEach, afterEach } from 'node:test';
import assert from 'node:assert/strict';
import {
DENOISE_MODELS,
ML_DENOISE_REQUIREMENTS,
isMLDenoiseSupported,
} from './lotusDenoiseUtils';
import { DENOISE_MODELS, ML_DENOISE_REQUIREMENTS, isMLDenoiseSupported } from './lotusDenoiseUtils';
// ── Model catalog (data integrity) ──────────────────────────────────────────
test('DENOISE_MODELS lists the four expected models in order', () => {
test('DENOISE_MODELS lists the four models ordered best-quality (highest CPU) first', () => {
assert.deepEqual(
DENOISE_MODELS.map((m) => m.id),
['rnnoise', 'speex', 'dtln', 'deepfilternet'],
['deepfilternet', 'dtln', 'rnnoise', 'speex'],
);
});