Skill Video Caption Overlay

使用Python为短视频添加TikTok风格的动态胶囊字幕,支持自定义样式与音频。

已扫描
适合谁
短视频创作者、数字营销人员
不适合谁
无编程基础的普通用户、需要图形化界面操作者
国内可用性
需网络配置。可能需要网络配置或第三方服务可访问。
安装难度
新手友好(★☆☆)。基于终端操作、依赖、API Key 和本地环境要求的初步判断。

安装与下载

openclaw skills install @zero2ai-hub/skill-video-caption-overlay

Skill 说明

命令、参数、文件名以原文为准

视频字幕叠加

适用于短视频的动态胶囊样式字幕叠加。无需 Premiere,无需 CapCut — 全 Python 实现。

使用方法

uv run --with moviepy --with pillow scripts/overlay.py \
  --video base.mp4 \
  --output final.mp4 \
  --captions scripts/example_captions.json \
  --audio music.mp3 \
  --audio-start 8 \
  --audio-vol 0.5

若希望保留原始视频音频,请省略 --audio 参数。

自定义字体

--font-black /path/to/Montserrat-Black.ttf \
--font-bold  /path/to/Montserrat-Bold.ttf

若未指定,则自动回退至 ~/.local/share/fonts/ 目录下的 Montserrat 字体。

captions.json 格式

一个 阶段 数组 —— 每个阶段代表一个时间窗口,包含一个或多个垂直堆叠的胶囊字幕行。

[
  {
    "start": 0,
    "end": 3.2,
    "y_frac": 0.06,
    "lines": [
      {
        "text": "POV:",
        "size": 28,
        "bold": true,
        "bg": [0, 195, 255],
        "fg": [0, 0, 0],
        "bg_opacity": 0.9,
        "px": 20, "py": 9, "r": 12
      },
      {
        "text": "drink more water",
        "size": 50,
        "bg": [255, 255, 255],
        "fg": [0, 0, 0]
      }
    ]
  }
]
字段类型默认值描述
startfloat必填阶段开始时间(秒)
endfloat必填阶段结束时间(秒)
y_fracfloat0.06垂直位置,相对于视频高度的比例
lines[].textstring必填字幕文本内容
lines[].sizeint50字体大小(像素)
lines[].boldboolfalse是否使用粗体(区别于 Black/Heavy 字重)
lines[].bg[R,G,B][255,255,255]胶囊背景颜色
lines[].fg[R,G,B][0,0,0]文本颜色
lines[].bg_opacityfloat0.93胶囊背景透明度(0–1)
lines[].pxint26水平内边距
lines[].pyint13垂直内边距
lines[].rint18边框圆角半径

PIL textbbox 修复

PIL 的 textbbox((0,0), text, font) 返回 (x0, y0, x1, y1),其中 y0 是一个非零偏移量(通常为 7–15px,取决于字体大小)。若在绘制文本时未补偿此偏移,会导致文字显示位置低于胶囊视觉中心。

**pill() 函数中已实现修复:**

bb    = draw.textbbox((0, 0), text, font=font)
x_off, y_off = bb[0], bb[1]
vis_w = bb[2] - bb[0]   # 实际可视宽度
vis_h = bb[3] - bb[1]   # 实际可视高度

# 绘制文本时补偿偏移
tx = cx - vis_w // 2 - x_off
ty = y - y_off
draw.text((tx, ty), text, font=font, fill=fg)

表情符号说明

NotoColorEmoji.ttf 在 PIL 中对任意尺寸存在兼容性问题(位图字体,支持尺寸有限)。为确保渲染稳定,建议使用文字替代形式(例如用 "Free delivery" 替代 "Free delivery 🚚")。

示例输出

参见 scripts/example_captions.json 获取完整三阶段 TikTok 广告结构:

  • 第一阶段(0–3.2秒):钩子 —— 顶部屏幕胶囊堆叠
  • 第二阶段(2.8–5.8秒):产品主张 —— 重叠渐变效果
  • 第三阶段(5.3–8.0秒):行动号召 —— 底部屏幕价格 + 配送信息 + 个人主页链接
ZH
@zero2ai-hub

已收录 1 个 Skill

相关推荐