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):
- Settings(设置):控制重排结果以何种方式保存;
- Extend end time(扩展结束时间):延长字幕段结束时间;
- Resize Options(重排选项):按目标长度拆分字幕段;
- 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),核心流程为:
- 从数据库读取该转录的全部片段;
- 将每个片段的起止时间从毫秒换算为秒,连同文本构造成词级数据结构;
- 调用 stable-whisper 的
transcribe_any,传入regroup_string完成重组,重组后的结果再换算回毫秒写入数据库。
值得注意的语言细节:代码内置了不使用空格分隔词的语言集合NON_SPACE_LANGUAGES = {"zh", "ja", "th", "lo", "km", "my"}(中文、日文、泰文、老挝文、高棉文、缅甸文),这些语言的词之间不会插入空格,而其他语言会在词后追加空格(见 L40 与 L57-L73)。同时,重组会以句子结尾标点(.,!,?,。,!,?,见SENTENCE_END正则)为自然断点预分段,保证重组素材的语义完整性。
3.6 关于音频静音分析的说明
原文档说明:如果音频文件仍存在于系统中,词级时间戳合并还会分析音频中的静音,以提升字幕时间轴的准确性。这是该功能的设计目标。需要补充的是,从当前仓库源码看,transcribe_any调用处的vad与suppress_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起提供,用于让字幕在屏幕上显示更久。操作方式:
- 在"Extend end time"区域的输入框中填写要延长的秒数(默认 0.2 秒,界面默认值为
"0.2"); - 点击Extend endings按钮。
实现逻辑位于on_extend_button_clicked(见 L398-L428):
- 输入的秒数会先乘以 1000 转换为毫秒(内部时间单位);
- 对每个片段,将结束时间加上该增量;
- 安全性保证:若延长后的结束时间越过下一条片段的开始时间,则自动截断为下一条的开始时间(
new_end = min(new_end, next_start)),从而保证字幕段之间绝不重叠,时间轴始终合法有序; - 输入非法数值时回退到默认 0.2 秒,不会导致程序异常。
六、导出为字幕与纯文本
转录查看器工具栏的Export按钮提供导出菜单。菜单项按"格式 - 内容"命名,例如TXT - Text、SRT - Text、VTT - Text;若转录已生成翻译,还会出现对应的XXX - Translation菜单项,用于导出译文版本(见 export_transcription_menu.py)。
6.1 支持的三种输出格式
导出格式定义在OutputFormat枚举中,共三种(见 transcriber.py):
| 格式 | 说明 |
|---|---|
| TXT | 纯文本,无时间戳;相邻字幕段间停顿超过阈值时自动分段 |
| SRT | 标准 SubRip 字幕,序号 +HH:MM:SS,mmm时间戳,毫秒以逗号分隔 |
| VTT | WebVTT 字幕,文件头为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),随后弹出系统保存对话框,确认路径后写盘。
七、常见操作流程小结
- 转录完成后,在主窗口双击目标转录记录打开查看器;
- 点击工具栏Resize按钮打开重排对话框;
- 视转录是否带词级时间戳,选择:
- 带词级时间戳→ 在 Merge Options 中勾选"按间隙/按标点/按长度"并点击 Merge;
- 不带词级时间戳→ 在 Resize Options 中设定目标长度并点击 Resize;
- 如需字幕停留更久,在 Extend end time 中填写秒数并点击 Extend endings;
- 返回查看器,点击Export选择 TXT/SRT/VTT 保存结果;
- 若勾选了"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),仅供参考