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:
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 („15–25 MB") bestätigt, oberer Rand |
|
||||
| Vergleich RNNoise | 2,0–4,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.
|
||||
|
||||
Reference in New Issue
Block a user