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 90358bd..d01fd22 100644 --- a/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt +++ b/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt @@ -221,6 +221,10 @@ class MainActivity : AppCompatActivity() { private val onsetMinSamples = 19200 // 1.2s 开口窗 // 喂料恒定滞后(2026-09-16):识别流滞后 1.2s 喂入,切点前的音频可改道; // 全局字幕延迟 ~1.2s 的代价换取换人零串行 + // 主动撤销的强度门槛(2026-09-16 实锤:短插嘴混合窗复核出 0.5~0.6 弱匹配, + // 二元"认得出"误撤了 0.04 深低的真实异常;同人确认分实测 0.70~1.00, + // 0.68 取安全带) —— 复核低于此分只留痕不撤销,让切换立住 + private val revertCancelMin = 0.68f // 快速滚动通道(2026-09-16 用户三次拍板后终定 C:维持 2s 窗——最快档, // 接受误切闪烁,由并回自愈兜底)。窗长演化留档:2s(风暴,单窗20发/5min) // →3s(折中)→ 终选回 2s;护持:连续两窗/注册表复用/销案/冷却/并回自愈。 @@ -1819,16 +1823,26 @@ class MainActivity : AppCompatActivity() { ) { val acc = SpeakerRecognition.computeEmbedding(samples, sampleRateInHz) ?: return - val pre = SpeakerRecognition.registry.search(acc, speakerThreshold) - ?: nearestAttribution(acc, SpeakerRecognition.registry, verdictFallbackMin) + val r = SpeakerRecognition.registry.nearestRank(acc) + val pre = r.name + val score = r.score when { - pre != null && pre == active -> { - Log.i(TAG, tag + "-CANCEL-LATE known=$pre(active) active-heal") + pre != null && pre == active && score >= revertCancelMin -> { + Log.i(TAG, tag + "-CANCEL-LATE known=$pre(active)" + + " score=" + "%.2f".format(score) + " active-heal") // 主动善后:不再被动等句子结束(长句让错标挂几十秒),立即撤销 uiHandler.post { revertOnsetSwitch(label, pre) } } + pre != null && pre == active -> { + // 弱匹配(短插嘴混合窗常见 0.5~0.6):不撤销,让切换立住 + Log.i(TAG, tag + "-WEAK-SAME known=$pre" + + " score=" + "%.2f".format(score) + + " < $revertCancelMin keep-switch") + } pre != null -> - Log.i(TAG, tag + "-RECHECK known=$pre label=$label (verdict migrates)") + Log.i(TAG, tag + "-RECHECK known=$pre" + + " score=" + "%.2f".format(score) + + " label=$label (verdict migrates)") else -> SpeakerRecognition.registry.addAuto(label, acc) } }