From 8fdf35d16f28fc81a11deb5cc8ff82c422f7392e Mon Sep 17 00:00:00 2001 From: crosswk Date: Wed, 29 Jul 2026 21:59:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E3=80=8C=E8=AF=B7=E9=9D=A0?= =?UTF-8?q?=E8=BF=91=E9=BA=A6=E5=85=8B=E9=A3=8E=E3=80=8D=E8=AF=B4=E8=AF=9D?= =?UTF-8?q?=E4=B9=9F=E6=B8=85=E4=B8=8D=E6=8E=89=EF=BC=9A=E5=AE=B9=E5=BF=8D?= =?UTF-8?q?=E5=AD=97=E9=97=B4=E7=9F=AD=E6=9A=82=E5=81=9C=E9=A1=BF=EF=BC=8C?= =?UTF-8?q?=E7=B4=AF=E8=AE=A1=E6=AD=A3=E5=B8=B8=E9=9F=B3=E9=87=8F=E8=BE=BE?= =?UTF-8?q?0.5s=E5=8D=B3=E6=B8=85=E9=99=A4=EF=BC=8C=E4=B8=8D=E5=86=8D?= =?UTF-8?q?=E8=A2=AB=E5=81=9C=E9=A1=BF=E6=89=93=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/services/recorder/RecorderOrchestrator.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/client/src/services/recorder/RecorderOrchestrator.ts b/client/src/services/recorder/RecorderOrchestrator.ts index f5babbe..5b557be 100644 --- a/client/src/services/recorder/RecorderOrchestrator.ts +++ b/client/src/services/recorder/RecorderOrchestrator.ts @@ -1165,7 +1165,8 @@ export class RecorderOrchestrator { */ private updateVolumeWarning(level: MicLevel, sampleCount: number) { const REWARN_MS = 5000 - const CLEAR_VOICED = 8000 // ~0.5s @16kHz 连续正常音量才清除 + const CLEAR_VOICED = 8000 // ~0.5s @16kHz 累计正常音量才清除 + const VOICED_GAP_TOLERANCE = 4800 // ~300ms:容忍说话中字与字之间的短暂停顿,不清零已累计的清除进度 const firstWarn = this.hasDetectedVoiceThisSession ? 80000 : 32000 // 5s / 2s @16kHz // 系统已确认被静音:保持红色高警,不让琥珀提醒覆盖它; @@ -1197,9 +1198,12 @@ export class RecorderOrchestrator { } // 非正常音量(muted / low):累计安静时长;本段安静里只要出现过任何信号就记下来 - this.consecutiveVoicedSamples = 0 this.consecutiveSilentSamples += sampleCount if (level === 'low') this.quietRunSawSignal = true + // 说话时字与字之间的短暂停顿(<~300ms)不清零已累计的正常音量,否则一句话里的自然 + // 停顿会反复把"清除进度"打回 0,导致明明在正常说话也凑不满连续 0.5s、警告始终清不掉。 + // 只有持续安静超过这个小间隙,才认为不是说话停顿、归零重新计。 + if (this.consecutiveSilentSamples >= VOICED_GAP_TOLERANCE) this.consecutiveVoicedSamples = 0 if (this.consecutiveSilentSamples < firstWarn) return