文字都在,标点为什么还是断错?

2026-06-23 · 更新 2026-09-10 · FunASR

转写没有漏字,读起来却像另一句话,问题可能出在标点归句。先别挪字幕时间,也别重跑整段音频:留下原始文本,单独生成标点候选,再比较意思有没有被改变。

1. 留一份原文,再生成候选

先按安装与环境验证指南准备 CPU 环境,确认 PyTorch 与 torchaudio 配套且可导入,安装 funasr==1.4.15 并运行 python -m pip check。这里用独立的 ct-punc 文本模型,不需要音频或 VAD;首次运行仍需下载权重。

import json
from funasr import AutoModel

model = AutoModel(model="ct-punc", device="cpu", disable_update=True)
texts = [
    "我们都是木头人不许说话不许动",
    "the meeting is at 3 pm please bring your laptop and the report",
    "人不是石头人有主观价值",
]
observed = []
for original in texts:
    candidate = model.generate(input=original)[0]["text"]
    observed.append({"original": original, "candidate": candidate})
print(json.dumps(observed, ensure_ascii=False, indent=2))

original 保留输入,candidate 单独保存模型结果。先保留空白和大小写,避免显示清洗掩盖差异;这些短文本是演示,不是准确率评测集。

2. 看看模型实际做了什么

[
  {
    "original": "我们都是木头人不许说话不许动",
    "candidate": "我们都是木头人,不许说话,不许动。"
  },
  {
    "original": "the meeting is at 3 pm please bring your laptop and the report",
    "candidate": " The meeting is at 3 pm, please bring your laptop and the report."
  },
  {
    "original": "人不是石头人有主观价值",
    "candidate": "人不是石头人有主观价值。"
  }
]

第一条得到了可读的停顿;英文结果包含句首大写,也包含一个前导空格。第三条只多了句号,仍没有把第二个“人”归到后半句。输出能读出来,不代表标点已经放对。

人工编辑候选,不是本次模型输出:
人不是石头,人有主观价值。

一次社区断句反馈区分了播放器时间修正和标点归句问题。这里用的是重新构造的短文本,不是该录音的完整上下文;不能据此认定原问题已修复,也不建议把很短的字幕间隔直接强拼。

3. 交付前,检查三个地方

punc_array 是标点类别,不是时间戳或置信度。独立文本调用不会告诉你句子在音频中的起止位置;不要靠补标点或整体挪字幕时间来声称精准对齐。ASR+VAD 流水线还有独立的文本重组逻辑,不能把这里的大小写表现泛化到所有调用路径。

使用 Fun-ASR-Nano 原生 Transformers时,也先保留原始识别结果。ct-punc 是可选后处理,不是原生 Nano 自带的时间戳、说话人分离或实时流式能力;已有合理标点的结果不必再盲目处理一遍。

需要交付字幕时,接着走SRT、VTT 与回听检查流程,把文字编辑和时间校验分开完成。

本次复现环境与实现依据

2026-09-10:FunASR 1.4.15,PyTorch / torchaudio 2.10.0 CPU,ModelScope iic/punc_ct-transformer_cn-en-common-vocab471067-large,缓存 revision 为 master。它会变化,不等于固定权重;本次 model.pt SHA256 为 7176cae922a872e130e6b88aef9a1153581711baf79c9124c7c95be383cd6f81。代码与权重许可应分别核对模型卡和仓库,本文不替代授权说明。

可核对大小写与句末处理流水线文本重组。单次输出不代表准确率、实时延迟或所有权重版本的结果。