From 1ebc42863e9e3be60896aa731954c333a9d0a2e4 Mon Sep 17 00:00:00 2001 From: Lotus CI Date: Thu, 29 Oct 2026 21:35:20 -0400 Subject: [PATCH] fix(settings): measured CPU and download figures for the noise-suppression models The CPU column was guessed (DeepFilterNet "25-50%", DTLN "10-20%") with no unit, so it read like Task Manager's whole-CPU figure and looked wildly off. Measured with each model running exactly as Lotus Call runs it (real-time speech, browser process CPU time from /proc minus a no-model baseline, Ryzen 7 PRO 4750GE): DeepFilterNet ~30%, DTLN ~9%, RNNoise ~3%, Speex ~2% of one core. Label it "one core" and explain the Task Manager relation. DTLN's download was listed as ~4 MB but fetches ~20 MB (17 MB worklet with the runtime inlined, plus 4 MB of models); DFN's ~18 MB is right (17.6 MB). Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5 --- src/app/features/settings/general/General.tsx | 4 ++-- src/app/utils/lotusDenoiseUtils.ts | 13 ++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/app/features/settings/general/General.tsx b/src/app/features/settings/general/General.tsx index 7b4d33c69..624fdf17f 100644 --- a/src/app/features/settings/general/General.tsx +++ b/src/app/features/settings/general/General.tsx @@ -2037,7 +2037,7 @@ export function Calls() { Model value={callDenoiseModel} @@ -2064,7 +2064,7 @@ export function Calls() { {( [ - { label: 'CPU', value: selectedDenoiseModel.cpuUsage }, + { label: 'CPU (one core)', value: selectedDenoiseModel.cpuUsage }, { label: 'Voice quality', value: selectedDenoiseModel.voiceQuality }, { label: 'Transients', value: selectedDenoiseModel.transients }, { label: 'Download', value: selectedDenoiseModel.binarySize }, diff --git a/src/app/utils/lotusDenoiseUtils.ts b/src/app/utils/lotusDenoiseUtils.ts index 8d9e0ee08..0f3d5327e 100644 --- a/src/app/utils/lotusDenoiseUtils.ts +++ b/src/app/utils/lotusDenoiseUtils.ts @@ -7,6 +7,9 @@ import { DenoiseModelId } from '../state/settings'; +// CPU = share of ONE core while in a call, measured with each model running +// exactly as Lotus Call runs it (Ryzen 7 PRO 4750GE, Chromium); download = bytes +// actually fetched on first use. Re-measure when a model or its settings change. export type DenoiseModel = { id: DenoiseModelId; name: string; @@ -24,7 +27,7 @@ export const DENOISE_MODELS: DenoiseModel[] = [ name: 'DeepFilterNet 3 (beta)', description: 'Studio-grade deep-learning model (48 kHz fullband, ONNX). Best quality; highest CPU and a larger one-time download.', - cpuUsage: '25-50%', + cpuUsage: '~30%', binarySize: '~18 MB', transients: 'Excellent', voiceQuality: 'Very High', @@ -34,8 +37,8 @@ export const DENOISE_MODELS: DenoiseModel[] = [ name: 'DTLN (beta)', description: 'Dual-signal deep-learning model (16 kHz). Strong on transient noise; moderate CPU.', - cpuUsage: '10-20%', - binarySize: '~4 MB', + cpuUsage: '~9%', + binarySize: '~20 MB', transients: 'Excellent', voiceQuality: 'High', }, @@ -44,7 +47,7 @@ export const DENOISE_MODELS: DenoiseModel[] = [ name: 'RNNoise', description: 'Lightweight hybrid model (48 kHz). Very low CPU; good for steady noise like fans, but can sound processed at full strength.', - cpuUsage: '< 5%', + cpuUsage: '~3%', binarySize: '< 1 MB', transients: 'Good', voiceQuality: 'Moderate', @@ -54,7 +57,7 @@ export const DENOISE_MODELS: DenoiseModel[] = [ name: 'Speex (Legacy)', description: 'Classic DSP noise suppressor. Minimal CPU, gentlest on voice; weakest suppression.', - cpuUsage: '< 2%', + cpuUsage: '~2%', binarySize: '< 1 MB', transients: 'Poor', voiceQuality: 'Moderate', -- 2.47.3