标点恢复(Punctuation Restoration)Python 实战:给无标点文本/ASR 结果自动加标点
- - -很多语音识别(ASR)模型输出的是没有标点的纯文本——一长串字读起来很费劲。标点恢复就是把"。"",""?"这些标点自动补回去,让转写结果可读。FunASR 的 ct-punc 是一个开源的标点恢复模型,中英文都支持,3 行 Python 就能给任意文本加标点。下面全是真实实测输出。
3 行代码做标点恢复(实测输出)
-pip install 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", disable_update=True) -print(model.generate(input="我们都是木头人不许说话不许动")[0]["text"]) -# 我们都是木头人,不许说话,不许动。-输入是没有标点的连续文本,输出自动补上了逗号和句号。
- -中英文真实示例
-
| 输入(无标点) | 输出(ct-punc 加标点) |
|---|---|
| 我们都是木头人不许说话不许动 | 我们都是木头人,不许说话,不许动。 |
| 今天天气怎么样我想出去走走你要一起吗 | 今天天气怎么样,我想出去走走,你要一起吗? |
| the meeting is at 3 pm please bring your laptop and the report | The meeting is at 3 pm, please bring your laptop and the report. |
可以看到:中文补「,。?」(问句还会自动判断用问号);英文补逗号、句号,还会把句首字母大写。同一个模型双语通吃。
- -最常见用法:给 ASR 结果加标点
-标点恢复最大的用处是清洗语音识别的输出。FunASR 的 ASR 模型可以一行挂载 ct-punc,识别完直接带标点:
-from funasr import AutoModel - -# ASR + VAD + 标点,一次完成(以中文 Paraformer 为例) -model = AutoModel(model="paraformer-zh", vad_model="fsmn-vad", punc_model="ct-punc") -result = model.generate(input="audio.wav") -print(result[0]["text"]) # 输出已带标点-
当然你也可以像最上面那样单独用 ct-punc 处理任意文本——不限于语音,任何无标点文本(老字幕、OCR 结果、聊天记录)都能加标点。
- -为什么用 ct-punc
-| ct-punc(FunASR) | |
|---|---|
| 语言 | 中文 + 英文(单模型双语) |
| 用法 | 3 行 Python,输入文本即可;也能一行挂到 ASR 上 |
| 标点 | ,。?等;英文还做句首大写 |
| 许可证 | 开源,可商用 |
想要完整的语音流程,看 中文语音识别实战、VAD/去静音 和 说话人分离;不确定选哪个 ASR 模型看 模型选型指南(默认推荐旗舰 Fun-ASR-Nano)。
- -FunASR 全家桶开源(MIT)——标点恢复、ASR、VAD、说话人、情感、LLM-ASR(旗舰 Fun-ASR-Nano),拿来即用。觉得有用就点个 Star 👇
也欢迎 Star:SenseVoice · Fun-ASR · FunClip
相关文章
--
-
- FunASR vs Whisper 实测对比 -
- SenseVoice 部署指南 -
- Fun-ASR-Nano 使用指南 -
- 说话人分离:谁在何时说话 -
- 情感与语种检测 -
- 实时流式语音识别 -
- 转写超长音频(1小时一次搞定) -
- 命令行转写(文本/JSON/SRT) -
- 自托管 OpenAI Whisper API 替代 -
- 自动生成字幕(SRT / VTT) -
- Python 语音转文字教程 -
- FunASR 跑进 llama.cpp(whisper.cpp 替代) -
- FunASR vs faster-whisper(中文/粤语) -
- 轻量语音识别(CPU 250MB) -
- 自托管替代 Deepgram/AssemblyAI -
- 选哪个 FunASR 模型 -
- 粤语语音识别(SenseVoice 原生粤语) -
- 日语语音识别(SenseVoice 转写+标点+情感) -
- Python 语音活动检测(VAD) -
- 自托管替代 Google/AWS/Azure 云语音 API -
- 中文语音识别(普通话)实战 -
- 语音识别带时间戳(字级) -
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。代码与权重许可应分别核对模型卡和仓库,本文不替代授权说明。