docs(adr): ADR-0018 — client-side noise suppression, opt-in and self-hosted

sorb's decision after the prototype: integrate DeepFilterNet3 as a LiveKit track
processor, off by default, assets fetched only when the user enables it, checkbox
plus slider, 35 percent default.

Opt-in is what makes the 23.3 MB affordable — only those who benefit pay for it.
Three of the source specification's assumptions did not survive measurement and are
recorded as rejected alternatives: the dry/wet mixer (the model limits attenuation
natively, and mixing raw signal back would return the keystrokes), the Rust/wasm
build (a maintained package makes it unnecessary), and loading assets from the
vendor CDN (every participant's IP to a third party at call start).

Mobile stays untested by choice; since the filter is opt-in it simply stays off on
weak devices, so that is a follow-up rather than a blocker.

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 9ff6e09b1d
commit 914eb59575
3 changed files with 121 additions and 1 deletions
@@ -150,3 +150,25 @@ Die `getUserMedia`-Constraints, die im finalen Spec-Code fehlten, sind im Protot
oder Filter auf Mobilgeräten aus).
3. **Fork-Wartung** bleibt der ungemessene Posten — die Anpassung muss jeden Upstream-Rebase
überleben.
## Entscheidung 2026-08-15 → ADR-0018
sorb: **integrieren, opt-in mit Nachladen, Checkbox plus Regler, Standard 35 %.**
Festgehalten als [ADR-0018](../adr/0018-ki-geraeuschunterdrueckung-clientseitig-opt-in.md).
Der Größeneinwand entfällt damit für alle, die den Filter nicht nutzen: erst das Einschalten
löst den Download aus. Der Telefontest wurde bewusst ausgesetzt — vertretbar, weil der Filter
auf schwachen Geräten schlicht aus bleibt.
### Umsetzung (offen)
1. `deepfilternet3-noise-filter` als Abhängigkeit in `threadnet-call`.
2. `TrackProcessor` an den lokalen Audio-Track hängen; `assetConfig.cdnUrl` auf das eigene
Deployment zeigen (**nicht** auf `cdn.mezon.ai`).
3. Assets (23,3 MB) in die Auslieferung aufnehmen.
4. Audio-Einstellungen: Checkbox + Regler, Standard aus / 35 %.
5. `getUserMedia`: `noiseSuppression: false`, `echoCancellation: true`.
6. Eintrag in `threadnet-call:docs/axion1337-fork.md` als Fork-Anpassung mit Portier-Hinweis
(§5 dort ergänzen — die Absage galt der Server-Seite und bleibt gültig).
Der Prototyp liegt außerhalb der Repos und ist Wegwerf-Material; er wird nicht eingecheckt.