一句口令为什么没用

设想一位用户在客厅里做徒手深蹲,手机放在茶几上。系统识别出动作偏差,回了一句“膝盖再弯一点”。用户照做了,结果膝盖往前顶得更多,脚跟也开始离地。这句话并不是错在方向,而是错在它没有回答三个问题:哪个部位、朝哪个方向、以什么顺序改。

一个只会读出检测结果的系统,更像一台提示器:检测到什么,就播报什么。教练的工作则是另一件事,它要在众多可能的原因里挑出最值得先处理的那一个,用对方能听懂的话说出来,并且确认对方真的改了。这两者之间隔着的,正是“从运动数据到有效教学语言”的转换。

江南体育AI把数字人教练拆成一条可以逐段检查的链路:

  1. 动作数据:摄像头画面变成时间序列的骨骼关键点。
  2. 动作识别:确定用户在做什么动作、处在哪个阶段。
  3. 错误判断:把偏差归因到具体的身体环节,并判断严重程度。
  4. 反馈生成:把结论转成一句可执行的话,并决定说的形式。
  5. 动作演示:必要时让数字人演示“差在哪里”。
  6. 交互闭环:观察用户下一次是否改善,再调整说法。

后面的章节按这个顺序展开。每一段都有会出错的地方,也有对应的校验方法。

先看清:从画面到可比较的量

姿态估计模型从每一帧画面里找出人体关键点,比如肩、髋、膝、踝的位置。原始输出是一串坐标,本身不带任何教学含义,需要先加工成几类可以比较的量:

  • 关节角度:髋、膝、踝在动作过程中的弯曲程度,随时间变化成曲线。
  • 动作轨迹:某个关键点走过的路径,例如杠铃或手腕的轨迹是否偏离垂直线。
  • 节奏:下降与上升各用了多长时间,底部有没有停顿。
  • 左右差异:两侧关节在同一时刻的角度或高度是否一致。
  • 相对位置关系:膝盖与脚尖、肩与髋之间的相对位置,而不是绝对像素。

这里有一个常被忽略的细节:用相对量而不是绝对量。用户站得离镜头近一点,像素坐标就整体放大;换一个机位,同一个膝盖角度在画面里的样子完全不同。所以把坐标归一化到身体尺度,用角度和比例来描述动作,比直接比较坐标可靠得多。

关键点本身也有不确定性。手被身体挡住、衣服宽松、光线太暗时,模型往往还是会输出一个位置,只是这个位置不可靠。因此每个关键点都应该带一个置信度,后面所有判断都要把这个置信度带上,低置信度的部分宁可不说,也不要硬说。这一点在设备性能吃紧、帧率下降的时候尤其重要,对应的排查思路可以参考江南体育App里动作识别很慢时的逐层排查

不同动作对机位的要求也不一样。深蹲和硬拉的髋部后移、躯干前倾,从侧面看最清楚;膝盖内扣、左右不对称,从正面看才明显。一个只有单机位的系统,需要在开始前告诉用户把手机放在哪里,并且在动作里发现视角不合适时主动说明:这一项在当前角度下看不清,先不下结论。把“看不清”当作一种正式的输出,比给一个看似精确的错误结论诚实得多,也避免用户对着一句错话反复调整。

再判断:偏差不等于错误

拿到一条角度曲线之后,最容易犯的错误是拿它和一条“标准曲线”逐点比对,差多少就算错多少。这种做法有三个问题。

第一,动作要分阶段看。深蹲可以粗分为准备、下降、底部、上升四段,同一个膝盖角度在下降阶段是正常的,在底部还没到位就已经停住,就是另一回事。阶段切分错了,后面的判断全部跟着错。

第二,个体差异是真实存在的。身高、腿长、踝关节活动度不同,合理的动作形态也不同。示意来说,假设系统在某位用户的髋部数据里看到一个偏差,如果这个偏差在他每一次动作里都稳定出现,更像是个人的结构特点;如果只在第八次之后才出现,并且逐次变大,更可能与疲劳有关。两种情况的反馈应当完全不同。

第三,偏差是症状,不是原因。“膝盖内扣”是一个症状,可能来自髋部外展力量不足,也可能来自脚踝活动度受限,还可能只是这次站距太窄。系统需要给出候选原因并排序,而不是把症状直接当作结论。

因此江南体育AI在这一层倾向于输出结构化的判断结果,而不是一句话。示意性的结构大致是:

字段 含义 示意内容
阶段偏差出现在动作哪一段 下降阶段中后段
环节 涉及的身体部位髋部、膝关节
现象 可观测的偏差 髋部后移不足,膝盖前移更早
持续性 是否连续出现 连续多次出现
置信度判断的可靠程度 中等,侧面机位遮挡了一侧

这张表里的内容是示意,用来说明字段设计,不代表任何实测结果。它的价值在于:后面的语言模型拿到的是一份带阶段、带持续性、带置信度的结构化事实,而不是让它自己去猜测原始数据的含义。

再翻译:让语言模型只做它擅长的事

把结构化判断转成教学语言,是大语言模型比较合适的位置,但它的职责要收窄。它可以负责措辞、语气、举例和顺序,不应该负责判断动作对错。原因很直接:语言模型不擅长可靠地读数值,让它直接看一串角度去“评价动作”,容易出现听上去很专业、实际与数据无关的说法。

更合理的做法是在提示中给它三样东西:结构化的动作判断、用户当前的水平与目标、一套反馈的写作约束。写作约束大致包括:

  • 一次只说一件事,具体到一个身体部位和一个动作。
  • 说“做什么”,少说“别做什么”。“让重心停在整个脚掌上”比“不要踮脚”更容易执行。
  • 给一个可以感知的线索,而不是一个数字。“像坐到身后的椅子上”比“髋角再打开若干度”更容易被身体理解。
  • 不使用未解释的术语,必要时用生活化的类比。

回到开头的例子,“髋部角度偏差”(假设数字,仅作示意)不应该原样出现在用户耳朵里。更接近可执行反馈的说法是:“下蹲的时候,先把屁股往后送,像要坐到身后的椅子上,再往下。这一次先放慢一点,脚掌保持整个踩实。”这句话包含了方向、线索、速度和一个稳定的支撑点,用户下一次就有事可做。

语言模型生成之后还需要一层校验:反馈里提到的身体部位是否与结构化判断一致,有没有出现判断里根本没有的结论,有没有给出超出用户能力的要求。校验不通过就回退到更保守的模板句,宁可朴素,也不要说错。关于每次到底该说几件事,我们在AI教练指出10个错误真的有用吗里单独展开讨论。

再演示:只演示差异

用户听不懂时,数字人的价值才真正体现。很多产品的做法是把一段标准动作循环播放,但这对用户几乎没有信息量:他看到的是一个完美的动作,却看不出自己和它差在哪里。

更有用的演示是“对比式”的:把用户自己的动作和一个可行动作叠在一起,只高亮有差异的那一个环节,其余保持静止或淡化。数字人演示的重点是“下降阶段髋部先动,膝盖后动”这个顺序,而不是整个深蹲。

要做到这一点,仅靠2D关键点通常不够,深度方向的信息缺失会让前后方向的偏差很难看清,需要3D动作重建来支撑。这部分我们放在3D动作模型为什么是教会动作的前提里讨论。这里只强调一个设计原则:演示服务于当前这一条反馈,演示的内容必须和刚说的话对得上。

最后闭环:说完之后看用户有没有改

反馈不是说完就结束。数字人教练的交互闭环包含三步:

  1. 说出一条反馈,并记下这条反馈针对的指标,例如“下降阶段髋部先于膝盖移动”。
  2. 观察用户接下来的若干次动作,这个指标有没有向好的方向变化。
  3. 变好了就进入下一个问题;没有变化就换一种说法或换一种线索;反而变差则需要回头检查,是否说错了原因,或是用户已经疲劳。

这一步让系统从“说话”变成“教学”。它还有一个副作用:系统会积累每位用户对不同线索的反应,有人对“坐椅子”的比喻有反应,有人对“数到三再起身”的节奏提示更有效,这些都是后续个性化反馈的材料。

边界要说清楚

数字人教练给出的是训练表现层面的参考,不是医疗建议,也不能替代线下教练对个人身体状况的判断。有几类情况需要坦白承认系统的局限:

  • 机位、光线、遮挡和衣着都会影响关键点质量,低置信度的判断应当降级为“建议调整机位”,而不是给出动作结论。
  • 涉及疼痛、头晕或明显不适时,系统应当提示停止训练,必要时咨询专业医生,而不是继续给出动作矫正。
  • 反馈时机同样重要。同样一句话,在动作进行中说和在组间说,效果差别很大,这个话题需要单独详谈。

回到最初的问题:数字人教练只会说“膝盖再弯一点”为什么还不够?因为教练的价值不在于看见问题,而在于把看见的东西变成对方下一次就能做出的一个具体动作。数据链路越完整,这句话就越有把握说对;语言模型越受约束,这句话就越不容易说错。头像像不像真人,反而是最后才需要考虑的事情。