Bilibili Auto Transcript
支持B站视频一键转录与收藏夹自动扫描,三级降级转录+AI摘要生成。
下载 1,135
使用Python为短视频添加TikTok风格的动态胶囊字幕,支持自定义样式与音频。
openclaw skills install @zero2ai-hub/skill-video-caption-overlay命令、参数、文件名以原文为准
适用于短视频的动态胶囊样式字幕叠加。无需 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 字体。
一个 阶段 数组 —— 每个阶段代表一个时间窗口,包含一个或多个垂直堆叠的胶囊字幕行。
[
{
"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]
}
]
}
]| 字段 | 类型 | 默认值 | 描述 |
|---|---|---|---|
start | float | 必填 | 阶段开始时间(秒) |
end | float | 必填 | 阶段结束时间(秒) |
y_frac | float | 0.06 | 垂直位置,相对于视频高度的比例 |
lines[].text | string | 必填 | 字幕文本内容 |
lines[].size | int | 50 | 字体大小(像素) |
lines[].bold | bool | false | 是否使用粗体(区别于 Black/Heavy 字重) |
lines[].bg | [R,G,B] | [255,255,255] | 胶囊背景颜色 |
lines[].fg | [R,G,B] | [0,0,0] | 文本颜色 |
lines[].bg_opacity | float | 0.93 | 胶囊背景透明度(0–1) |
lines[].px | int | 26 | 水平内边距 |
lines[].py | int | 13 | 垂直内边距 |
lines[].r | int | 18 | 边框圆角半径 |
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 广告结构:
已收录 1 个 Skill