diff --git a/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt b/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt index 0ff9b25..dbedd5f 100644 --- a/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt +++ b/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt @@ -230,6 +230,8 @@ class MainActivity : AppCompatActivity() { @Volatile private var rollingLowStreak = 0 @Volatile private var pendingForceEndpoint = false private val forceSwitchStreaks = 2 + // 强切冷却(仅 speakerCheckHandler 线程访问,无需 volatile) + private var lastForceSwitchAtMs = 0L // C(最新者胜):每次投递滚动检测都刷新序号,队列里被超额的旧任务直接跳过 @Volatile private var rollingSeq = 0L // 兜底残料:当前句子槽位最近一次滚动窗口声纹。整句判定因碎片算不出 @@ -787,22 +789,34 @@ class MainActivity : AppCompatActivity() { rollingLowStreak >= forceSwitchStreaks ) { rollingLowStreak = 0 - val label = newLabel - ?: SpeakerRecognition.nextAutoLabel() - .also { - SpeakerRecognition - .fastRegistry - .addAuto(it, emb) - } - Log.i(TAG, "SWITCH-FORCE" + - (if (deepLow) - " deep-low<${deepLowSwitch}" - else - " streak>=$forceSwitchStreaks") + - " label=$label" + - " owner=sid$owner") - uiHandler.post { - onOnsetSwitch(label) + // 3s 冷却闸(2026-09-16 实测: + // 强切落地链要 1~2s 完成,期间 + // 下一个深低窗会再开一枪,日志 + // 双发;功能无害但去噪+防叠发) + val nowMs = SystemClock.elapsedRealtime() + if (nowMs - lastForceSwitchAtMs < 3_000L) { + Log.i(TAG, "SWITCH-FORCE" + + " suppressed (cooldown)" + + " owner=sid$owner") + } else { + lastForceSwitchAtMs = nowMs + val label = newLabel + ?: SpeakerRecognition.nextAutoLabel() + .also { + SpeakerRecognition + .fastRegistry + .addAuto(it, emb) + } + Log.i(TAG, "SWITCH-FORCE" + + (if (deepLow) + " deep-low<${deepLowSwitch}" + else + " streak>=$forceSwitchStreaks") + + " label=$label" + + " owner=sid$owner") + uiHandler.post { + onOnsetSwitch(label) + } } } }