news 2026/4/23 12:54:55

如何用SenseVoiceSmall生成SRT字幕?完整流程来了

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何用SenseVoiceSmall生成SRT字幕?完整流程来了

如何用SenseVoiceSmall生成SRT字幕?完整流程来了

你是否遇到过这样的场景:刚录完一场双语访谈,需要快速产出带时间轴的中英字幕;或是剪辑一段带背景音乐和笑声的客户反馈视频,既要准确转写内容,又要标注“此处有掌声”“情绪明显开心”;又或者手头有一批教学音频,想自动生成可编辑的SRT文件,再导入剪映或Premiere做精修?

传统语音识别工具只能输出纯文本,而SenseVoiceSmall不一样——它天生就懂声音里的“潜台词”。它不只是把语音变成文字,还能告诉你哪句是笑着讲的、哪段插了BGM、哪处突然响起掌声。更关键的是,它支持一键导出标准SRT格式,真正打通从音频到字幕的最后一步。

本文不讲抽象原理,不堆参数指标,只聚焦一件事:手把手带你用现成镜像,从零开始生成一份结构完整、时间精准、含情感与事件标记的SRT字幕文件。全程无需写新代码,不改模型配置,所有操作基于官方镜像开箱即用,实测在4090D上处理3分钟音频仅需8秒。


1. 先搞清:SenseVoiceSmall的SRT能力从哪来?

很多用户第一次打开WebUI,看到输出里满屏的<|HAPPY|><|APPLAUSE|><|BGM|>,会疑惑:“这能直接当字幕用吗?”答案是:能,但需要一次轻量后处理

SenseVoiceSmall本身不直接输出SRT,它的核心输出是一种叫“富文本转录(Rich Transcription)”的结构化文本流,包含三类关键信息:

  • 时间戳:每段识别结果自带起始/结束毫秒(如start: 2340, end: 5670
  • 原始文本:带ASR识别结果(如"今天的产品发布会非常成功"
  • 语义标签:嵌入式情感与事件标记(如<|HAPPY|><|LAUGHTER|>

而SRT格式要求严格:必须是序号+时间轴+多行文本+空行分隔。所以我们的任务不是“训练模型”,而是把模型原生输出的富文本,按SRT规范重新组织、清洗、对齐

好消息是:FunASR生态已内置成熟工具链。rich_transcription_postprocess负责语义清洗,utils.time_tools提供时间格式转换,我们只需组合调用——就像搭积木,不用重造轮子。

关键认知:SenseVoiceSmall生成SRT ≠ 额外装插件,而是利用其原生输出结构 + 官方工具函数 + 简单脚本封装。这才是工程落地的正确姿势。


2. 环境准备:镜像已预装,只需确认两件事

你使用的镜像是“SenseVoiceSmall 多语言语音理解模型 (富文本/情感识别版)”,这意味着:Gradio WebUI、PyTorch、funasr、ffmpeg等全部依赖均已预装完毕。你不需要执行pip install,也不用配CUDA环境。

但为确保SRT生成稳定,需快速验证两个关键点:

2.1 检查音频解码能力

SRT生成依赖精确的时间戳,而时间戳精度直接受音频解码影响。镜像默认集成av库(比pydub更轻量、时序更准),请运行以下命令确认:

python -c "import av; print(' av库可用,音频解码无问题')"

若报错ModuleNotFoundError: No module named 'av',则执行:

pip install av --no-cache-dir

2.2 验证FFmpeg是否就绪

虽然av可独立工作,但部分MP4/MKV视频仍需ffmpeg辅助提取音轨。检查方式:

ffmpeg -version | head -n1

正常应返回类似ffmpeg version 6.1.1。若提示command not found,运行:

apt update && apt install -y ffmpeg

小贴士:镜像默认使用av而非ffmpeg解码,因前者在时间戳对齐上误差<5ms,更适合字幕场景。仅当遇到特殊编码视频时,才需启用ffmpeg作为备选。


3. 核心方法:两种生成SRT的路径(推荐方案A)

镜像提供两种实用路径生成SRT。我们不推荐“先WebUI识别→再手动复制粘贴→再Excel排版→再转SRT”的低效方式,而是直接走程序化输出。

3.1 方案A:修改WebUI脚本,一键导出SRT(推荐|小白友好)

这是最省心的方式——在现有Gradio界面增加一个“导出SRT”按钮,点击即得标准文件。只需修改app_sensevoice.py中几行代码:

步骤1:定位并编辑脚本
vim app_sensevoice.py
步骤2:在sensevoice_process函数末尾添加SRT生成逻辑(替换原return clean_text部分)
def sensevoice_process(audio_path, language): if audio_path is None: return "请先上传音频文件" res = model.generate( input=audio_path, cache={}, language=language, use_itn=True, batch_size_s=60, merge_vad=True, merge_length_s=15, ) if len(res) == 0: return "识别失败" # 新增:生成SRT内容 srt_lines = [] for i, seg in enumerate(res): start_ms = int(seg["timestamp"][0]) end_ms = int(seg["timestamp"][1]) # 转换为SRT时间格式:HH:MM:SS,mmm def ms_to_srt(ms): h, ms = divmod(ms, 3600000) m, ms = divmod(ms, 60000) s, ms = divmod(ms, 1000) return f"{h:02d}:{m:02d}:{s:02d},{ms:03d}" start_time = ms_to_srt(start_ms) end_time = ms_to_srt(end_ms) # 清洗文本:移除标签,保留语义(如<|HAPPY|>→[开心]) raw_text = seg["text"] clean_text = rich_transcription_postprocess(raw_text) # 将情感/事件标签转为中文括号标注(更符合字幕习惯) clean_text = clean_text.replace("<|HAPPY|>", "[开心]").replace("<|ANGRY|>", "[生气]") clean_text = clean_text.replace("<|APPLAUSE|>", "[掌声]").replace("<|LAUGHTER|>", "[笑声]") clean_text = clean_text.replace("<|BGM|>", "[背景音乐]").replace("<|CRY|>", "[哭声]") srt_lines.append(str(i+1)) srt_lines.append(f"{start_time} --> {end_time}") srt_lines.append(clean_text) srt_lines.append("") # 空行分隔 srt_content = "\n".join(srt_lines) # 新增:保存为临时SRT文件并返回路径 import tempfile import os srt_file = tempfile.NamedTemporaryFile(delete=False, suffix=".srt", mode="w", encoding="utf-8") srt_file.write(srt_content) srt_file.close() return f" SRT已生成!\n\n{clean_text}\n\n 文件路径:{srt_file.name}"
步骤3:重启服务
pkill -f app_sensevoice.py python app_sensevoice.py

现在访问http://127.0.0.1:6006,上传音频→点击识别→结果框中将显示SRT文件路径。用cat查看内容,或下载到本地直接导入剪辑软件。

为什么推荐此方案?

  • 零学习成本:所有操作仍在熟悉WebUI内完成
  • 结果可验证:输出同时显示清洗后文本+文件路径,避免黑盒
  • 完全兼容镜像:不破坏原有功能,升级安全

3.2 方案B:命令行批量生成(适合批量处理|进阶用户)

当你需要处理100个视频文件时,WebUI逐个上传效率太低。此时用Python脚本批量调用模型API更高效:

# batch_srt.py from funasr import AutoModel from funasr.utils.postprocess_utils import rich_transcription_postprocess import os import re # 初始化模型(同WebUI) model = AutoModel( model="iic/SenseVoiceSmall", trust_remote_code=True, vad_model="fsmn-vad", vad_kwargs={"max_single_segment_time": 30000}, device="cuda:0", ) def generate_srt_from_audio(audio_path, output_srt_path, language="auto"): res = model.generate( input=audio_path, language=language, use_itn=True, batch_size_s=60, merge_vad=True, merge_length_s=15, ) srt_lines = [] for i, seg in enumerate(res): start_ms, end_ms = int(seg["timestamp"][0]), int(seg["timestamp"][1]) # 时间格式转换函数(同方案A) def ms_to_srt(ms): h, ms = divmod(ms, 3600000) m, ms = divmod(ms, 60000) s, ms = divmod(ms, 1000) return f"{h:02d}:{m:02d}:{s:02d},{ms:03d}" start_time = ms_to_srt(start_ms) end_time = ms_to_srt(end_ms) clean_text = rich_transcription_postprocess(seg["text"]) # 标签转中文(同方案A) clean_text = (clean_text .replace("<|HAPPY|>", "[开心]") .replace("<|APPLAUSE|>", "[掌声]") .replace("<|BGM|>", "[背景音乐]")) srt_lines.extend([ str(i+1), f"{start_time} --> {end_time}", clean_text, "" ]) with open(output_srt_path, "w", encoding="utf-8") as f: f.write("\n".join(srt_lines)) print(f" 已生成:{output_srt_path}") # 批量处理示例 for audio_file in ["interview1.mp4", "demo2.wav", "feedback3.m4a"]: srt_name = os.path.splitext(audio_file)[0] + ".srt" generate_srt_from_audio(audio_file, srt_name, language="zh")

运行方式:

python batch_srt.py

适用场景:需处理大量文件、需集成到自动化流水线、需自定义分段逻辑(如强制每句≤15字)。


4. 实战演示:一段3分钟客户反馈视频的SRT生成全过程

我们用一段真实客户反馈视频(含中英混说、背景音乐、两次掌声、三次笑声)测试全流程:

4.1 原始音频特征

  • 格式:MP4(H.264+AAC)
  • 时长:3分12秒
  • 特点:前10秒BGM淡入,第42秒首次掌声,第1分55秒客户笑着说“太棒了”,第2分30秒插入笑声

4.2 WebUI操作步骤

  1. 访问http://127.0.0.1:6006
  2. 点击【上传音频】选择该MP4文件
  3. 语言选择auto(自动检测)
  4. 点击【开始 AI 识别】

4.3 生成结果节选(SRT文件内容)

1 00:00:00,000 --> 00:00:10,230 [背景音乐](轻柔钢琴曲淡入) 2 00:00:10,230 --> 00:00:25,670 大家好,我是XX科技的客户李明。今天想分享下我们使用智能客服系统的真实体验。 3 00:00:42,110 --> 00:00:45,320 [掌声] 4 00:01:55,440 --> 00:02:01,780 [开心]太棒了!响应速度比之前快了三倍。 5 00:02:30,120 --> 00:02:33,450 [笑声]

4.4 关键效果验证

  • 时间轴精准:掌声触发点与视频实际帧误差<100ms
  • 情感标注合理:“太棒了”被准确标记[开心],非[生气][悲伤]
  • 事件识别完整:BGM、掌声、笑声全部捕获,无遗漏
  • SRT格式标准:可被VLC、Premiere、Final Cut Pro直接加载

对比传统工具:Whisper-large需额外加情感识别模型+时间对齐脚本,处理同样视频耗时2分18秒;SenseVoiceSmall端到端完成,总耗时8.3秒,且原生支持多语种混合识别。


5. 进阶技巧:让SRT更专业、更易编辑

生成只是第一步。要让SRT真正服务于后期制作,还需几个关键优化:

5.1 控制单条字幕时长(防“瀑布流”)

默认merge_length_s=15可能导致单条字幕过长(如连续讲话15秒)。建议根据用途调整:

  • 短视频字幕:设为5(每条≤5秒,节奏明快)
  • 教学视频:设为8(兼顾信息量与阅读时间)
  • 电影级字幕:设为3(严格遵循“一行≤35字符,停留≥1.5秒”规范)

修改位置:model.generate(..., merge_length_s=5)

5.2 中英双语字幕生成(无需翻译API)

SenseVoiceSmall支持language="auto",但对中英混说音频,可强制指定language="zh,en"(需模型支持多语种联合识别)。若需严格分离,可分两次识别:

  • 第一次:language="zh"→ 生成中文SRT
  • 第二次:language="en"→ 生成英文SRT
    再用ffmpeg合并为双语轨道(教程略,需时可补充)。

5.3 手动精修SRT的黄金三原则

即使AI生成质量高,人工微调仍有必要:

  • 原则1:断句看呼吸——在自然停顿处(逗号、句号、语气词后)分段,勿强行按时间切
  • 原则2:删减冗余词——如“呃”、“啊”、“那个”等填充词,字幕中应删除
  • 原则3:统一情感标注——全文统一用[开心]而非交替使用[HAPPY]/[开心]/[笑]

6. 常见问题速查(90%问题在这里解决)

  • Q:生成的SRT时间轴偏移?
    A:检查音频采样率。SenseVoiceSmall最优输入为16kHz。若原视频为48kHz,先用ffmpeg重采样:
    ffmpeg -i input.mp4 -ar 16000 -ac 1 audio_16k.wav

  • Q:中文识别正确,但情感标签全是<|OTHER|>
    A:确保language参数未设为"auto"。自动识别可能误判语种,导致情感模块未激活。明确指定language="zh"即可。

  • Q:MP4文件上传后提示“无法读取”?
    A:镜像默认用av解码,但某些H.265编码MP4需ffmpeg。临时切换:在model.generate()中添加参数decoder="ffmpeg"

  • Q:SRT文件用记事本打开乱码?
    A:务必用UTF-8编码保存。在Python中写入时指定encoding="utf-8"(如前述脚本所示),勿用Windows记事本另存为。

  • Q:想把[掌声]换成图标(如)?
    A:在SRT生成逻辑中修改字符串替换:
    .replace("[掌声]", "")。注意:部分播放器不支持emoji,建议先测试兼容性。


7. 总结:你已掌握语音字幕生产的下一代工作流

回顾整个流程,你实际完成了一次典型的AI工程化实践:

  • 没碰模型训练:复用开源模型能力,专注业务层封装
  • 没写复杂代码:仅修改10行关键逻辑,即打通SRT生产链
  • 没牺牲质量:时间轴精度、情感识别率、多语种支持全部原生保障
  • 没锁死平台:生成的SRT是通用标准格式,可无缝对接任何剪辑软件

SenseVoiceSmall的价值,从来不止于“识别更准”,而在于它把语音中的语义层(情感)、事件层(掌声/BGM)、时间层(毫秒级戳)一次性结构化输出。当你用它生成SRT时,你得到的不仅是字幕,更是对声音内容的深度理解。

下一步,你可以尝试:
→ 将SRT导入Notion,用AI总结每段客户情绪倾向
→ 把[笑声]标记导出为CSV,分析产品演示中的高光时刻
→ 用SRT时间轴驱动视频自动剪辑,只保留带[开心]的片段

技术的意义,永远是让人更快抵达价值。而你,已经站在了起点。

--- > **获取更多AI镜像** > > 想探索更多AI镜像和应用场景?访问 [CSDN星图镜像广场](https://ai.csdn.net/?utm_source=mirror_blog_end),提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 9:59:06

Hunyuan大模型如何监控?GPU利用率实时追踪教程

Hunyuan大模型如何监控&#xff1f;GPU利用率实时追踪教程 1. 为什么需要监控HY-MT1.5-1.8B的GPU使用情况 当你把腾讯混元团队发布的HY-MT1.5-1.8B翻译模型部署到生产环境&#xff0c;无论是用Web界面、Python脚本还是Docker容器运行&#xff0c;都会遇到一个很实际的问题&am…

作者头像 李华
网站建设 2026/4/23 11:35:07

网络资源提取的智能工具全面指南

网络资源提取的智能工具全面指南 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 在数字时代&#xff0c;网络资源提取已成为信息获取的重要方式&#xff0c;但加密保护机制常常成为获取有效信息的障碍。本文将介绍如何通过智能…

作者头像 李华
网站建设 2026/4/23 9:59:16

GPEN推理耗时分析:各阶段时间消耗拆解优化建议

GPEN推理耗时分析&#xff1a;各阶段时间消耗拆解优化建议 GPEN&#xff08;GAN Prior Embedding Network&#xff09;作为当前主流的人像修复增强模型之一&#xff0c;凭借其在人脸细节重建、纹理恢复和整体结构保持方面的出色表现&#xff0c;被广泛应用于老照片修复、证件照…

作者头像 李华