开口即查升级两级判定:误报实锤(A暂停续说,fast 短窗 simA<0.5 判新人,A续说句变'已识别人2'首句)——一级快锚点相似度(贴近=同人免复核),二级 CAM++ 准确空间复核(注册表认得出且为当前人→撤销切换;认得出别人→切给他;认不出→才当新人占号),占号时双空间镜像写入;ONSET-SWITCH 日志改 fastSim

This commit is contained in:
liwenhao2 2026-09-16 15:02:59 +08:00
parent b6d4efe3f4
commit 02a27085f4
1 changed files with 25 additions and 7 deletions

View File

@ -687,20 +687,38 @@ class MainActivity : AppCompatActivity() {
val rseq = onsetSeq val rseq = onsetSeq
speakerCheckHandler.post { speakerCheckHandler.post {
if (rseq != onsetSeq) return@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 slice, sampleRateInHz) ?: return@post
if (rseq != onsetSeq) 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 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 if (known != null && known == active) return@post
val label = known val label = known
?: SpeakerRecognition.nextAutoLabel().also { ?: 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=" + " label=$label kind=" +
(if (known != null) "known" else "new") + (if (known != null) "known" else "new") +
" active=${active ?: "-"}") " active=${active ?: "-"}")