「这句话是谁说的?」——一个比想象中难十倍的问题

把小说演成视觉小说,第一关是给每句引语找到说话人。这篇拆解说话人归因的五个真实案例:后置说话从句、受话人陷阱、交替对话的边界、句号归属,以及为什么我们最终选择「宁可放旁白,不冒错认的险」。含真书人工标注的核对结果。

两个人形剪影之间悬着一个发光的对话气泡,气泡上挂着一个问号

「林夏说。“嗯。”」——请问这个「嗯」是谁说的?

如果你答林夏,恭喜,你踩中了我们做剧场模式时的第一个坑。这句里的句号属于上一句话: 「林夏说」结束的是前一段对话的归属,后面那个「嗯」是另一个人的回应。 中文小说里这种结构俯拾皆是,人眼扫一下上下文就懂,规则引擎会栽得很惨。

剧场模式要把小说演成视觉小说,台词框上得挂名牌,于是「谁在说话」成了绕不开的问题。 这篇把我们处理过的五个真实案例摊开讲。它们全部来自开发期的失败记录——每一个都曾经让归因出错。

案例一:说话从句在后面

「“别去。”她按住他的手腕说。」引语在前,说话从句在后。规则要往看才能找到说话人, 但往后看多远是个问题:看太远会把下一段的动作句错当说话线索。我们最终把后看窗口收得很紧—— 动词必须紧邻引语(间隔不超过两个字符),宁可窗口小到漏掉一些,也不放宽到会捞错的程度。

案例二:受话人陷阱

「他低着头,对秦朝说道:“对不起。”」——说话的是「他」,不是秦朝。秦朝是受话人, 但「秦朝」两个字离「说道」最近,天真的就近匹配会把道歉安到被道歉的人头上。

案例三:交替对话省略主语

两人对话进入节奏后,作者会停止标注说话人——引语一句接一句,全靠交替规律。 推断交替看似简单,实际前提苛刻:必须先确认头两句的归属都有硬证据、两人确实不同、 段落里没有第三个人插话。四个条件全满足才敢推,缺一个就整段放弃。 我们见过太多「第三人突然开口」把交替推断带崩的段落。

案例四:动作句当说话线索

「他放下杯子。“走吧。”」没有「说」字,但人类读者知道是他说的。 规则能不能学?能,但只敢学一小步:只有一小撮明确的「说话前动作」(放下、抬头、转身这类) 才触发弱归因,而且置信度低于有说话动词的情况。动作词表宁可短,不追求聪明。

案例五:行业基线有多低

你可能会问:这不是 NLP 老问题吗,学界没有现成方案?有,但成绩单不乐观—— 代表性开源项目 novel2galgame 用 669 本中文网文微调 8B 模型,纯文本场景切分的 F1 只有 30.5%; 同一条流水线上「必须硬选一个说话人」的归因 LoRA 准确率 86.7%——听着不低, 放进台词框大约每八句就挂错一块名牌。这就是为什么我们没有走「训练一个归因模型」的路线, 也没有把归因外包给在线大模型:会认错人的名牌不如没有名牌

立场:弃权比错认便宜

五个案例背后是同一个取舍。错误归因的伤害是不对称的:漏归因只是让一句台词没有名牌(纸书读者的默认状态), 错归因是把 A 的话安到 B 头上,读者当场出戏,而且会连带怀疑所有名牌的可信度。 所以整套规则的设计原则是:只认结构上有把握的证据,拿不准一律弃权进旁白

验证方式也按这个原则来:15 段真书人工标注,强归因精确率 100%,弃权面全部符合预期。 覆盖率我们会慢慢爬,但那条底线不动——名牌可以少挂,不能挂错。

这套归因跑在剧场模式里,纯本地规则、零 AI 调用、离线可用。 它长什么样,实测记录那篇有完整的两晚记录, 或者直接去 剧场模式介绍页看演示。

常见问题

为什么不直接让大模型判断谁在说话?

成本和确定性。一本 100 章的书按段落调用模型判断说话人,费用会转嫁给用户,而且模型输出不稳定,同一段落两次判断可能给出不同答案。规则方案零成本、离线可用、结果可复现,代价是覆盖率低——我们接受这个代价。

规则方案的准确率到底怎么验证的?

人工标注。我们从一本三百多万字的已出版网文里摘出 15 段对话密集的段落,逐句人工标注说话人作为标准答案,再跑归因规则对比。强归因部分的精确率是 100%——15 段里没有一处错认;拿不准的句子全部按设计进了旁白。

归因失败的句子会怎么呈现?

以旁白形式演出,引语原文保留。观感上是「无名牌的台词」,读者靠上下文自己判断——这正是纸书读者一直在做的事,不损失任何信息。

以后会提高归因覆盖率吗?

会,但底线不变:新增规则必须先过真书标注核对,错误归因零容忍。覆盖率可以慢慢爬,把 A 的话安到 B 头上这种事故一次都不能有。

有想法或问题?来 Discord 聊聊 →

AI 怎么知道这句话是谁说的?说话人归因的五个坑 · Foreverse · 新梦