先承认一个前提:链路上每一环都在花时间

实时体育播报不是“模型说得快不快”的问题,而是一条数据链:

  1. 事件确认:数据源产生事件,系统判断它是初报还是已确认;
  2. 语言生成:把事件和当前比赛状态改写成口语;
  3. 语音合成:把文字变成声音,通常要等第一段音频生成才能开始播放;
  4. 数字人口型:根据音频驱动嘴型、表情和动作;
  5. 渲染与传输:画面编码、推流、播放缓冲。

链上的每一环都会引入等待。更麻烦的是,这些等待并不是线性叠加的,有些环节可以并行或流式处理(文本边生成边送去合成),有些环节必须等前一步完成(没有确认的事件,后面全都不能定稿)。所以“把整体压到多快”这个问题本身没有意义,先要问的是:哪一环是必须等的,哪一环是可以提前做的。

后文的所有时间数字,都只是举例,用来说明取舍的形状,并不是江南体育AI的实测结果。

延迟预算:把每一环的等待摆到桌面上

做实时系统的人习惯谈“延迟预算”:先决定观众能接受的总等待,再把它分配给各个环节。下面是一张示意的分配表,数字全部是假设,只用来说明“预算”这种思维方式,并不是实测数据:

环节 假设的占比 能否流式处理 主要风险
事件确认 最大,且不可控 否,取决于数据源初报被推翻
语言生成 中等 可以,边生成边输出 首句过长导致等待
语音合成 中等 可以,分句合成首包等待、读音错误
口型与渲染较小 可以,与音频并行 音频被打断后不同步
缓冲与传输 较小但波动大 部分 网络抖动

这张表最重要的信息不在数字,而在两个观察。第一,最大的一块往往是事件确认,而它恰恰是我们最难缩短的,因为它取决于数据源什么时候给出确认。第二,语言生成和语音合成虽然可以流式处理,但流式处理会带来新的风险:一句话说到一半,前面的事实基础就被推翻,此时已经播出的半句话收不回来。所以“更快”的技术手段,往往同时抬高了“撤回”的难度。

因此,缩短语言与语音环节的等待,值得做,但应当排在“让系统正确处理事件状态”之后。先把不该说的话挡住,再谈怎样让该说的话更早出口。

用一个假设的比分来看两种错误的代价

假设某场比赛第60分钟,甲队攻入一球。数据源先发出“进球”初报,约十几秒后才给出“归属确认”和助攻信息,这个时间差是举例。

做法一:等确认再播。 主播在确认到达之后才开口,观众看到皮球入网的画面,与听到“进球了”之间,有一段沉默。沉默不舒服,但没有内容错误。

做法二:初报一到就播。 主播立刻说“甲队进球,某某破门”。如果归属后来被更正为乌龙,或者进球被越位判罚取消,主播就必须收回刚才的话。观众此时同时经历了两次信息冲击:先被告知一件事,又被告知它不成立。

比较这两种做法,“慢”的代价是体验上的迟钝,“错”的代价是信任上的损耗。观众能容忍前者,因为它没有改变任何事实;后者一旦发生,观众会开始怀疑主播的每一个数字。这就是为什么我们的判断是:在高影响事件上,宁可稍慢,也不要先说错

但也不能推到极端,原因有两个。第一,等待的时间如果拖得太长,主播讲的内容会落后于画面,观众看到的和听到的对不上,这本身就是一种错误,我们在 比分已变化数字人仍在讲上一回合 里专门讲这个问题。第二,不是所有事件都值得等待。

按事件类型分级,而不是一刀切

更合理的做法是给事件分级,每一级采用不同的等待策略:

事件级别 例子 被推翻的可能性建议策略
低风险 开场、中场、终场哨,常规界外球 很低 直接播报,追求低延迟
中风险换人、角球、犯规较低,偶有更正 较快播报,措辞留有余地
高风险进球、点球、红牌、判罚复核 可能被推翻 先保守表述,确认后补全

表格里的“可能性”是定性判断,不是统计结果。分级本身可以随着数据源的特点调整:如果某个数据源的进球初报很少被更正,可以适当放宽;反之则收紧。这一点应当通过长期的回放与统计来校准,而不是凭直觉一次定死。

“先保守,再补充”:把一句话拆成两次说

对高风险事件,最实用的一种设计是把播报拆成两段。

第一段是保守句:只包含已经确定的信息,例如“甲队球门这边有一个进球的动静,我们等一下确认”,或者更平实的“球进了,现在等待裁判和数据确认”。它不带球员名,也不带球队归属,即使最终被推翻,也谈不上“说错”。

第二段是补全句:确认之后再说明是谁、怎么进的、比分变成多少。

这种做法的好处是,观众的情绪不会被压住,主播仍然在“陪着”比赛,但事实性的信息只有在确认之后才出现。它的代价也要说清楚:保守句读多了会显得啰嗦,语气也可能显得不够自信。所以我们的设计里,保守句只用于高风险事件,并且句式要有几种变化,避免连续重复。

撤回与更正:错误一定会发生,关键是怎么收场

不管分级做得多细,总会有一次意外。设计上要提前回答三个问题:

  1. 什么算需要更正? 只有改变了观众理解的内容才更正,比如进球归属、比分、红牌对象。措辞上的小偏差不值得打断。
  2. 怎么说? 用一句简短、平静的话,直接说明新的事实,不反复道歉,也不重复整段之前的内容。
  3. 之前生成的内容怎么办? 所有依赖被推翻事件生成的文本、音频和口型任务,都应被标记为作废,尚未播出的部分直接丢弃,已经播出的部分不再补充。

其中第三点是最容易被忽略的:如果语音合成队列里还排着两句基于旧事件的话,更正之后它们仍然被播出,观众会听到自相矛盾的内容。所以链路上的每一环都应该能够被“打断”,而不是只能往前走。

撤回机制不是为了让系统“可以随便先说”,而是为了在意外发生时把损失压小。它不能成为放宽事实标准的借口。

流式生成的一个陷阱:句子说到一半,事实变了

既然文字和语音都可以流式产出,为什么不让系统一边想一边说?原因在于句子有结构,事实性的信息往往出现在句子的关键位置。设想主播正在说:“甲队再次打破僵局,这一次是……”,这时数据源发来更正,说明进球实际上被判无效。已经播出的前半句无法撤回,后半句又不能顺着说下去。

针对这种情况,我们倾向于在设计上做三件事:

  1. 事实先行,修饰后置:先把已确认的事实作为一个短句完整播出,再加入评论和铺垫,这样即使被打断,观众听到的也是完整的信息;
  2. 句子长度受控:高风险事件的句子要短,减少“一句话说到一半”的窗口;
  3. 打断点预留:在句子之间预留可被打断的边界,让系统能够在不同句子之间安全地切换,而不是在一句话的中途硬切。

这三点都会牺牲一部分“一气呵成”的流畅感,换来的是更小的撤回代价。是否值得,取决于赛事的性质:节奏缓慢的比赛,观众对停顿更宽容;节奏很快的比赛,短句和快速衔接更重要,需要不同的参数。

数字人这一端:口型不该拖后腿,也不该抢跑

最后一段链路是数字人自身。口型与表情要与音频对齐,所以它必须等到音频开始产生之后才能驱动。设计上,我们希望它遵循两点:

  • 口型驱动只依赖音频,不依赖事件;音频被打断,口型也应当在极短时间内停止,不能继续把已经作废的句子“演”完;
  • 表情强度由事件级别控制:保守句阶段不要出现夸张的欢呼,补全句阶段再释放情绪。

如果把主播、教练等不同数字人放在同一个视角下看,会发现它们各自的实时要求并不相同。主播关心的是事件是否过期,教练关心的是动作反馈的时机,这两条链路的差别,我们在 体育数字人的工作流对照 里做了并排比较。

观众为什么更在意“被纠正”

还有一个心理层面的观察:观众对延迟和错误的感受并不对称。延迟是一种持续的、轻微的摩擦,大多数人会自动适应;错误是一次离散的事件,尤其是需要被纠正的错误,会带来“刚才那句话能不能信”的疑虑。而且,撤回本身也需要被听见,如果更正说得太快、太轻,观众可能没有听清,仍然带着旧信息继续看比赛。

这提示了一个设计上的细节:更正句应当比普通句略慢、略清晰,不必夸张,但要让关键的新事实(新的比分、新的归属)落在句子的显著位置。同时,字幕和画面角标也应同步更新,让更正不仅存在于声音里,也存在于屏幕上。

我们还没解决的问题

  • 初报与确认的时间差取决于数据源,我们无法凭空缩短它,只能设计出在这段时间里“说什么”。
  • 保守句的自然度:如何让保守表述听上去不像在拖延,仍然需要大量语料和编辑打磨。
  • 观众的期待差异:有人更喜欢“先听到再说”,有人更在意“说了就得对”,更合理的方案也许是让用户在一定范围内选择播报风格,这需要产品层面的验证。
  • 评估方式:如何衡量“延迟带来的不适”和“错误带来的不信任”,目前没有一个被广泛接受的统一指标。

这篇文章讲的是设计取舍,并不代表已经在某个具体赛事里得到验证。一个更谨慎的判断是:实时体育AI不是单个模型的问题,而是一整条实时数据链,只有让链路上每一环都知道“自己可能会被推翻”,才谈得上真正的快。