
如何用 FunASR 从音频生成带说话人标签的 SRT/VTT 字幕并限制 VAD 分段时长【免费下载链接】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你需要把一段会议录音、播客或视频音轨转成字幕文件并且希望满足两件事每条字幕前标注出是哪个说话人[Speaker 0]、[Speaker 1]这类匿名标签以及在内存紧张时把 VAD 切出的语音段长度限制住避免单段过长导致处理时内存吃紧。FunASR 仓库的 examples/subtitle 目录提供了generate_subtitle.py脚本它用AutoModel组合 ASR 模型、fsmn-vad做语音端点检测、ct-punc做标点恢复加--spk时再挂上cam说话人模型最终写出 SRT 或 VTT 字幕文件。VAD 段的最大时长通过--max-single-segment-time控制单位是毫秒。准备条件安装 FunASRpip install funasr脚本位于仓库的 examples/subtitle/generate_subtitle.py用法说明在同目录的 examples/subtitle/README.md。你需要一个本地可访问的音频或视频文件作为输入文档示例中出现了meeting.wav、podcast.mp3、video.mp4。注意两点默认值--device默认是cuda。没有 GPU 时用--device cpu显式切换。--model的默认值在脚本源码里是iic/SenseVoiceSmall见 generate_subtitle.py 中parser.add_argument(--model, defaultiic/SenseVoiceSmall)README 的选项表里简写为SenseVoiceSmall。想换模型时用--model指定例如--model paraformer-zh。生成带说话人标签的字幕主路径命令python generate_subtitle.py meeting.wav --spk--spk是开关参数加上后脚本会在AutoModel的构造参数里加入spk_modelcam并在写字幕时把每条 cue 的文本前缀写成[Speaker N] 文本仅当该句有说话人分配时。不加--spk时输出纯文本字幕。不加-o时输出文件默认取输入文件主名加字幕格式后缀例如meeting.wav生成meeting.srt用-o可以指定任意输出路径。限制 VAD 分段时长python generate_subtitle.py meeting.wav --spk --max-single-segment-time 30000--max-single-segment-time的单位是毫秒脚本默认值为6000060 秒。脚本把它原样放进vad_kwargs{max_single_segment_time: 值}传给AutoModel作用于 VAD 切段环节。examples/subtitle/README.md 对取值的说明是默认 60 秒的上限是为了在语音边界处给识别留下更多上下文内存受限的机器上应显式调小文档给出的示例值是30000。docs/tutorial/README.md 也用了vad_kwargs{max_single_segment_time: 30000}这一写法并强调该参数单位是毫秒。需要记住的边界VAD 分段是离线长音频的切段手段不是增量式麦克风流式识别docs/tutorial/README.md 明确说明分段有助于处理更长文件但不保证任意时长或内存占用有界音频加载阶段和各模型本身仍会消耗资源。所以调小这个值是缓解手段不是设为多小就一定不 OOM的承诺。输出 VTT 格式python generate_subtitle.py podcast.mp3 --format vtt--format只接受srt默认和vtt两个值。两者差异在脚本写入逻辑中VTT 文件开头会写WEBVTT头每条 cue 只有时间行和文本、没有序号SRT 每条 cue 带递增序号时间用00:00:00,420 -- 00:00:03,800这种逗号分隔毫秒的格式VTT 时间行用小数点分隔毫秒。参数一览来自 examples/subtitle/README.md 的选项表选项默认值说明--formatsrt输出格式srt 或 vtt--segment-modereadable字幕 cue 分组方式readable 或保留模型原始句边界sentence--modelSenseVoiceSmallASR 模型脚本源码中的完整默认名是iic/SenseVoiceSmall--devicecuda运行设备cuda 或 cpu--max-single-segment-time60000VAD 段最大时长毫秒内存受限时调小--spk关是否加说话人标签--langauto语言提示非auto时脚本会把它作为language传给generate()-oinput.srt输出路径--segment-mode sentence用于保留模型原始的句子边界不做 readable 合并README 对 readable 模式的描述是只把相邻的、处于限定间隔、时长、长度和说话人约束内的短句或续句合并不会改写识别出的文本或标点。验证结果运行结束时脚本会打印两行关键输出其中Input:/Output:行确认了它实际使用的输入与输出路径Done! 12 subtitles → meeting.srt上面的数字仅为格式示意实际 cue 数取决于你的音频。然后打开生成的字幕文件核对内容。README 给出的带说话人标签的 SRT 示例输出文档示例不是每次运行都会得到的固定文本1 00:00:00,420 -- 00:00:03,800 [Speaker 0] Lets discuss the Q3 plan. 2 00:00:04,200 -- 00:00:07,100 [Speaker 1] Sounds good. I have three points.两种没有内容的情况脚本会分别处理输入文件不存在打印Error: path not found并以退出码 1 结束属于需要修正路径的执行错误。音频里没检测到语音打印No speech detected.并正常退出不会生成字幕文件。另外当模型结果里没有可用的sentence_info时脚本会退回到用整段文本加timestamp/timestamps字段推算出的起止时间写出一条兜底 cue可参考 tests/test_generate_subtitle.py 中对这两条路径的断言。所以即使句子级时间戳缺失输出仍可能只有一条覆盖全段的字幕——这不算错误但意味着这条 cue 没有句级精度。了解这些标签和分段的边界spk0这类标签是当前录音内的匿名聚类编号不是已验证的身份也不是跨录音稳定的 ID。docs/python_api.md 的 VAD, Timestamps, and Speakers 一节和 docs/speaker_emotion.md 都强调这一点如果你需要把标签对应到具体人需要额外的声纹登记与匹配工作。VAD 边界是语音段边界不保证等于说话人切换点说话人分段走的是 VAD 流水线路径脚本里vad_modelfsmn-vad与spk_modelcam同时配置只设spk_model而不经 VAD 路径不会得到说话人分配。sentence_info中每条句子的start/end单位是毫秒字幕的时间戳直接取自这些字段。readable 模式下的合并行为由 funasr/cli.py 的merge_subtitle_segments实现cue 只在同说话人、间隔、时长、长度约束内合并。该函数签名的默认参数是max_gap_ms500、max_duration_ms8000、max_chars42脚本调用时未覆盖这些默认值。说话人结果依赖标点与时间戳可用docs/python_api.md 指出当标点或时间戳缺失、或两者长度对不齐时句级分段可能退回到 VAD 段vad_segment此时一条 cue 可能跨越较长时段。遇到 cue 明显偏长时可结合--max-single-segment-time调小 VAD 段或改用--segment-mode sentence观察原始句边界。相关文档examples/subtitle/README.md脚本用法与选项表docs/python_api.mdAutoModelVAD/时间戳/说话人流水线的返回字段说明docs/tutorial/README.mdvad_kwargs与max_single_segment_time的单位和内存说明docs/speaker_emotion.md说话人输出的含义与限制【免费下载链接】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),仅供参考