From dea96222457019736b8cfc7e07cef6a31202665b Mon Sep 17 00:00:00 2001 From: liwenhao2 Date: Wed, 16 Sep 2026 16:59:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A3=B0=E7=BA=B9=E8=AF=86=E5=88=AB=E6=95=B4?= =?UTF-8?q?=E4=BD=93=E8=B0=83=E8=87=B3=E7=A8=B3=E5=81=A5=E6=A1=A3(?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=8B=8D=E6=9D=BF:=E5=AE=BD=E6=9D=BE?= =?UTF-8?q?=E4=B8=80=E7=82=B9,=E4=B8=8D=E8=A6=81=E8=BF=99=E4=B9=88?= =?UTF-8?q?=E7=81=B5=E6=95=8F):4s=E4=B8=BB=E8=BD=B4=20drop=200.35=E2=86=92?= =?UTF-8?q?0.30;=E6=B7=B1=E4=BD=8E=200.22=E2=86=920.18;=E5=BF=AB=E9=80=9F?= =?UTF-8?q?=E9=80=9A=E9=81=93=200.32=E2=86=920.28;=E6=B5=85=E4=BD=8E?= =?UTF-8?q?=E8=BF=9E=E5=87=BB=202=E2=86=923;=E5=BC=80=E5=8F=A3=E5=8D=B3?= =?UTF-8?q?=E6=9F=A5=E5=90=8C=E4=BA=BA=E7=BA=BF=200.5=E2=86=920.35(?= =?UTF-8?q?=E4=B8=93=E7=94=A8=20onsetFireGate);minWindowRms=200.012?= =?UTF-8?q?=E2=86=920.015=20=E6=8C=A1=E4=BD=8E=E8=83=BD=E9=87=8F=E7=A2=8E?= =?UTF-8?q?=E9=9F=B3;=E5=8E=9F=E5=88=99=3D=E5=B0=91=E5=88=87=E5=AE=81?= =?UTF-8?q?=E5=90=88,=E5=8E=9F=E5=80=BC=E7=95=99=E6=A1=A3=20git=20history?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/k2fsa/sherpa/onnx/MainActivity.kt | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) 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 e723bf1..7001eac 100644 --- a/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt +++ b/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt @@ -188,11 +188,13 @@ class MainActivity : AppCompatActivity() { private val speakerCheckHandler by lazy { Handler(speakerCheckThread.looper) } // 实测(2026-09-14):2s 短窗 + base 模型下同人 simA 在 0.05~0.7 震荡, // 阈值维度已不可分 → 判定窗加长到 4s 拉开分布,阈值回调到 0.35 - private val speakerSwitchDrop = 0.35f // cos(window, reference) below this => switch + // 稳健档(2026-09-16 用户拍板"宽松一点,不要这么灵敏"):四闸阈值整体上调, + // 少切宁合;原值 0.35/0.22/0.32/0.5 见 git history + private val speakerSwitchDrop = 0.30f // cos(window, reference) below this => switch // 深低分一票强切(2026-09-16):同人波动实测最低 ~0.39,异人插话窗稳落 // 0.14~0.19,0.22 取安全带中枢——深低首票即切(无缝插话 4~6s→3~4s); // 0.22~0.35 浅低维持连续两票,毛刺照旧被误断防护拦下 - private val deepLowSwitch = 0.22f + private val deepLowSwitch = 0.18f // 最近邻兜底(P1 收紧,2026-09-11):精确匹配不中→top≥0.42 且领先第二名 // ≥0.06 才归入最相似身份;模糊判新人(修"错并到别人行") private val verdictFallbackMin = 0.42f @@ -207,7 +209,7 @@ class MainActivity : AppCompatActivity() { // 最速档:1.2s 周期 + 单票(switchStrikesNeeded=1)。误断的代价只是 // 多分行+流重置,不丢音频(快照平铺保证时间轴连续)。 private val switchStrikesNeeded = 1 // 长窗方差小,单票(真换人检出 3~6s) - private val minWindowRms = 0.012f // 真语音窗才判定:0.004 挡不住房间底噪,垃圾嵌入引发换人风暴 + private val minWindowRms = 0.015f // 真语音窗才判定:0.004 挡不住房间底噪;稳健档上调挡低能量碎音 // 窗长门槛(短窗 embedding 方差是误切主因):锚点需 ≥2s,判定需 ≥3s private val anchorMinSamples = 32000 private val judgeMinSamples = 48000 @@ -226,10 +228,11 @@ class MainActivity : AppCompatActivity() { // →3s(折中)→ 终选回 2s;护持:连续两窗/注册表复用/销案/冷却/并回自愈。 // 若闪烁不可接受,顺序:阈值 0.32→0.36 → 窗 48000(3s) → 64000(4s) private val fastRollEnabled = true - private val fastRollDrop = 0.32f + private val fastRollDrop = 0.28f private val fastStepSamples = 16000 // 1s private val fastWinSamples = 32000 // 2s 尾窗(用户终选) private val fastMinSamples = 24000 // ≥1.5s 才判 + private val onsetFireGate = 0.35f // 开口即查:快片 ≥0.35 视为同人不动(稳健档) private val namingWinSamples = 24000 // 切后命名窗 1.5s(纯净素材,方案三) private val namingMinSamples = 16000 // ≥1s 才判 private val feedLagSamples = 24000 // 1.5s:覆盖判定链(1.2s采集+计算)的 @@ -253,7 +256,7 @@ class MainActivity : AppCompatActivity() { @Volatile private var switchSerial = 0L @Volatile private var switchPrevActive: String? = null private var grayLinePending = false // 主线程:下一新行先以灰行开(等命名) - private val forceSwitchStreaks = 2 + private val forceSwitchStreaks = 3 // 强切冷却(仅 speakerCheckHandler 线程访问,无需 volatile) private var lastForceSwitchAtMs = 0L // 快速通道连续低分计数(同上,单线程访问)。2026-09-16 现场:2s 窗 @@ -716,7 +719,9 @@ class MainActivity : AppCompatActivity() { if (rseq != onsetSeq) return@post val simFast = SpeakerRecognition.similarity( fastEmb, anchor) - if (simFast >= emaAbsorbMin) return@post + // 稳健档:开口即查的"同人"判定线从 0.5 收到 0.35 + // (0.5 时 0.35~0.5 的同人波动都会误切) + if (simFast >= onsetFireGate) return@post // 方案三(2026-09-16):开火不发号——只切行(灰行), // 名字由切后纯净窗在 T+2.5s 诞生 val serial = ++switchSerial