news 2026/9/13 5:59:04

Buzz 转录后处理指南:字幕 Resize 重排、结束时间扩展与多格式导出

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Buzz 转录后处理指南:字幕 Resize 重排、结束时间扩展与多格式导出

Buzz 转录后处理指南:字幕 Resize 重排、结束时间扩展与多格式导出

【免费下载链接】buzzBuzz transcribes and translates audio offline on your personal computer. Powered by OpenAI's Whisper.项目地址: https://gitcode.com/GitHub_Trending/buz/buzz

导读

本文围绕 Buzz 的转录后处理能力展开,讲解如何对已生成的音频/视频转录结果进行编辑、重排与导出。你将掌握三条核心技能:一是使用 Resize 工具对字幕重新组合(含词级时间戳模式下的按标点/按长度合并),二是使用"Extend end time"延长字幕在屏幕上的停留时间,三是将转录导出为 TXT、SRT、VTT 三种格式。文中所有功能均对应当前仓库的实际实现,并给出源码级佐证,可直接对照 transcription_resizer_widget.py 等文件深入阅读。

一、进入编辑视图:双击转录记录

当音频或视频文件的转录完成后,转录结果会以列表形式展示在主窗口。要开始编辑与导出,只需在转录列表中双击目标转录记录,即可打开转录查看器窗口。

这一交互在主窗口代码中有明确实现:TranscriptionTasksTableWidget发出doubleClicked信号,由主窗口的on_table_double_clicked方法接收并校验后打开查看器(见 main_window.py)。查看器工具栏按顺序提供Export(导出)、Translate(翻译)、Resize(重排)、Identify Speakers(说话人识别)、Find(查找)等按钮,其中 Resize 按钮的构建位于 transcription_viewer_widget.py,点击后弹出TranscriptionResizerWidget对话框(对应 on_resize_button_clicked)。

二、Resize 工具概览:两种能力模式

转录查看器中的Resize按钮会打开一个独立对话框,其中包含四大功能区(见 TranscriptionResizerWidget):

  1. Settings(设置):控制重排结果以何种方式保存;
  2. Extend end time(扩展结束时间):延长字幕段结束时间;
  3. Resize Options(重排选项):按目标长度拆分字幕段;
  4. Merge Options(合并选项):将多个字幕段合并为符合规则的字幕。

Resize 工具的能力范围取决于转录生成时是否开启了word-level timings(词级时间戳)选项:

转录生成时的设置可用的重排能力
已启用词级时间戳可按标点、按最大长度、按静音间隙合并重组为字幕,可自由组合多种拆分规则
未启用词级时间戳仅能指定"期望字幕最大长度"将长段拆分

这一区分在源码中体现为:当transcription.word_level_timings == 1时,"Resize Options"分组被禁用并提示"Available only if word level timings were disabled during transcription"(仅当转录时未启用词级时间戳时可用),而"Merge Options"分组则恰好相反,仅在词级时间戳已启用时可操作(见 transcription_resizer_widget.py 与 L326-L328)。

词级时间戳由转录任务配置中的word_level_timings字段控制,默认值为False(见 transcriber.py),在数据库中对应transcription表的word_level_timings BOOLEAN DEFAULT FALSE列(见 schema.sql)。界面侧则通过文件转录表单中的"Word-level timings"复选框设置(见 file_transcription_form_widget.py),CLI 模式下由--word_timestamps参数传入(见 cli.py)。

保存方式设置:新建转录还是就地覆盖

对话框顶部的Settings区只有一个选项——"Create new transcript"(新建转录)复选框,默认勾选。其行为如下:

  • 勾选(默认):重排/扩展/合并的结果会复制原转录生成一条新的转录记录并写入结果,原转录保持不变,方便对比;
  • 取消勾选:直接用新片段替换原转录的片段,就地更新。

该偏好会持久化保存到设置项TRANSCRIPTION_RESIZER_CREATE_NEW_TRANSCRIPT(见 on_create_new_transcript_toggled)。保存逻辑集中在save_segments方法:勾选时调用copy_transcription+update_transcription_as_completed,未勾选时调用replace_transcription_segments(见 L337-L352)。相关行为均有测试覆盖,见 transcription_resizer_widget_test.py。

三、Merge Options:基于词级时间戳的字幕重组

当转录开启了词级时间戳时,Merge Options区提供三种可自由组合的合并规则,点击Merge按钮后后台线程即开始重组。

3.1 按静音间隙合并(Merge by gap)

  • 勾选后,两个相邻片段之间的静音时间若小于设定阈值(默认 0.2 秒),将被合并为同一条字幕;
  • 底层对应 stable-whisper 重组规则中的mg={gap},gap 为秒数。

3.2 按标点分割(Split by punctuation)

  • 勾选后,字幕将优先在句号、问号、感叹号等标点处切分,避免字幕在句中被硬切;
  • 默认的标点规则字符串为:.* /./. /。/?/? /?/!/! /!/,/,,即支持英文句点、中文句号、问号(中英文)、感叹号(中英文)与逗号;
  • 底层对应重组规则sp={rule}

3.3 按最大长度分割(Split by max length)

  • 勾选后,任何超过指定字符数的字幕段都会被拆分为多条,默认上限为 42 个字符
  • 底层对应重组规则sl={length}

3.4 合并规则的组合与覆盖

三种规则的组合会编译为一条 stable-whisper 风格的regroup_string,由on_merge_button_clicked动态拼装(见 L430-L459):

  • 仅按间隙合并时:mg=0.2
  • 间隙合并 + 按长度分割时:mg=0.2++42+1
  • 各规则之间以_连接,例如同时启用三项时形如mg=0.2++42+1_sp=..._sl=42

此外,该规则字符串允许通过环境变量BUZZ_MERGE_REGROUP_RULE整体覆盖,便于高级用户或自动化脚本注入自定义重组规则(见 L459)。

3.5 底层处理流程与语言适配

合并操作在后台QThread中执行(见 TranscriptionWorker.run),核心流程为:

  1. 从数据库读取该转录的全部片段;
  2. 将每个片段的起止时间从毫秒换算为秒,连同文本构造成词级数据结构;
  3. 调用 stable-whisper 的transcribe_any,传入regroup_string完成重组,重组后的结果再换算回毫秒写入数据库。

值得注意的语言细节:代码内置了不使用空格分隔词的语言集合NON_SPACE_LANGUAGES = {"zh", "ja", "th", "lo", "km", "my"}(中文、日文、泰文、老挝文、高棉文、缅甸文),这些语言的词之间不会插入空格,而其他语言会在词后追加空格(见 L40 与 L57-L73)。同时,重组会以句子结尾标点(.,!,?,,,,见SENTENCE_END正则)为自然断点预分段,保证重组素材的语义完整性。

3.6 关于音频静音分析的说明

原文档说明:如果音频文件仍存在于系统中,词级时间戳合并还会分析音频中的静音,以提升字幕时间轴的准确性。这是该功能的设计目标。需要补充的是,从当前仓库源码看,transcribe_any调用处的vadsuppress_silence参数当前被硬编码为False,并留有 TODO 注释说明 VAD 与静音抑制在 Mac/Windows 编译版中无法正常工作(见 L104-L114)。因此该静音分析属于"设计中启用、当前版本被暂时关闭"的能力,使用时请以实际运行行为为准。

四、Resize Options:无词级时间戳时的拆分

如果转录未开启词级时间戳,"Merge Options"区不可用,此时只能使用Resize Options区:

  • Desired subtitle length(期望字幕长度):数值输入框,范围为1~100 个字符默认 42(见 L256-L259);
  • 点击Resize后,每个超过该长度的字幕段会被拆分成多条更短的字幕。

其实现位于on_resize_button_clicked(见 L360-L396):先把数据库片段转成srt.Subtitle,再调用srt_equalizer.split_subtitle(..., method="punctuation")优先按标点拆分,最后过滤掉起止时间相同的空段并保存。测试用例test_resize_updates_in_place_when_unchecked验证了长句会被拆成多条字幕段(见 transcription_resizer_widget_test.py)。

五、Extend end time:延长字幕停留时间

该功能自 Buzz1.4.3起提供,用于让字幕在屏幕上显示更久。操作方式:

  1. 在"Extend end time"区域的输入框中填写要延长的秒数(默认 0.2 秒,界面默认值为"0.2");
  2. 点击Extend endings按钮。

实现逻辑位于on_extend_button_clicked(见 L398-L428):

  • 输入的秒数会先乘以 1000 转换为毫秒(内部时间单位);
  • 对每个片段,将结束时间加上该增量;
  • 安全性保证:若延长后的结束时间越过下一条片段的开始时间,则自动截断为下一条的开始时间(new_end = min(new_end, next_start)),从而保证字幕段之间绝不重叠,时间轴始终合法有序;
  • 输入非法数值时回退到默认 0.2 秒,不会导致程序异常。

六、导出为字幕与纯文本

转录查看器工具栏的Export按钮提供导出菜单。菜单项按"格式 - 内容"命名,例如TXT - TextSRT - TextVTT - Text;若转录已生成翻译,还会出现对应的XXX - Translation菜单项,用于导出译文版本(见 export_transcription_menu.py)。

6.1 支持的三种输出格式

导出格式定义在OutputFormat枚举中,共三种(见 transcriber.py):

格式说明
TXT纯文本,无时间戳;相邻字幕段间停顿超过阈值时自动分段
SRT标准 SubRip 字幕,序号 +HH:MM:SS,mmm时间戳,毫秒以逗号分隔
VTTWebVTT 字幕,文件头为WEBVTT,毫秒以点号分隔

6.2 写入逻辑要点

实际写入由write_output完成(见 file_transcriber.py):

  • TXT 模式:段落分段时间间隔由环境变量BUZZ_PARAGRAPH_SPLIT_TIME控制,默认 2000 毫秒——即前一段结束与后一段开始间隔超过 2 秒时插入空行分段;
  • SRT/VTT 模式:逐段输出序号与时间戳,时间戳由to_timestamp统一格式化(见 L232-L239)。

导出时默认保存路径由转录记录按格式推导(get_output_file_path),随后弹出系统保存对话框,确认路径后写盘。

七、常见操作流程小结

  1. 转录完成后,在主窗口双击目标转录记录打开查看器;
  2. 点击工具栏Resize按钮打开重排对话框;
  3. 视转录是否带词级时间戳,选择:
    • 带词级时间戳→ 在 Merge Options 中勾选"按间隙/按标点/按长度"并点击 Merge;
    • 不带词级时间戳→ 在 Resize Options 中设定目标长度并点击 Resize;
  4. 如需字幕停留更久,在 Extend end time 中填写秒数并点击 Extend endings;
  5. 返回查看器,点击Export选择 TXT/SRT/VTT 保存结果;
  6. 若勾选了"Create new transcript",原转录保留、新结果以新记录呈现,可随时对照。

八、相关代码与测试索引

  • 重排/合并/扩展对话框实现:transcription_resizer_widget.py
  • 转录查看器与 Resize 按钮入口:transcription_viewer_widget.py
  • 导出菜单实现:export_transcription_menu.py
  • 输出格式与写入逻辑:file_transcriber.py、transcriber.py
  • 词级时间戳开关(GUI/CLI/数据库):file_transcription_form_widget.py、cli.py、schema.sql
  • 重排功能测试:transcription_resizer_widget_test.py

【免费下载链接】buzzBuzz transcribes and translates audio offline on your personal computer. Powered by OpenAI's Whisper.项目地址: https://gitcode.com/GitHub_Trending/buz/buzz

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

药店管理系统源码实践:Spring Boot、Shiro与MyBatis核心原理与部署

简介:面向初、中级Java Web开发者、毕业设计学生及需要快速落地管理系统的中小团队,这套药店管理系统完整源码覆盖了用户登录、权限管理、药品信息、库存与订单等典型业务模块,并附带可直接运行的构建脚本。后端基于Spring Boot、Shiro、MyBa…

作者头像 李华
网站建设 2026/9/13 5:56:33

电力系统动态状态估计:卡尔曼滤波技术对比与Matlab实现

1. 电力系统状态估计的技术背景与挑战 电力系统动态状态估计是现代电网运行控制的核心技术之一。简单来说,它就像电网的"健康监测仪",通过处理来自SCADA系统、PMU装置等传感器的海量数据,实时计算出系统各节点的电压幅值、相角等关…

作者头像 李华
网站建设 2026/9/13 5:53:00

Spring Boot集成MCP Server:AI Agent生命周期管理实战

1. 项目概述:当Web开发者遇上AI Agent 作为在Spring生态中摸爬滚打多年的开发者,第一次看到"MCP Server生命周期管理"这个需求时,我的内心是充满疑问的。这究竟是个什么神秘技术?简单来说,Model Context Pro…

作者头像 李华
网站建设 2026/9/13 5:52:56

向量数据库底层揭秘:ANN、HNSW、LSH、PQ算法解析与实战

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

作者头像 李华
网站建设 2026/9/13 5:49:46

算法工程师简历重构:从调库到业务闭环的底层逻辑

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

作者头像 李华