如何为 FunASR 的 Paraformer 输出时间戳:带时间戳语音识别指南
【免费下载链接】FunASROpen-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, and OpenAI-compatible/MCP serving.项目地址: https://gitcode.com/GitHub_Trending/fun/FunASR
你正在做一个会议转写工具,需要精确知道每个词出现在录音的哪一秒。FunASR 的 Paraformer 时间戳功能正好解决这件事:large-vad-punc 版本的 Paraformer 在识别文本的同时,输出每个字的起止时间(毫秒级),你拿它做自动字幕、在剪辑时间线上定位语句都很顺手。
📦 功能速览:识别、VAD、标点一次出
所谓 "large-vad-punc" 版本,其实是三个模型打包在一起:Paraformer large 负责识别;VAD 模型(FSMN VAD,用来把长音频切成有语音的片段)负责切段;punc 模型(CT-Transformer,把标点补回文本)负责恢复标点。推理时框架会对识别结果做字级对齐,文本和时间信息因此天然一一对应。
一次generate()调用返回一个字典,关键长这样(简化为 5 行):
{ "key": "meeting.wav", "text": "今天下午三点,我们开会讨论新版本发布计划。", "timestamp": [[0, 120], [120, 340], ...], # 每个字的 [起始ms, 结束ms] "sentence_info": [{"text": "今天下午三点,", "start": 0, "end": 1240}] }也就是说,你不需要任何额外后处理,文本和时间区间一次拿全。
🚀 最小可用示例:10 行跑出带时间戳的结果
下面这段代码初始化三件套并对一个 wav 跑识别,sentence_timestamp=True表示额外要句子级时间戳:
from funasr import AutoModel model = AutoModel( model="speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch", vad_model="speech_fsmn_vad_zh-cn-16k-common-pytorch", punc_model="punc_ct-transformer_zh-cn-common-vocab272727-pytorch", ) res = model.generate(input="meeting.wav", sentence_timestamp=True)[0] print(res["text"]) print(res["sentence_info"])预期看到带标点的整段文本,以及每句的 start/end 毫秒数;每句的时间点就是字幕轨道的时间点,稍作格式化即可语音识别生成字幕(SRT 文件)。
读懂返回结果:字段对照表
| 字段 | 含义 | 示例值 |
|---|---|---|
key | 输入音频的标识 | "meeting.wav" |
text | 带恢复标点的完整文本 | "今天下午三点,我们……" |
timestamp | 逐字时间区间,[起始ms, 结束ms]的列表 | [[0, 120], [120, 340]] |
sentence_info | 按标点切分的句子列表,每项含 text/start/end | [{"text": "今天下午三点,", "start": 0, "end": 1240}] |
raw_text | 未加标点的原始文本,仅在return_raw_text=True时返回 | "今天下午三点 我们……" |
两个容易踩的点:时间单位统一是毫秒,要秒就除以 1000;timestamp列表与text中非标点字一一对应,zip 起来就是逐字对齐结果。
参数速查:timestamp 相关开关
| 参数 | 设置位置 | 作用 |
|---|---|---|
sentence_timestamp | generate()的 kwargs | 输出句子级时间戳(依赖标点模型) |
return_raw_text | generate()的 kwargs | 额外返回未加标点的raw_text |
batch_size_s | generate()的 kwargs | 每批累计时长(秒),控制长音频的内存占用 |
这些开关不需要重新初始化模型,每次调用时传入即可。
⚠️ 避坑与调优
- 现象:
timestamp为空或缺失。原因:只配了 ASR 主模型、没带 vad/punc。字级时间戳是在 VAD 分段 + 标点模型处理这条链路上组装的。处理:按示例三件套一起初始化;如果日志里出现 "punc_model is required" 提示,说明缺标点模型。 - 现象:时间戳不准、对不上。原因多在输入侧:采样率不是 16 kHz、非单声道,或环境噪声大。处理:先把音频重采样成 16k 单声道再识别;如果只是字幕、剪辑定位这种按句级精度的需求,直接读
sentence_info的 start/end,比逐字累加更稳。 - 现象:长音频内存高、速度慢。原因:逐字
timestamp列表与文本等长,数小时的录音会产生大对象;且 VAD 后还要逐段推理。处理:用batch_size_s限制单批时长;只要字幕轨道就取sentence_info,丢弃字级列表。
字级对齐的具体实现在 funasr/utils/timestamp_tools.py,想弄清某段时间戳怎么算出来的,可以从这个文件入手。
FunASR 的 Paraformer 时间戳最适合中文、16 kHz 场景下的字幕生成与会议转写校对;如果你还需要区分"谁在说话",下一步是再加一个说话人模型,让每句带上 spk 字段。
【免费下载链接】FunASROpen-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, and OpenAI-compatible/MCP serving.项目地址: https://gitcode.com/GitHub_Trending/fun/FunASR
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考