From 58f7b18746bbfd87669999a974ee8172f2298c3c Mon Sep 17 00:00:00 2001 From: Lotus CI Date: Thu, 29 Oct 2026 21:25:34 -0400 Subject: [PATCH] fix(call): keep browser AGC on with ML noise suppression Choosing an ML model (RNNoise / Speex / DTLN / DeepFilterNet) turned the browser's auto gain control off along with its noise suppressor, so the call carried the mic's raw level: voices came out 10-20 dB quieter than in the browser tier and DeepFilterNet "made people quiet". Measured with speech through each model exactly as the call runs it, the models keep the voice within ~1.5 dB (DTLN -0.1, DFN3 -1.7, RNNoise -1.3, Speex -1.5) while cutting background noise 6-29 dB, so the loss was AGC, not the models. Keep AGC on in every tier. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5 --- src/app/plugins/call/CallEmbed.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/app/plugins/call/CallEmbed.ts b/src/app/plugins/call/CallEmbed.ts index f029bfaec..7b2226765 100644 --- a/src/app/plugins/call/CallEmbed.ts +++ b/src/app/plugins/call/CallEmbed.ts @@ -237,10 +237,14 @@ export class CallEmbed { denoiseMode === 'browser' || (denoiseMode === 'ml' && denoiseNativeNS) ).toString(), - // Turn the browser's auto gain control OFF for the ML tier only: its - // dynamic gain fights the in-source ML denoiser (pumping). Browser/off - // tiers keep the browser's normal capture pipeline (AGC on). - autoGainControl: (denoiseMode !== 'ml').toString(), + // Keep the browser's auto gain control ON in every tier. It used to be + // turned off for the ML tier ("pumping"), but AGC is what brings a quiet + // mic up to speaking level: without it ML-tier voices went out 10-20 dB + // quieter than the browser tier, while the models themselves keep speech + // within ~1.5 dB (measured: RNNoise, Speex, DTLN, DeepFilterNet3). Chrome's + // AGC2 only adapts during speech, and the model runs after it, so it still + // removes the noise AGC leaves in the pauses. + autoGainControl: 'true', audio: initialAudio.toString(), video: initialVideo.toString(), header: 'none', -- 2.47.3