标点恢复:ASR 输出没有句号该怎么办

2026-08-24

语音识别的声学模型通常只输出一串没有标点的字,标点要由一个独立的后处理模型补上,这一步叫标点恢复。

看一段没有标点的转写结果:

这个我们上周讨论过了当时的结论是先做灰度但运营那边又提了新需求你们觉得呢

不是读不懂,是读起来累——眼睛得自己承担断句的工作。如果这段文字还要送进摘要模型、意图识别或者做成字幕,麻烦更大:下游几乎所有文本模块,都是拿有标点的书面语训练出来的

标点恢复是语音识别四个环节里的最后一环,整条链路的分工见语音识别是怎么工作的:从声波到文字的四个环节

为什么声学模型不直接输出标点

关键在于标点在声音里没有直接对应物。字有对应的发音,标点没有——它更多由语义和句法决定,而不是由声学特征决定。

停顿确实是个信号,但它是弱信号,两个方向都会失效:

  • 换气的地方未必是句号。“我觉得这个……方案还行”,中间那个停顿不该变成标点。
  • 该断句的地方也未必有停顿。语速快的人一口气说完两三句完整的话,中间没有可测量的静音。

所以工程上普遍分工:声学模型专心把音变成字,标点交给一个吃文字的模型。

主流建模方式:逐 token 的序列标注

标点恢复最常见的建模方式,是把它当成序列标注:输入是无标点的字序列,模型为每一个字预测它后面该跟什么标点。标签集通常是「无 / 逗号 / 句号 / 问号」这样一组,模型输出的是一串和输入等长的标签,比如 讨(无) 论(无) 过(无) 了(句号) 当(无) 时(无)

这个设计的好处很实际:

  • 输入输出等长,原始文字被完整保留,不会多吐字或漏吐字。
  • 可以复用现成的预训练语言模型,接一个分类头就能训。
  • 加新标点类型只是扩标签集

代价也清楚:它只能在字与字之间插符号,不能改动文字本身。口语里的”嗯""那个”不会被清掉,想要更干净的书面文本还得单独做一步口语顺滑。

另一条路是让生成式模型把无标点文本直接改写成带标点文本,覆盖面更广,但它有改动原文的自由,也就可能把识别对了的字改错

断句不同,意思就不同

标点恢复不是排版美化,它会改变语义。看这一串字:

他说的对我们没有影响

两种断法都合法:

  • 他说的,对我们没有影响。 —— 他说了什么无所谓,反正不影响我们。
  • 他说得对,我们没有影响。 —— 他讲得有道理,而且我们确实没受影响。

前者否定他的话的分量,后者肯定他的判断。同一串识别结果,立场完全相反。

再看一个贴业务的:客服录音识别出「你确定要取消订单」。补句号是陈述句,坐席在复述客户的决定;补问号是疑问句,坐席在向客户确认。下游意图识别若靠句尾标点分流,这一个符号就把工单推向了不同分支。

问号恰恰最难:中文的疑问语气常常只在声调上,句子里没有”吗""呢”时,纯吃文字的标点模型没有判断依据——声学信息在上一环已经丢掉了。

常见断句错误排查表

症状常见成因缓解手段
通篇都是逗号,几乎不出句号语料里逗号是压倒性的高频标签,模型倾向选安全答案训练时对标签重加权;后处理按长度兜底断句
该问的地方出了句号疑问语气主要在声调里,纯文本模型看不到选能接入韵律特征的模型;下游别只靠问号判意图
长数字串、专名中间被插逗号token 边界与实体边界不一致调整 ITN 与标点恢复的先后顺序,实体内屏蔽插入
完整的话被切成无主语碎片VAD 静音阈值太短,模型只拿到半句上下文放宽静音阈值;给更长的上下文窗口
流式结果里的句号”跳来跳去”回溯修订在正常工作,中间结果被当成了最终结果只在 final 结果上取标点,见下一节

流式场景的根本矛盾

这是标点恢复最难受的地方:标点需要后文才能确定,而流式要求立刻输出

模型要判断”灰度”后面该是逗号还是句号,得先知道下一句是什么;可流式识别的价值就在于边说边出字。

常见的折中是先出无标点的结果,后续再修订,也就是回溯改写:先出现「这个我们上周讨论过了」没有标点,后文到达时补上句号,再往后模型发现前面那个逗号该是句号,又把它改掉。

界面上这表现为已显示的文字被悄悄改写。对人可以接受,对程序是个陷阱。如果下游把中间结果当最终结果用就会出问题

  • 重复触发。中间结果补上句号,下游以为”用户说完了”就调了一次 LLM,修订版又来一遍。
  • 按标点切句入库。中间结果切出的残句写进了数据库,后续修订改不回去。
  • 字幕闪烁。逐条渲染又不做替换,观众看到标点反复横跳。

硬规矩只有一条:流式接口一般会区分中间结果(partial)与最终结果(final),凡是依赖标点做判断的逻辑一律只认 final。两种识别模式的系统性差异见流式识别和整段识别,到底该选哪个

中文的特殊难点:没有唯一正确答案

中文标点恢复比英文更棘手,核心原因是中文短句多、逗号用法宽松。同一段话,连成长句还是拆成短句,往往都对:

  • 我今天有点忙,明天再说吧,你别急。
  • 我今天有点忙。明天再说吧。你别急。

后果有两个。一是训练标签本身带噪声,同样的句式在不同作者笔下被标成不同标点,模型只能学到一个平均倾向。二是评测困难,按逐位置匹配算,模型出句号而参考是逗号就算一次错,可这次”错”在人看来完全无所谓。

所以看标点恢复的评测数字时务必确认判定口径,这类坑在语音识别准确率被高估的几种常见情况里还有更多。务实的做法是只盯住真正影响下游的点:句号该不该在这里断、问号有没有丢、专名有没有被切开。

和大小写恢复是一对孪生任务

英文场景里,标点恢复常常和**大小写恢复(truecasing)**打包成同一个模块。两者都是逐 token 的分类任务,也依赖同一批语义线索——句首要大写,而”哪里是句首”正是标点恢复在回答的问题。

中文没有大小写问题,但有一道对应的选择题:全角还是半角。纯中文正文通常用全角,中英混排和代码文档可能要求半角。这类选择不该交给模型去猜,应该在后处理里用规则统一,否则一份稿子里会混用两种标点。相邻的口语到书面转换见ITN 是什么:把”二零二五年”变成”2025 年”

它通常不是你自己接的

工业级 ASR 工具包往往已经把标点恢复打包进了 pipeline。以 FunASR 为例,它的 AutoModel pipeline 输出的是带说话人 id、时间戳和标点的结构化文本,这几件事在一条管道里一次给全。

这个取向意味着后处理各环节之间是有信息共享的:时间戳知道停顿在哪,分轨知道换人在哪,都是标点恢复能用上的线索。反过来,你自己把这几步拆开串联,就要留意别把上游信息丢掉。时间戳的做法见ASR 的时间戳是怎么算出来的

常见问题

问:能不能让识别模型直接输出带标点的文字?

可以,端到端程度确实能再往前推。但分环节的结构仍然普遍,理由是可诊断、可单独替换:标点断得不好,只换标点模型即可。

问:标点恢复会不会改错我的原文?

序列标注这条路不会,它只在字与字之间插符号;生成式改写那条路有这个风险。对”不改原文”有硬要求的话,选型时要问清楚。

问:流式下用户看到标点变来变去,能避免吗?

要么接受修订,UI 上做平滑替换;要么牺牲一点延迟,攒够一小段上下文再出标点。彻底避免做不到。

相关阅读


本文讲的是语音识别后处理中标点恢复的通用机制,不绑定某一个具体实现。 各家系统的标签集、流式修订策略与默认排版规则差异很大,请以你所用系统的官方文档为准。 文中提到的开源项目仅按其仓库自述描述能力类别,我们没有做过性能实测,因此不给准确率、速度一类的数字。

想系统学会用 AI?报名体系课或加入会员,照着学、照着用。