news 2026/9/7 7:27:22

如何为 FunASR 的 Paraformer 输出时间戳:带时间戳语音识别指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何为 FunASR 的 Paraformer 输出时间戳:带时间戳语音识别指南

如何为 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_timestampgenerate()的 kwargs输出句子级时间戳(依赖标点模型)
return_raw_textgenerate()的 kwargs额外返回未加标点的raw_text
batch_size_sgenerate()的 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/7 7:27:00

定积分的实际应用:原理、Python代码与SciPy实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/7 7:26:28

ESP-IDF保姆级入门29|FreeRTOS任务管理与调度全解:任务创建/状态切换/优先级调度/双核负载均衡/实时性优化,掌握嵌入式多任务编程核心

专栏前言 上一篇我们掌握了定时器与延时服务,建立了系统的时间基准,而多任务系统的核心调度能力,才是嵌入式实时操作系统的灵魂。 很多新手写嵌入式程序习惯用“大循环标志位”的裸机思路,逻辑一复杂就会出现阻塞卡顿、实时性差、…

作者头像 李华
网站建设 2026/9/7 7:24:39

rtk 的 GitHub Copilot 集成:PreToolUse 命令重写 Hook 的实现与验证

rtk 的 GitHub Copilot 集成:PreToolUse 命令重写 Hook 的实现与验证 【免费下载链接】rtk CLI proxy that reduces LLM token consumption by 60-90% on common dev commands. Single Rust binary, zero dependencies 项目地址: https://gitcode.com/GitHub_Tren…

作者头像 李华
网站建设 2026/9/7 7:22:45

STM8外部中断从原理到实战:寄存器配置与避坑指南

简介:STM8外部中断程序开发包,面向使用IAR环境的嵌入式初学者与开发者,系统梳理了外部中断的触发源、模式选择、优先级设置、嵌套处理及标志清除等关键知识点,并结合实验工程演示MCU如何对外部事件做出实时响应,帮助读…

作者头像 李华