用 Jev 驱动数字人的表情与动作:open-annie 实测解读
原文:Jev 让数字人实时互动中的动作更有边界、有节奏、有兜底 · 微信公众号「AI for Frontend」 · 2026-10-09
译文整理为社区学习用途,原文为中文,版权归原作者所有。解读的项目:rehan-remade/open-annie(开源,语音驱动 3D 数字人)。
作者与来源
公众号「AI for Frontend」的一篇实践解读,主角是开源项目 open-annie——浏览器里的语音驱动 3D 数字人。作者从自己的实时数字人项目出发,拆解了这个项目里 Jev 的用法。一句话概括项目的架构哲学(README 原句):"The model that talks is not the model that moves."(说话的模型不是做动作的模型。)文章结尾作者留了个开放的尾巴:评论区反响好的话,打算把自己的项目全面升级一版。
项目介绍
open-annie 是一个跑在浏览器里的实时互动数字人 Annie:用户用语音跟她聊,她实时说话、变表情、做手势。传统做法是把用户的话丢给大模型判断意图,再映射到表情和动作——这条路在实时场景下全是硬伤:延迟不可控(生成加解析需要时间)、置信度难校准(模型说"我很确定"你未必敢信)、容易越界(输出动作库里根本没有的标签)、流式场景容易抖动(partial 文本一变意图就跟着变)。
open-annie 的做法是把两条链路彻底拆开:
说话:GPT-Live-1(全双工语音模型)走 WebRTC 直接与用户对话。语音音频不经过 broker,实时播放、丢包隐藏、打断(barge-in)都是免费的;broker 只负责 SDP 交换。
动作:Jev(TypeSafe 的 System One 决策模型)。不生成任何文字,只根据当前对话状态,从封闭选项里选出表情、手势和身体语言。
Jev 在其中的应用
提问设计
用户说话时:只问一个问题——"一个正在认真听的朋友会是什么表情?"所以用户话音未落,Annie 的表情已经先变了。
Annie 自己说话时:对转录片段一次请求问五个问题——是否在承诺某个动作、选哪个动作片段、选哪种反应、选哪种表情、当前能量有多高。
每轮最多 4 次请求,问题全部预定义,模型只负责在给定选项上打分(问题定义在仓库
packages/core/src/instinct.js)。
实测数字(作者引用 open-annie 的数据)
| 指标 | 值 |
|---|---|
| 真实对话时长 | 97 秒 |
| 动作决策次数 | 51 次 |
| 中位延迟 | 118 ms |
| 整段对话 Jev 成本 | $0.0026 |
118 毫秒接近人类自然反应的时间窗口——表情和手势跟得上对话节奏,这是"活人感"的来源。
门控与兜底(工程约束)
作者强调这套系统的关键词是门控,而非感觉(Gates, not vibes):代码始终保持控制权。
Jev 只能从已安装的动作片段中选择;
每个答案必须过置信度门槛才生效;
高风险动作(如跳舞)需要口头明确承诺才触发,明确的拒绝("不行,抱歉,不做后空翻")会否决动作;
任何 Jev 失败(超时、429、断路器、无密钥)立刻回退到本地规则引擎,数字人永远不会陷入等待。
结果是文章标题说的三件事:动作有边界(只从封闭片段库选)、有节奏(118ms 中位延迟 + 表情按家族缓入缓出)、有兜底(失败即回退规则)。
其余实现(非 Jev 部分,但值得知道)
唇形同步:GPT-Live 不输出 viseme,HeadAudio(MIT 许可)每 16ms 从解码音频分类 15 种口型,mouth.js 汇总成嘴型并配合响度跟随;效果在 lipsync-eval/ 里对照音素真值测过。
身体动画:全部片段在无头 Blender 里基于 IK 控制骨骼手工关键帧——idle、倾听、Jev 触发的片段(挥手、跳舞、耸肩)、说话休息循环、32 个协同语音手势短语;每个片段做过碰撞检测并烘焙成 CC0 动作包。手势笔画落在她自己语音的重音节上。
表情:按家族(alert/warm/down/hot/calm)缓入缓出,反应快而不闪烁。
译注
这是 Jev "身体系"应用清单上新的一格:本库已有马里奥(11 号)、MuJoCo 机械臂(40 号)、计算机操作(39 号演示),这次是表情与身体语言——共同点是:全局连续控制归传统管线(IK、物理、动画),模型只回答"下一步从这几个里选哪个"这类封闭问题。三连问(30 号)在这里的答案非常干净:Jev 收到对话状态,交出候选概率;拿掉它,系统退化成规则引擎而不是瘫痪——回退路径本身就是架构的一部分。
118ms/$0.0026/97s 是从业者自报(作者转引项目数据),口径未注明是否含重试;但量级与 8 号(typesafe-jev-pricing:Jev 输入 $0.042/M、真 Jev 中位 259–269ms)和 24 号(polydao 的成本账)一致,可信度较高。作为对照,40 号里 GPT-6 单次决策数秒、整局数美元——数字人这种"每秒都在决策、全天候运行"的场景,恰恰是费用差最致命的地方。
"五个问题一次请求"是多问题合并的又一实例(40 号分层 XYZ 同款技巧):Jev 支持一次调用带多个问题,摊薄输入成本。状态文本短(对话转录 + 候选列表)也帮了大忙——输入 token 便宜但不是免费(33 号 Arena 的教训),数字人场景天然候选少、状态短,是 Jev 的舒适区。
置信度门槛 + 口头承诺触发这两条工程约束,与 32 号(omarsar 的 accept-or-escalate)和 Agent Harness 论文的 escalation 角色是同一思想的社区实践版:低置信不硬给、高风险要人(这里是要用户)点头。
原文无配图;仓库 23 star,属早期项目,成绩未经第三方复测。