From 02a27085f4b9c7c02f691862fa010f92209d5a22 Mon Sep 17 00:00:00 2001 From: liwenhao2 Date: Wed, 16 Sep 2026 15:02:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=80=E5=8F=A3=E5=8D=B3=E6=9F=A5=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E4=B8=A4=E7=BA=A7=E5=88=A4=E5=AE=9A:=E8=AF=AF?= =?UTF-8?q?=E6=8A=A5=E5=AE=9E=E9=94=A4(A=E6=9A=82=E5=81=9C=E7=BB=AD?= =?UTF-8?q?=E8=AF=B4,fast=20=E7=9F=AD=E7=AA=97=20simA<0.5=20=E5=88=A4?= =?UTF-8?q?=E6=96=B0=E4=BA=BA,A=E7=BB=AD=E8=AF=B4=E5=8F=A5=E5=8F=98'?= =?UTF-8?q?=E5=B7=B2=E8=AF=86=E5=88=AB=E4=BA=BA2'=E9=A6=96=E5=8F=A5)?= =?UTF-8?q?=E2=80=94=E2=80=94=E4=B8=80=E7=BA=A7=E5=BF=AB=E9=94=9A=E7=82=B9?= =?UTF-8?q?=E7=9B=B8=E4=BC=BC=E5=BA=A6(=E8=B4=B4=E8=BF=91=3D=E5=90=8C?= =?UTF-8?q?=E4=BA=BA=E5=85=8D=E5=A4=8D=E6=A0=B8),=E4=BA=8C=E7=BA=A7=20CAM+?= =?UTF-8?q?+=20=E5=87=86=E7=A1=AE=E7=A9=BA=E9=97=B4=E5=A4=8D=E6=A0=B8(?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E8=A1=A8=E8=AE=A4=E5=BE=97=E5=87=BA=E4=B8=94?= =?UTF-8?q?=E4=B8=BA=E5=BD=93=E5=89=8D=E4=BA=BA=E2=86=92=E6=92=A4=E9=94=80?= =?UTF-8?q?=E5=88=87=E6=8D=A2;=E8=AE=A4=E5=BE=97=E5=87=BA=E5=88=AB?= =?UTF-8?q?=E4=BA=BA=E2=86=92=E5=88=87=E7=BB=99=E4=BB=96;=E8=AE=A4?= =?UTF-8?q?=E4=B8=8D=E5=87=BA=E2=86=92=E6=89=8D=E5=BD=93=E6=96=B0=E4=BA=BA?= =?UTF-8?q?=E5=8D=A0=E5=8F=B7),=E5=8D=A0=E5=8F=B7=E6=97=B6=E5=8F=8C?= =?UTF-8?q?=E7=A9=BA=E9=97=B4=E9=95=9C=E5=83=8F=E5=86=99=E5=85=A5;ONSET-SW?= =?UTF-8?q?ITCH=20=E6=97=A5=E5=BF=97=E6=94=B9=20fastSim?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/k2fsa/sherpa/onnx/MainActivity.kt | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 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 bda4460..b7bcb90 100644 --- a/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt +++ b/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt @@ -687,20 +687,38 @@ class MainActivity : AppCompatActivity() { val rseq = onsetSeq speakerCheckHandler.post { if (rseq != onsetSeq) return@post - val emb = SpeakerRecognition.computeEmbeddingFast( + val anchor = windowRefEmb ?: return@post + // 一级:快锚点相似度(灵敏);贴近锚点=同人,免准确复核 + val fastEmb = SpeakerRecognition.computeEmbeddingFast( + slice, sampleRateInHz) ?: return@post + if (rseq != onsetSeq) return@post + val simFast = SpeakerRecognition.similarity( + fastEmb, anchor) + if (simFast >= emaAbsorbMin) return@post + // 二级:准确空间复核(2026-09-16 误报实锤:A 暂停 + // 续说,fast 短窗 simA<0.5 误判新人→A 的续说句被切 + // 成"已识别人2"首句)。同人暂停后短窗声纹弱,fast + // 不可信;CAM++ 准确空间同人 0.77~0.93 强分离: + // 注册表认得出(且是当前人)→ 撤销切换;认得出别人 + // → 切给他;谁都认不出 → 才当新人 + val emb = SpeakerRecognition.computeEmbedding( slice, sampleRateInHz) ?: return@post if (rseq != onsetSeq) return@post - val anchor = windowRefEmb ?: return@post - val simA = SpeakerRecognition.similarity(emb, anchor) - if (simA >= emaAbsorbMin) return@post val active = activeLabelForWindow - val known = rollingSpeakerSearch(emb) + val known = SpeakerRecognition.registry.search( + emb, speakerThreshold) + ?: nearestAttribution( + emb, SpeakerRecognition.registry, + verdictFallbackMin) if (known != null && known == active) return@post val label = known ?: SpeakerRecognition.nextAutoLabel().also { - SpeakerRecognition.fastRegistry.addAuto(it, emb) + SpeakerRecognition.registry.addAuto(it, emb) + SpeakerRecognition.fastRegistry.addAuto( + it, fastEmb) } - Log.i(TAG, "ONSET-SWITCH simA=${"%.2f".format(simA)}" + + Log.i(TAG, "ONSET-SWITCH fastSim=" + + "%.2f".format(simFast) + " label=$label kind=" + (if (known != null) "known" else "new") + " active=${active ?: "-"}")