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 486ac57..daa7537 100644 --- a/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt +++ b/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt @@ -193,6 +193,10 @@ class MainActivity : AppCompatActivity() { // 0.14~0.19,0.22 取安全带中枢——深低首票即切(无缝插话 4~6s→3~4s); // 0.22~0.35 浅低维持连续两票,毛刺照旧被误断防护拦下 private val deepLowSwitch = 0.22f + // 深疑吸收闸(2026-09-16 日志实锤):与锚点相似度低于此的窗禁止一切吸收/ + // 回拉(渐变吸收与误断防护两条链都曾在换人过渡期污染锚点,致 simA 假性 + // 回升、连续低分永远攒不满——无缝换人零触发的根因) + private val driftAbsorbMin = 0.30f // 最近邻兜底(P1 收紧,2026-09-11):精确匹配不中→top≥0.42 且领先第二名 // ≥0.06 才归入最相似身份;模糊判新人(修"错并到别人行") private val verdictFallbackMin = 0.42f @@ -740,9 +744,14 @@ class MainActivity : AppCompatActivity() { } windowPrevEmb = emb rollingLowHits = 0 - } else if (simP >= emaAbsorbMin) { + } else if (simP >= emaAbsorbMin && simA >= driftAbsorbMin) { // 只偏离锚点、紧贴上一窗 → 音量/情绪渐变, - // 更新双参考,不换行 + // 更新双参考,不换行。 + // 深疑窗(与锚点 <0.30)除外:实测换人过渡期 + // 相邻窗 2s 重叠使 simP 天然 0.5~0.75,吸收会 + // 连环污染锚点致 simA 假性回升、连击永远攒 + // 不满(无缝换人零触发的根因)——深疑窗一律 + // 计入连击,不许碰锚点 rollingLowStreak = 0 windowRefEmb = blendEmb(anchor, emb) windowPrevEmb = emb @@ -755,11 +764,14 @@ class MainActivity : AppCompatActivity() { val newLabel = rollingSpeakerSearch(emb) val active = activeLabelForWindow when { - // 误断防护:查出来就是当前人 → - // 毛刺,不断行,参考回拉 + // 误断防护:查出来就是当前人 → 毛刺,不断行,参考回拉。 + // 深疑窗(<0.30)例外:与锚点深 + // 不符时以 simA 为准、不许回拉污 + // 染,落入连击路径交给强切判定 newLabel != null && active != null && - newLabel == active -> { + newLabel == active && + simA >= driftAbsorbMin -> { windowRefEmb = blendEmb(anchor, emb) rollingLowStreak = 0 windowPrevEmb = emb