Communitygithub.com

专业字幕设计

将带时间轴的文字转换为竖屏视频的屏幕字幕。状态:**已实现并测试通过**。

专业字幕设计 是什么?

该技能将带时间轴的单词转换为竖屏视频的屏幕字幕,支持 ASS、SRT 和 WebVTT 格式导出。它通过智能分段、平衡行宽和多种预设样式(如纪录片极简、粗体短片、电影感、情感叙事)确保字幕清晰可读。技能基于 Python 3.10+ 和 Pillow 构建,依赖 fontconfig 进行字体匹配,布局规则包括按实测字体宽度拆分两行、在句子结束或长静默处断句、高亮关键词等。它还会报告布局问题(如行溢出、时间重叠、速度过快),但不针对特定平台进行验证。适用于需要灵活美观字幕的竖屏视频,例如短视频平台或纪录片制作。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/npn160603-hash/universal-video-skills/tree/HEAD/skills/professional-caption-design

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

专业字幕设计 是做什么的?

将带时间轴的单词转换为竖屏视频的屏幕字幕。状态:已实现并测试通过。

目的

将单词分组为可读的提示,以测量好的行宽进行布局,使用一组小型命名样式进行样式设置,导出 ASS / SRT / WebVTT,并报告布局问题。

支持的输入

  • 单词时间轴:JSON 列表,格式为 {"text", "start", "end"} 或 {"words": [...]},时间单位为秒。 文本在加载时规范化为 Unicode NFC,确保越南语变音符号能够可靠比较和渲染。
  • 可选的关键词列表以进行高亮,以及可选标志用于高亮包含数字的标记。

不包括语音转文字。 单词时间轴必须由调用方提供。

支持的输出

  • captions.ass(libass 样式,由渲染管线嵌入)
  • captions.srt,captions.vtt(纯文本,供播放器和平台使用)
  • 问题列表,包含 level(error | warning)、code、message 和 cue 索引

执行

python3 -m uvs.captions examples/demo_caption/words.json --style bold_shorts \
  --keywords "cháo,5" --out-dir out/captions

如果存在任何错误级别的问题,退出码为 1。在 Python 中:uvs.captions.build_captions(...) 然后 write_outputs(build, out_dir)。

参数

  • style:documentary_minimal、bold_shorts、cinematic、emotional_storytelling。 每个样式设置字体、字号、粗细、颜色、轮廓、阴影、底部安全边距(margin_v)、侧边距、最大行数(2)和动画(fade、pop、none)。
  • frame_w、frame_h:默认 1080x1920。
  • SegmentConfig:max_gap(0.45 秒)、max_duration(2.8 秒,目标值)、hard_max_duration (3.4 秒,句子结束可以结束一个最长至此的提示)、min_duration(0.7 秒)。

依赖项

  • Python 3.10+,Pillow。
  • fontconfig(fc-match)用于定位字体文件。没有它,将使用 Pillow 的默认字体,宽度检查是近似的。验证器不会报告该回退,因此请确保安装 fontconfig。
  • 样式中命名字体族(默认为 Inter)必须安装,供 libass 和 fontconfig 使用。

布局规则

  • 宽度使用实际字体文件测量。可用宽度为 frame_w - 2*margin_h - 2*outline。
  • 两行拆分通过测量宽度进行平衡,并在标点符号后断句有少量奖励。
  • 提示在句子结束、长时间静默、持续时间限制或下一个单词无法在两行内容纳时中断。
  • 高亮的关键词使用颜色变化。在 bold_shorts 样式中,它们还会短暂放大(pop)。其他单词不会动画,因此并非每个单词都以相同方式移动。
  • ASS 覆盖语法({、}、\)在用户文本中被替换为相似字符。

示例

examples/demo_caption/words.json 是一个手动计时的越南语占位符。它不匹配真实的叙述。运行演示:python3 -m uvs.render --out out/demo。

约束条件

  • 未根据平台字幕规则(例如每个平台的行长或阅读速度限制)进行验证。too_fast 阈值(每秒 22 个字符)是一个启发式值。
  • 没有说话者感知样式,没有按语言的行断字典(越南语仅在空格处断行)。
  • “Documentary Minimal”、“Bold Shorts”、“Cinematic”、“Emotional Storytelling”已实现。 “Clean Modern”、“Podcast Highlight”和“Educational”未实现。

错误处理

  • 空文本、负时间或乱序时间会在加载时引发 ValueError。
  • 未知样式会引发 KeyError。
  • 布局问题作为问题报告,而不是静默修复:line_overflow、too_many_lines、 overlap、outside_frame、non_positive_duration、empty_cue(错误); short_cue、long_cue、orphan_word、too_fast、space_before_punctuation、 missing_space_after_punctuation、double_space、not_nfc(警告)。
  • 存在错误时 render_captioned 拒绝渲染。

测试

tests/unit/test_captions.py(加载、布局、分段、验证、导出)。 tests/render/test_pipeline.py::RenderTests 渲染演示并检查尺寸、编解码器、帧率, 以及字幕文本是否到达 ASS 文件。

集成

渲染管线(uvs/render.py)调用 build_captions 和 write_outputs,然后使用 ffmpeg -vf ass=... 将 ASS 文件嵌入。样式和关键词选项直接映射到管线的 CLI。

相关技能