技能标识:skill-video-caption-overlay
Render TikTok-style animated pill captions onto short-form videos using MoviePy + PIL. Takes a base MP4, a captions JSON, and optional background audio — outputs a final video with fade-in/out pill overlays. Fixes the PIL textbbox y-offset bug that causes text to sit outside pill boundaries. Use for TikTok ads, Reels, YouTube Shorts.
用于短视频的动画药丸式字幕叠加。无需Premiere,无需CapCut——纯Python实现。
bash
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参数。
bash
--font-black /path/to/Montserrat-Black.ttf \
--font-bold /path/to/Montserrat-Bold.ttf
若未指定字体,则默认从~/.local/share/fonts/目录加载Montserrat字体。
阶段数组——每个阶段是一个时间窗口,包含一个或多个垂直堆叠的药丸式字幕行。
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: 多喝水,
size: 50,
bg: [255, 255, 255],
fg: [0, 0, 0]
}
]
}
]
| 字段 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| start | float | 必填 | 阶段开始时间(秒) |
| end |
PIL的textbbox((0,0), text, font)返回(x0, y0, x1, y1),其中y0是一个非零偏移量(根据字体大小通常为7-15像素)。在(x, y)位置绘制文本时若不补偿此偏移量,会导致文本显示在药丸视觉中心的下方。
在pill()中实现的修正方法:
python
bb = draw.textbbox((0, 0), text, font=font)
xoff, yoff = bb[0], bb[1]
vis_w = bb[2] - bb[0] # 实际视觉宽度
vis_h = bb[3] - bb[1] # 实际视觉高度
NotoColorEmoji.ttf在任意尺寸下均无法与PIL正常配合使用(位图字体仅支持有限尺寸)。请使用文本替代方案(例如使用免费配送代替免费配送 🚚)以确保可靠渲染。
请参阅scripts/example_captions.json获取完整的3阶段TikTok广告结构:
以下为平台配置的接入选项,并非逐项实测通过。能否安装取决于客户端支持、技能来源和运行环境:
帮我安装 SkillHub 和 skill-video-caption-overlay-1776288622 技能
设置 SkillHub 为我的优先技能安装源,然后帮我安装 skill-video-caption-overlay-1776288622 技能
skillhub install skill-video-caption-overlay-1776288622
文件大小: 5.4 KB | 发布时间: 2026-4-16 16:11