docs(issues): #0054 — prototype works, 35 percent suppression is enough

Built the throwaway prototype and sorb tested it: keyboard gone, voice natural,
at 35 percent rather than the 100 percent the spec assumed as default. That
settles the control question — the package exposes setSuppressionLevel and the
wasm carries atten_lim, so DeepFilterNet limits attenuation natively and the
spec's dry/wet mix drops out entirely, taking its missing delay node and phase
problem with it.

Measured what the spec had guessed: 23.27 MB per client, an order of magnitude
above RNNoise. Also found that the package fetches model and wasm from a
third-party CDN at call time, which a self-hosted platform cannot accept — the
asset URL is configurable and the prototype already serves them locally, so that
path is proven rather than assumed.

Still open and decision-relevant: CPU figures, the phone, and the standing cost of
carrying this through every upstream rebase.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Thore Cimbal
2026-08-15 12:00:00 +00:00
co-authored by Claude Opus 4.8
parent a328dacc50
commit 9ff6e09b1d
@@ -92,3 +92,61 @@ eine dauerhaft zu pflegende Fork-Anpassung mit Rust/wasm-Build gegenüber. Die A
Tastaturgeräusche als hinnehmbar erklären und stattdessen Push-to-Talk bzw. bewusstes
Stummschalten dokumentieren — ist billiger und sollte bewusst verworfen werden, nicht
übersehen.
## Prototyp gebaut und getestet 2026-08-15
Wegwerf-Aufbau außerhalb des Forks (`deepfilternet3-noise-filter` v1.3.0 + `livekit-client`,
lokale Testseite, Assets **selbst ausgeliefert**). Ziel war, die drei ungeklärten Punkte der
Spezifikation durch Messung zu ersetzen.
### Ergebnis: es funktioniert — und zwar besser als nötig
**Höreindruck sorb:** *„die Tastatur ist weg, Stimme klingt natürlich"* — bei **35 %**
Dämpfung.
Das ist der wichtigste Einzelbefund, und er entscheidet die Reglerfrage:
- **Der Dry/Wet-Mix der Spezifikation entfällt ersatzlos.** Das Paket bietet
`setSuppressionLevel()`, und die wasm-Signatur trägt `atten_lim` — DeepFilterNet begrenzt
die Dämpfung **nativ**. Die Prämisse der Spec („neuronale Netze kennen nur An/Aus") ist
widerlegt. Damit entfallen zugleich der fehlende Delay-Node und das Phasenproblem —
es gibt gar keinen zweiten Signalpfad mehr, der phasenversetzt zurückgemischt werden müsste.
- **35 % statt 100 % als Vorgabe.** Die Spec setzt „standardmäßig 100 % Filter-Aktivität";
gemessen reicht gut ein Drittel für „Tastatur weg **und** Stimme natürlich". Weniger
Dämpfung heißt weniger Artefaktrisiko — der Standardwert sollte bei ~35 % liegen, nicht am
Anschlag.
### Gemessen (ersetzt die Schätzungen der Spec)
| Größe | Wert | Bemerkung |
|---|---|---|
| Download je Client | **23,27 MB** | 15,66 MB `df_bg.wasm` + 7,61 MB Modell — Spec-Schätzung („1525 MB") bestätigt, oberer Rand |
| Vergleich RNNoise | 2,04,6 MB | rund ein Zehntel (`@jitsi/rnnoise-wasm`, `@shiguredo/rnnoise-wasm`) |
| Lizenz Paket | Apache-2.0 **oder** MIT | wie behauptet; Modellgewichte kommen aus dem DeepFilterNet-Projekt |
### ⚠️ Befund, der die Paketwahl bestimmt: fremdes CDN
`deepfilternet3-noise-filter` lädt Modell und wasm zur Laufzeit von **`cdn.mezon.ai`**. Für
eine selbstgehostete Plattform ist das nicht hinnehmbar: jeder Teilnehmer meldet bei jedem
Call-Start seine IP an einen Dritten, und die Verfügbarkeit des Calls hinge an fremder
Infrastruktur.
**Entschärft:** `assetConfig.cdnUrl` ist konfigurierbar. Der Prototyp liefert die Assets
bereits **lokal** aus — der CDN-freie Betrieb ist damit nachgewiesen, nicht nur angenommen.
Für eine Integration hieße das: die 23 MB gehören mit ausgeliefert (Image/Ingress), nicht
nachgeladen.
### Ebenfalls korrigiert gegenüber der Spec
Die `getUserMedia`-Constraints, die im finalen Spec-Code fehlten, sind im Prototyp gesetzt:
`noiseSuppression: false` (sonst arbeiten Browser-Filter und Modell gegeneinander),
`echoCancellation: true`.
### Weiterhin offen — und entscheidungsrelevant
1. **CPU-Last** (Jitter mit/ohne Filter) noch nicht abgelesen.
2. **Telefon.** Die eigentliche Härteprobe: 23 MB Download und DFN3-Inferenz auf einem
Mittelklasse-Gerät. Fällt das durch, braucht es einen Pfad (RNNoise als leichte Variante,
oder Filter auf Mobilgeräten aus).
3. **Fork-Wartung** bleibt der ungemessene Posten — die Anpassung muss jeden Upstream-Rebase
überleben.