本技能将选题/笔记/文字内容转化为抖音风格的竖版口播短视频。整条流水线在本地完成,不依赖云端剪辑平台。
| 依赖 | 用途 | 检查命令 |
|---|---|---|
| ------ | ------ | ---------- |
| Node.js ≥18 | 脚本 & Remotion | node -v |
| Remotion 4.x | 视频渲染 | npx remotion --version(在 video-pipeline 目录下) |
macOS say 或 MiniMax API | TTS 配音 | which say |
| venus-gemini-image skill | 配图生成 | 检查 skills/venus-gemini-image/scripts/generate_image.py |
| Chrome Headless Shell | Remotion 渲染 | Remotion 自动下载 |
视频工程位于:projects/video-pipeline/
一共 6 步,按顺序执行。整个流程大约 3-8 分钟(取决于配图数量和渲染帧数)。
输入:用户提供的选题来源(Obsidian 笔记路径、文章 URL、直接文字)
操作:
input/videos.json口播文案写作要求(这些很重要,直接决定完播率):
input/videos.json 结构:
{
"defaults": {
"voiceId": "Chinese (Mandarin)_Lyrical_Voice",
"ttsModel": "speech-2.8-turbo",
"speed": 1, "volume": 1, "pitch": 0, "emotion": "calm"
},
"videos": [{
"id": "video-slug-YYYYMMDD",
"title": "视频标题",
"hook": "开头 hook 文案",
"script": ["第 1 段正文", "第 2 段正文", "..."],
"cta": "结尾 CTA 文案",
"cover": "assets/images/<id>/cover.png",
"theme": {
"primary": "#FFDE59",
"background": "#0F172A",
"text": "#FFFFFF"
}
}]
}
cd projects/video-pipeline
node scripts/prepare-input.mjs
这会读取 input/videos.json,为每条视频生成 build/manifests/。manifest 包含 scenes 数组(hook → body × N → cta)、narrationText 等。
每个 scene 需要一张配图。封面 + 每段正文至少各一张,总共 4-8 张。
关键教训:串行生成容易超时/卡死,一定要并行生成。
# 并行启动多个生成任务
python3 skills/venus-gemini-image/scripts/generate_image.py \
--model gemini-3.1-flash-image \
--aspect-ratio 9:16 \
--prompt "<场景描述 prompt>" \
--output projects/video-pipeline/assets/images/<id>/<name>.png
配图 prompt 写法:
vertical 9:16no text, no watermark容错策略:
生成完成后,更新 manifest 中每个 scene 的 image 字段:
# 用 python 脚本更新 manifest 的 scene.image
import json
from pathlib import Path
p = Path('build/manifests/<id>.json')
data = json.loads(p.read_text())
for i, scene in enumerate(data['scenes']):
scene['image'] = f'assets/images/<id>/scene-{i}.png'
p.write_text(json.dumps(data, ensure_ascii=False, indent=2))
同时可以给 scene 加 kind(hook/core/statement/compare/data/cta)、accent、detail 字段来丰富视觉层次。参见 references/scene-kinds.md。
cd projects/video-pipeline
node scripts/synthesize-tts.mjs <video-id>
这会:
say -v Tingting 生成 .m4a 音频(fallback 模式)afinfo 获取真实时长build/subtitles//subtitle.json narration、subtitle、subtitleItems、durationInFramesTTS 注意事项:
.m4a(不能用 .aiff,Remotion 不认 AIFF-C 压缩格式)MINIMAX_API_KEY)cd projects/video-pipeline
node scripts/render-one.mjs <video-id>
渲染过程:
public/render-assets// .tmp/.props.json npx remotion render src/index.ts DouyinVideo renders/.mp4 渲染时间约 1-2 分钟(90 秒视频 ≈ 2700-2800 帧,6 并发)。
成片路径:projects/video-pipeline/renders/
用 message tool 发送:
message action=send media=<mp4_path> caption="<标题>" channel=telegram target=<chat_id>
详细的组件结构参见 references/remotion-components.md。简要说明:
| 组件 | 功能 |
|---|---|
| ------ | ------ |
DouyinVideo | 主 composition:按帧切 scene、叠加字幕、混入音频 |
DouyinScene | 单个分镜:全屏配图 + 渐变遮罩 + 场景标签 + 文字 + 编号 |
DouyinSubtitle | 底部字幕条:半透明背景 + 白色大字 |
通过 kind 字段控制 scene 的视觉呈现:
| kind | 用途 | 视觉特征 |
|---|---|---|
| ------ | ------ | ---------- |
hook | 开头 hook | 大字 + 配图 |
core | 核心论点 | 配图 + 标准文字 |
statement | 观点陈述 | 同 core |
compare | 对比 | 两列对比文字 |
data | 数据/数字高亮 | 超大字号 + 主题色 |
cta | 行动号召 | 收尾配图 + CTA 文字 |
每个 scene 还可以带:
accent:左上角标签文字detail:主文字下方的辅助说明Remotion 的 ffprobe 不认 macOS say 默认的 AIFF-C 压缩格式。解决:TTS 脚本已改为直接输出 .m4a。
Venus API 通过代理调用 Gemini,单张图 30-120 秒不等。串行 7 张可能要 10+ 分钟且容易中途断。解决:并行 4 张起步。
如果 TTS provider 返回的字幕数据为空,fallback 逻辑会从 narrationText 按 \n 分句、按字符比例均匀分配时间。
记得在 .gitignore 里加上 node_modules/。
# 完整流程(在 projects/video-pipeline 目录下)
node scripts/prepare-input.mjs # 1. 准备 manifest
node scripts/synthesize-tts.mjs <id> # 2. TTS + 字幕
node scripts/render-one.mjs <id> # 3. 渲染
# 图片生成(在 workspace 根目录)
python3 skills/venus-gemini-image/scripts/generate_image.py \
--model gemini-3.1-flash-image \
--aspect-ratio 9:16 \
--prompt "..." \
--output projects/video-pipeline/assets/images/<id>/<name>.png
# 查看可用 compositions
cd projects/video-pipeline && npx remotion compositions src/index.ts
共 1 个版本