桌上有三把钥匙:一把铜的在左手边,一把铁的在玩家正前方,一把刻着花纹的在 NPC 身后的架子上。玩家举起右手,眼睛看着架子,说了一句“把那个给我”。对人来说这句话毫无歧义,对系统来说,“那个”可以是三把钥匙里的任何一把,甚至是玩家手里刚放下的酒杯。让 NPC 听懂“那个”,本质上是一个指示词消解(Deictic Resolution)问题,它必须在语音识别结束之前就开始。
“那个”其实是一个查询,不是一个词
语言模型看到的只是一串文字,“那个”后面没有任何东西。真正的答案藏在说话那一瞬间的场景快照里:玩家在看什么、手指向哪里、周围有哪些可交互物体、刚才的对话提过什么。所以处理链应该是:语音检测到开始 → 持续缓存视线与手部姿态 → 转写完成后回溯到说话起点附近的时间窗 → 在窗口内对候选物体打分 → 把最高分候选连同置信度交给对话与指令层。关键在于“回溯”:转写完成时玩家的视线往往已经移开了,用转写结束那一帧去查,会系统性地选错。
四路信号各自的脾气
视线(Gaze)最自然,却最抖。眼动追踪有自己的误差,头显没有眼动硬件时只能用头部朝向近似,落点常常偏出半个物体的宽度。视线还有一个坏习惯:人说“给我那个”时,眼睛经常已经转向 NPC 的脸,而不是物体。
手部追踪(Hand Tracking)的指向意图更强,但会被遮挡和姿态误识别干扰,握拳、拿着东西时手势判定尤其不稳。它的优势是有明确的射线方向,适合在视线候选相近时做仲裁。
物体 ID(Object ID)是把“看到的东西”变成“游戏里的东西”的桥。每个可交互物体都需要稳定的标识、类别、名称、别名和状态(在地上、在手里、在容器里)。没有这层,视线命中的只是一块网格,NPC 只能说“那个东西”。
空间语言(Spatial Language)是被常常忽视的第四路。“左边那个”“最近的那把”“靠窗的”本身就是筛选条件,应该在候选打分之前先过滤:说了“左边”,右边的候选直接降权,即使视线落在右边。语言与视线冲突时,我们更倾向让明确的空间词优先,因为玩家主动说出的限定词代表刻意表达。
候选打分:不投票,看谁更“尖”
一个可行的方案是给每个候选物体在每路信号上各算一个 0 到 1 的分,再按信号的可靠度加权。这里有个直观规则:如果视线分布很尖,落在一个物体上,就相信视线;如果视线分布很散,横跨三个物体,就把权重让给手部射线。也就是说,权重不是固定的,而是随该信号的歧义程度动态变化。物体状态也要参与打分:玩家说“给我”,那么已经在 NPC 手里的物体几乎不可能是目标。
三个典型失败场景
- 视线抖动:桌面上物体堆得很密,视线落点在相邻物体间跳动。对策是对时间窗内的落点做停留时间加权,而不是取最后一帧。
- 手指遮挡:玩家的手挡住了自己想指的物体。对策是把射线命中和物体可见性分开处理,被手遮挡的物体仍可作为候选。
- 物体重叠:一叠书、一堆金币,“那个”指向的其实是堆里的某一件。对策是命中容器后,若窗口内没有更细的信号,就转成追问,而不是随便抽一件。
候选不够自信时,该怎么问
当最高分候选与第二名差距很小,NPC 应当追问,但追问也要利用空间:伸手指向两件物体之一,问“是这把,还是那边那把?”比“你指的是哪一个?”要自然得多,玩家点个头就完成了消解。这与语音意图判断里的“低成本二选一追问”是同一个思路,只是这里候选来自空间而非语义。指代确定之后,还要把这次结果写进对话上下文,后面玩家再说“再来一个”“它是谁的”,就能沿着同一个对象继续。相关的更宏观视角可对照NPC 感知玩家所处空间,而对象与玩家历史的绑定则会进入长期记忆的写入逻辑。
上线前该量化什么
金沙娱乐在 AI VR 方向的设计思路,是把指代解析当成一个可单独评测的模块,而不是对话系统的附属功能。建议至少度量四项:首选候选正确率;需要追问的比例;追问一次后消解成功的比例;玩家在不同头显与追踪条件下(有无眼动、单手或双手)的差异。如果“首选正确率”很高但“追问后成功率”很低,说明候选列表本身就没覆盖真正的目标,问题出在物体 ID 或场景快照,而不是打分函数。