From cf7c66b99a535aa46e94db99e5c56adf10cd66a0 Mon Sep 17 00:00:00 2001 From: Jared Vititoe Date: Wed, 17 Jun 2026 20:02:16 -0400 Subject: [PATCH] Reorganize ML noise suppression settings UI Move the model comparison out of the always-visible Noise Suppression description and into the ML-only sub-settings. Add a compact info card for the selected model (CPU / voice quality / transients / download) plus a collapsible 4-model comparison. Group ML sub-settings into Model, Enhancements, and Test & calibrate sections with clear labels and separators. Fix invented --lt-border-color token and hardcoded rgba background to real TDS tokens. Build the model dropdown and DenoiseTester labels/compare buttons from DENOISE_MODELS so DeepFilterNet 3 is handled correctly. Co-Authored-By: Claude Opus 4.8 --- .../settings/general/DenoiseTester.tsx | 4 +- src/app/features/settings/general/General.tsx | 260 +++++++++++------- src/app/utils/lotusDenoiseUtils.ts | 4 +- 3 files changed, 166 insertions(+), 102 deletions(-) diff --git a/src/app/features/settings/general/DenoiseTester.tsx b/src/app/features/settings/general/DenoiseTester.tsx index e3d48531f..acd8d511f 100644 --- a/src/app/features/settings/general/DenoiseTester.tsx +++ b/src/app/features/settings/general/DenoiseTester.tsx @@ -1,6 +1,7 @@ import React, { useCallback, useEffect, useRef, useState } from 'react'; import { Box, Button, Text } from 'folds'; import { DenoiseModelId } from '../../../state/settings'; +import { DENOISE_MODELS } from '../../../utils/lotusDenoiseUtils'; import { DenoiseNode, buildGateNode, @@ -307,7 +308,7 @@ export function DenoiseTester({ model, useGate, gateThreshold, nativeNS }: Denoi [stopLive, stopPlayback], ); - const modelLabel = model === 'rnnoise' ? 'RNNoise' : model === 'speex' ? 'Speex' : 'DTLN'; + const modelLabel = DENOISE_MODELS.find((m) => m.id === model)?.name ?? model; return ( @@ -367,6 +368,7 @@ export function DenoiseTester({ model, useGate, gateThreshold, nativeNS }: Denoi { label: 'RNNoise', model: 'rnnoise' }, { label: 'Speex', model: 'speex' }, { label: 'DTLN', model: 'dtln' }, + { label: 'DeepFilterNet', model: 'deepfilternet' }, ] as const ).map((b) => (