文字都在,标点为什么还是断错?
转写没有漏字,读起来却像另一句话,问题可能出在标点归句。先别挪字幕时间,也别重跑整段音频:留下原始文本,单独生成标点候选,再比较意思有没有被改变。
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. 交付前,检查三个地方
- 语义归句:人名、否定词、引语和转折是否仍属于正确的句子?有音频时回听上下文,不只看句末符号。
- 大小写与排版:独立模型实现对部分 ASCII token 调用
.capitalize(),也会重组空格。缩写、品牌名和混合大小写需要复核,不是无损的标点插入。 - 句末完整性:实现可能把末尾逗号替换为句号或补句号。最后一个句号不是语义完整的证明;先保留原文再编辑。
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。代码与权重许可应分别核对模型卡和仓库,本文不替代授权说明。