mcpField
V
video_toolkit

video_toolkit

github.com/digitalsamba创意与媒体2.4k960 次安装1 天前更新
代码仓库

关于 video_toolkit

video_toolkit 是面向视频创作者的文字简报转解说视频工具包,使用云端 GPU 生成旁白、图像、音乐和人物动画,并以 Remotion 合成渲染。

主要功能

  1. 01从文字简报制作解说视频
  2. 02生成旁白、图像与背景音乐
  3. 03生成视频片段和人物动画
  4. 04通过 Remotion 合成并渲染
  5. 05提供产品演示和回顾模板

适用场景

  1. 01制作产品介绍或营销视频
  2. 02为分镜生成旁白和视觉素材
  3. 03为静态图片添加动态片段

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/digitalsamba/claude-code-video-toolkit --skill video_toolkit

安装后在 Claude Code 中输入/video_toolkit确认已加载。

详细介绍

视频工具包

根据文本简介创建专业的解说视频。该工具包使用云 GPU 上的开源 AI 模型(Modal 或 RunPod)生成旁白、图像和音乐,并制作会说话的人物动画。Remotion(React)负责合成和渲染。

重要:工具包路径

工具包位于固定路径。运行任何工具命令前,务必先 cd 到此处。

TOOLKIT=~/.openclaw/workspace/claude-code-video-toolkit
cd $TOOLKIT

切勿在项目目录中运行工具命令。 工具会相对于工具包根目录解析路径。

重要:进度报告

每条云 GPU 工具命令都务必添加 --progress json。 这会在 stderr 上输出结构化 JSON Lines,让你可以监控作业状态、检测卡住的作业,并实时向用户报告进度。

# CORRECT — always include --progress json
uv run tools/music_gen.py --preset corporate-bg --duration 60 --output bg.mp3 --progress json

# WRONG — no visibility into job status
uv run tools/music_gen.py --preset corporate-bg --duration 60 --output bg.mp3

支持 --progress json 的工具:music_gen.py、qwen3_tts.py、flux2.py、upscale.py、sadtalker.py、image_edit.py、dewatermark.py、ltx2.py、chain_video.py。

有关输出格式和阶段定义,请参阅下方的进度报告部分。

重要:长时间运行的任务——使用 yieldMs,而非 background:true

任何耗时超过 30 秒的工具命令,都必须通过 exec 并设置 yieldMs 运行,以便实时向用户报告进度。 包括:批量 FLUX 生成、chain_video、SadTalker、音乐生成以及任何多场景工作流。

exec command:"cd ~/.openclaw/workspace/claude-code-video-toolkit && uv run tools/chain_video.py --output-dir /path/ --progress json ..." yieldMs:10000

轮询循环:

  1. 使用 yieldMs:10000 调用 exec 启动命令,每 10 秒将控制权交还给你
  2. 阅读 --progress json 输出——查找 "stage":"item"(场景完成)或 "stage":"complete"(全部完成)
  3. 向用户报告进度(“场景 05/30 已完成,17%”)
  4. 再次轮询:process action:poll sessionId:<id>
  5. 重复以上步骤,直到出现 "stage":"complete"

原因: 你的 Agent 运行会在你完成回复后结束。如果使用 bash background:true,你就无法报告进度——用户在提醒你之前只能看到一片沉默。使用 yieldMs,你就能持续跟进。

切勿这样做:

  • 使用 bash background:true command:"long running thing",然后承诺会“监控”——你做不到,运行会结束
  • 将批处理拆分成多条独立工具调用,分散在不同消息中——每次调用之间,你的运行都会结束
  • 承诺“自主继续”——没有外部触发,你根本无法做到

设置

步骤 1:检查当前状态
cd ~/.openclaw/workspace/claude-code-video-toolkit
uv run tools/verify_setup.py

如果所有项目都显示 [x],请跳到下方的“快速测试”。否则继续设置。

步骤 2:安装 Python 依赖项
cd ~/.openclaw/workspace/claude-code-video-toolkit
uv sync

注意:uv sync 会根据锁文件创建自己的 .venv/,因此可绕过 Debian/Ubuntu 对托管 Python 环境的限制(PEP 668)——无需使用 --break-system-packages。如果缺少 uv,请先安装:curl -LsSf https://astral.sh/uv/install.sh | sh。

步骤 3:配置云 GPU 端点

工具包需要在 .env 中配置云 GPU 端点 URL。检查 .env 是否存在并已配置 Modal 端点:

cat ~/.openclaw/workspace/claude-code-video-toolkit/.env | grep MODAL

如果已配置 Modal 端点,即可开始使用。如果没有,请让用户提供 Modal 端点 URL,或设置 Modal:

uv sync --extra modal
uv run modal setup   # Opens browser for authentication

# Deploy each tool — capture the endpoint URL from output
cd ~/.openclaw/workspace/claude-code-video-toolkit
uv run modal deploy docker/modal-qwen3-tts/app.py
uv run modal deploy docker/modal-flux2/app.py
uv run modal deploy docker/modal-music-gen/app.py
uv run modal deploy docker/modal-sadtalker/app.py
uv run modal deploy docker/modal-image-edit/app.py
uv run modal deploy docker/modal-upscale/app.py
uv run modal deploy docker/modal-propainter/app.py
uv run modal deploy docker/modal-ltx2/app.py      # Requires: uv run modal secret create huggingface-token HF_TOKEN=hf_...

LTX-2 前置要求: 部署 LTX-2 前,请创建 HuggingFace 密钥并接受 Gemma 3 许可证:

uv run modal secret create huggingface-token HF_TOKEN=hf_your_read_access_token

将每个 URL 添加到 .env:

ACEMUSIC_API_KEY=...                          # Free key from acemusic.ai/api-key (best music quality)
MODAL_QWEN3_TTS_ENDPOINT_URL=https://...modal.run
MODAL_FLUX2_ENDPOINT_URL=https://...modal.run
MODAL_MUSIC_GEN_ENDPOINT_URL=https://...modal.run
MODAL_SADTALKER_ENDPOINT_URL=https://...modal.run
MODAL_IMAGE_EDIT_ENDPOINT_URL=https://...modal.run
MODAL_UPSCALE_ENDPOINT_URL=https://...modal.run
MODAL_DEWATERMARK_ENDPOINT_URL=https://...modal.run
MODAL_LTX2_ENDPOINT_URL=https://...modal.run

可选但建议配置——使用 Cloudflare R2 进行可靠的文件传输:

R2_ACCOUNT_ID=...
R2_ACCESS_KEY_ID=...
R2_SECRET_ACCESS_KEY=...
R2_BUCKET_NAME=video-toolkit
步骤 4:验证并快速测试
cd ~/.openclaw/workspace/claude-code-video-toolkit
uv run tools/verify_setup.py

所有工具都应显示 [x]。然后运行快速测试,确认 GPU 工作流正常:

cd ~/.openclaw/workspace/claude-code-video-toolkit
uv run tools/qwen3_tts.py --text "Hello, this is a test." --speaker Ryan --tone warm --output /tmp/video-toolkit-test.mp3 --cloud modal

如果生成了有效的 .mp3 文件,说明设置已完成。如果失败,请检查:

  • .env 中的 MODAL_QWEN3_TTS_ENDPOINT_URL 是否正确
  • 运行 uv run tools/verify_setup.py --json,并检查 modal_tools,确认缺少哪些端点

费用: Modal 每月提供价值 $30 的免费计算额度。典型的 60s 视频费用为 $1-3。


创建视频

步骤 1:创建项目
cd ~/.openclaw/workspace/claude-code-video-toolkit
cp -r templates/product-demo projects/PROJECT_NAME
cd projects/PROJECT_NAME
npm install

模板:product-demo(营销/解说)、sprint-review、sprint-review-v2(可组合场景)。

步骤 2:编写配置

编辑 projects/PROJECT_NAME/src/config/demo-config.ts:

export const demoConfig: ProductDemoConfig = {
  product: {
    name: 'My Product',
    tagline: 'What it does in one line',
    website: 'example.com',
  },
  scenes: [
    { type: 'title', durationSeconds: 9, content: { headline: '...', subheadline: '...' } },
    { type: 'problem', durationSeconds: 14, content: { headline: '...', problems: ['...', '...'] } },
    { type: 'solution', durationSeconds: 13, content: { headline: '...', highlights: ['...', '...'] } },
    { type: 'stats', durationSeconds: 12, content: { stats: [{value: '99%', label: '...'}, ...] } },
    { type: 'cta', durationSeconds: 10, content: { headline: '...', links: ['...'] } },
  ],
  audio: {
    backgroundMusicFile: 'audio/bg-music.mp3',
    backgroundMusicVolume: 0.12,
  },
};

场景类型:title、problem、solution、demo、feature、stats、cta。

时长规则: 将 durationSeconds 估算为 ceil(word_count / 2.5) + 2。在步骤 4 生成音频后再调整。

步骤 3:编写旁白脚本

创建 projects/PROJECT_NAME/VOICEOVER-SCRIPT.md:

## Scene 1: Title (9s, ~17 words)
Build videos with AI. The product name toolkit makes it easy.

## Scene 2: Problem (14s, ~30 words)
The problem statement goes here. Keep it punchy and relatable.

每个场景的字数预算: (durationSeconds - 2) * 2.5 个词。减去的 2 秒用于 1 秒音频延迟和 1 秒留白。

步骤 4:生成素材

重要:以下所有命令都必须从工具包根目录运行,而不是从项目目录运行。

cd ~/.openclaw/workspace/claude-code-video-toolkit
4a. 背景音乐

默认提供方为 acemusic(官方云 API,可免费获取密钥)。无需 GPU。无法使用时会回退到 Modal/RunPod 自托管服务。

cd ~/.openclaw/workspace/claude-code-video-toolkit

# Using acemusic cloud API (default — best quality, XL Turbo 4B model)
uv run tools/music_gen.py \
  --preset corporate-bg \
  --duration 90 \
  --output projects/PROJECT_NAME/public/audio/bg-music.mp3 \
  --progress json

# Or with custom prompt and thinking mode
uv run tools/music_gen.py \
  --prompt "Subtle ambient tech, soft synth pads" \
  --duration 90 \
  --output projects/PROJECT_NAME/public/audio/bg-music.mp3 \
  --progress json

# Fall back to self-hosted Modal if no acemusic key
uv run tools/music_gen.py \
  --preset corporate-bg \
  --duration 90 \
  --output projects/PROJECT_NAME/public/audio/bg-music.mp3 \
  --cloud modal --progress json

预设:corporate-bg、upbeat-tech、ambient、dramatic、tension、hopeful、cta、lofi。

设置:echo "ACEMUSIC_API_KEY=your_key" >> .env(在 acemusic.ai/api-key 获取免费密钥)。

4b. 旁白(每个场景单独生成)

每个场景生成一个 .mp3 文件。不要只生成一个旁白文件。

cd ~/.openclaw/workspace/claude-code-video-toolkit

# Scene 01
uv run tools/qwen3_tts.py \
  --text "The voiceover text for scene one." \
  --speaker Ryan --tone warm \
  --output projects/PROJECT_NAME/public/audio/scenes/01.mp3 \
  --cloud modal --progress json

# Scene 02
uv run tools/qwen3_tts.py \
  --text "The voiceover text for scene two." \
  --speaker Ryan --tone warm \
  --output projects/PROJECT_NAME/public/audio/scenes/02.mp3 \
  --cloud modal --progress json

# ... repeat for each scene

说话人: Ryan、Aiden、Vivian、Serena、Uncle_Fu、Dylan、Eric、Ono_Anna、Sohee 语气: neutral、warm、professional、excited、calm、serious、storyteller、tutorial

语音克隆(需要参考录音):

cd ~/.openclaw/workspace/claude-code-video-toolkit
uv run tools/qwen3_tts.py \
  --text "Text to speak" \
  --ref-audio assets/voices/reference.m4a \
  --ref-text "Exact transcript of the reference audio" \
  --output projects/PROJECT_NAME/public/audio/scenes/01.mp3 \
  --cloud modal --progress json
4c. 场景图像
cd ~/.openclaw/workspace/claude-code-video-toolkit
uv run tools/flux2.py \
  --prompt "Dark tech background with blue geometric grid, cinematic lighting" \
  --width 1920 --height 1080 \
  --output projects/PROJECT_NAME/public/images/title-bg.png \
  --cloud modal --progress json

图像预设(使用 --preset,而不是 --prompt --width --height): title-bg、problem、solution、demo-bg、stats-bg、cta、thumbnail、portrait-bg

cd ~/.openclaw/workspace/claude-code-video-toolkit
uv run tools/flux2.py \
  --preset title-bg \
  --output projects/PROJECT_NAME/public/images/title-bg.png \
  --cloud modal --progress json
4d. 视频片段 — B-Roll 和动态背景(可选)

生成 AI 视频片段,用作 B-Roll 切换镜头、动态幻灯片背景或片头/片尾序列:

cd ~/.openclaw/workspace/claude-code-video-toolkit

# B-roll clip from text
uv run tools/ltx2.py \
  --prompt "Aerial drone shot over a European city at golden hour, cinematic wide angle" \
  --output projects/PROJECT_NAME/public/videos/broll-europe.mp4 \
  --cloud modal --progress json

# Animate a slide/screenshot (image-to-video)
uv run tools/ltx2.py \
  --prompt "Gentle particle effects, soft ambient light shifts, very slight camera drift" \
  --input projects/PROJECT_NAME/public/images/title-bg.png \
  --output projects/PROJECT_NAME/public/videos/animated-title.mp4 \
  --cloud modal --progress json

# Abstract intro/outro background
uv run tools/ltx2.py \
  --prompt "Dark moody abstract background with flowing blue light streaks, bokeh particles, cinematic" \
  --output projects/PROJECT_NAME/public/videos/intro-bg.mp4 \
  --cloud modal --progress json

在 Remotion 合成中使用 <OffthreadVideo>:

<OffthreadVideo src={staticFile('videos/broll-europe.mp4')} />

LTX-2 规则:

  • 每个片段最长约 8 秒(24fps 下为 193 帧)。默认约 5 秒(121 帧)。
  • 宽度和高度必须能被 64 整除。默认值:768x512。
  • 每个片段约 $0.20-0.25,生成时间约 2.5 分钟。
  • 冷启动约需 60-90 秒。GPU 预热后,后续片段生成更快。
  • 生成的音频仅为环境音;语音和音乐请使用旁白/音乐工具。
  • 约 30% 的生成结果可能包含训练数据残留(徽标/文字)。使用 --seed 重新运行即可更换结果。
4d-chain. 链式视频序列(视觉连贯性)

生成一系列视频片段,每个场景都从上一个场景的最后一帧衔接开始。整个流程通过单条命令运行,无需在场景之间手动调整。

cd ~/.openclaw/workspace/claude-code-video-toolkit

# Chain scenes 1-30 from a directory of FLUX images
uv run tools/chain_video.py \
  --scenes-dir projects/PROJECT_NAME/public/images/scenes/ \
  --output-dir projects/PROJECT_NAME/public/videos/chain/ \
  --prompt "Cinematic continuation, flowing transition" \
  --start 1 --end 30 \
  --progress json

# Resume from scene 10 (skips existing files automatically)
uv run tools/chain_video.py \
  --scenes-dir projects/PROJECT_NAME/public/images/scenes/ \
  --output-dir projects/PROJECT_NAME/public/videos/chain/ \
  --start 10 --end 30 \
  --progress json

# Per-scene prompts from JSON file
uv run tools/chain_video.py \
  --scenes-dir projects/PROJECT_NAME/public/images/scenes/ \
  --output-dir projects/PROJECT_NAME/public/videos/chain/ \
  --prompts-file projects/PROJECT_NAME/scenes.json \
  --progress json

# Chain from an existing clip (no scene images needed)
uv run tools/chain_video.py \
  --first-clip output/chain-04.mp4 \
  --output-dir output/ \
  --start 5 --end 30 \
  --prompt "Celtic mythology, flowing transition" \
  --progress json

提示词文件格式(scenes.json):

{"1": "Ancient stone circle at dawn", "2": "Celtic spirals emerge from stone", "3": "Portal opens with golden light"}

链式生成规则:

  • 提取场景 N 的最后一帧,并通过 LTX-2 将其作为场景 N+1 的 --input
  • 跳过磁盘上已存在的场景(可安全恢复运行)
  • 如果链式生成失败,则回退使用 --scenes-dir 中的场景图像
  • 使用 --prefix 设置输出文件名前缀(默认值:chain)
  • 每个场景约需 2.5 分钟,每个片段约需 $0.20-0.25
  • 额外参数(例如 --negative-prompt、--seed)会传递给 ltx2.py

重要:链式序列中的风格漂移。 LTX-2 的训练数据中约有 30% 被动漫/亚洲内容污染。像“cinematic transition”这样的通用提示词会在链式生成 5-10 个场景后逐渐偏向动漫风格。要避免这种情况:

  1. 始终使用 --prompts-file 为每个场景指定具体提示词,切勿为整个链条使用单个通用提示词
  2. 始终添加 --negative-prompt 排除不需要的风格:
    --negative-prompt "anime, manga, asian, cartoon, illustration, watermark, text, logo"
    
  3. 每个场景的提示词都应包含有力的风格锚点(例如“爱尔兰风景、凯尔特结饰、油画风格”),而不只是描述主体

重要:使用 yieldMs 运行,以实时报告进度。 不要将任务拆分为逐场景的工具调用——OpenClaw 的 Agent 运行会在调用之间结束,导致序列停滞。应改用带 yieldMs 的 exec,这样你就能持续跟进并向用户报告进度:

exec command:"cd ~/.openclaw/workspace/claude-code-video-toolkit && uv run tools/chain_video.py --scenes-dir /path/to/images/ --output-dir /path/to/output/ --prompts-file scenes.json --progress json" yieldMs:10000

工作原理:

  • yieldMs:10000 每 10 秒将控制权交还给你
  • 读取 --progress json 输出(stderr 上带有 stage/pct/msg 的 JSON Lines)
  • 向用户报告进度(“场景 05/30 已完成,17%”)
  • 然后再次轮询:process action:poll sessionId:<id>
  • 重复以上操作,直到出现 "stage":"complete"

所有长时间运行的工具命令都应使用这种正确模式(chain_video、批量 flux、批量 sadtalker 等)。切勿使用 bash background:true 后就置之不理——应使用 exec + yieldMs + process poll 循环,以便实时报告进度。

4e. 说话头像旁白(可选)

生成演示者肖像,然后按场景制作动画片段:

cd ~/.openclaw/workspace/claude-code-video-toolkit

# 1. Generate portrait
uv run tools/flux2.py \
  --prompt "Professional presenter portrait, clean style, dark background, facing camera, upper body" \
  --width 1024 --height 576 \
  --output projects/PROJECT_NAME/public/images/presenter.png \
  --cloud modal --progress json

# 2. Generate per-scene narrator clips (one per scene, NOT one long video)
uv run tools/sadtalker.py \
  --image projects/PROJECT_NAME/public/images/presenter.png \
  --audio projects/PROJECT_NAME/public/audio/scenes/01.mp3 \
  --preprocess full --still --expression-scale 0.8 \
  --output projects/PROJECT_NAME/public/narrator-01.mp4 \
  --cloud modal --progress json

# Repeat for each scene that needs a narrator

SadTalker 规则——请严格遵守:

  • 始终使用 --preprocess full(默认的 crop 会输出错误宽高比的正方形图像)
  • 始终使用 --still(减少头部移动,效果更专业)
  • 始终按场景生成片段(每段 6-15 秒),切勿生成一条长视频
  • 处理时间:在 Modal A10G 上,每 10 秒音频约需 3-4 分钟
  • --expression-scale 0.8 可让表情保持细微自然(范围为 0.0-1.5)
4e. 图像编辑(可选)

根据现有图像创建场景变体:

cd ~/.openclaw/workspace/claude-code-video-toolkit
uv run tools/image_edit.py \
  --input projects/PROJECT_NAME/public/images/title-bg.png \
  --prompt "Make it darker with red tones, more ominous" \
  --output projects/PROJECT_NAME/public/images/problem-bg.png \
  --cloud modal --progress json
4f. 放大(可选)
cd ~/.openclaw/workspace/claude-code-video-toolkit
uv run tools/upscale.py \
  --input projects/PROJECT_NAME/public/images/some-image.png \
  --output projects/PROJECT_NAME/public/images/some-image-4x.png \
  --scale 4 --cloud modal --progress json
步骤 5:同步时间

生成旁白后务必执行此操作。 音频时长与预估值不同。

cd ~/.openclaw/workspace/claude-code-video-toolkit
for f in projects/PROJECT_NAME/public/audio/scenes/*.mp3; do
  echo "$(basename $f): $(ffprobe -v error -show_entries format=duration -of csv=p=0 "$f")s"
done

将 demo-config.ts 中每个场景的 durationSeconds 更新为:ceil(实际音频时长 + 2)。

示例:如果 01.mp3 时长为 6.8 秒,则将场景 1 的 durationSeconds 设为 9(ceil(6.8 + 2) = 9)。

步骤 6:检查静帧
cd ~/.openclaw/workspace/claude-code-video-toolkit/projects/PROJECT_NAME
npx remotion still src/index.ts ProductDemo --frame=100 --output=/tmp/review-scene1.png
npx remotion still src/index.ts ProductDemo --frame=400 --output=/tmp/review-scene2.png

检查:文字是否被截断、动画时序、旁白画中画的位置、背景对比度。

步骤 7:渲染
cd ~/.openclaw/workspace/claude-code-video-toolkit/projects/PROJECT_NAME
npm run render

输出: out/ProductDemo.mp4


构图模式

每个场景的音频

每个场景使用独立音频,并延迟 1 秒播放(from={30} = 30 帧 = 在 30fps 下为 1 秒):

<Sequence from={30}>
  <Audio src={staticFile('audio/scenes/01.mp3')} volume={1} />
</Sequence>
每个场景的旁白画中画
<Sequence from={30}>
  <OffthreadVideo
    src={staticFile('narrator-01.mp4')}
    style={{ width: 320, height: 180, objectFit: 'cover' }}
    muted
  />
</Sequence>

始终使用 <OffthreadVideo>,切勿使用 <video>。 Remotion 需要使用自己的组件才能进行帧精确渲染。

转场
import { TransitionSeries, linearTiming } from '@remotion/transitions';
import { fade } from '@remotion/transitions/fade';
import { glitch } from '../../../lib/transitions/presentations/glitch';
import { lightLeak } from '../../../lib/transitions/presentations/light-leak';

切勿从 lib/transitions 汇总入口导入——请直接从 lib/transitions/presentations/ 导入自定义转场。


进度报告

所有云端 GPU 工具都支持结构化进度输出,以便自动监控。

用法

在任意工具命令中添加 --progress json,即可在 stderr 上获取 JSON Lines:

cd ~/.openclaw/workspace/claude-code-video-toolkit
uv run tools/music_gen.py \
  --preset corporate-bg --duration 60 \
  --output projects/PROJECT_NAME/public/audio/bg-music.mp3 \
  --progress json
输出格式

stderr 中的每一行都是一个 JSON 对象:

{"ts":"14:23:15","stage":"submit","msg":"Sending to acemusic.ai (XL Turbo 4B, thinking: on)...","pct":null,"elapsed":0.0}
{"ts":"14:23:30","stage":"waiting","msg":"Waiting for acemusic.ai response... (15s)","pct":null,"elapsed":15.0}
{"ts":"14:23:45","stage":"waiting","msg":"Waiting for acemusic.ai response... (30s)","pct":null,"elapsed":30.0}
{"ts":"14:24:02","stage":"complete","msg":"Saved: bg-music.mp3 (245 KB, 60.1s)","pct":100,"elapsed":47.3}
阶段
阶段含义
submit已向服务提供商提交任务
queueRunPod:正在等待 GPU
processingRunPod:GPU 正在处理
waiting同步调用期间的心跳(acemusic、Modal)
complete任务已成功完成
error出现错误 — 查看 msg 了解详情
item多项任务进度(例如,场景 3/7)— 已填充 pct
cost操作的预估费用
各服务提供商的行为
  • acemusic:发出 submit → 定期发出 waiting 心跳(每 15s)→ complete
  • RunPod:发出 submit → queue → processing → complete(每次轮询时)
  • Modal:发出 submit → 定期发出 waiting 心跳 → complete

默认模式(--progress human)会将相同事件显示为带颜色的终端输出 — 现有行为不变。


错误恢复

问题解决方案
工具命令失败并提示 "No module named..."在 toolkit 根目录运行 uv sync,并通过 uv run 调用工具
"MODAL_*_ENDPOINT_URL not configured"检查 .env 中是否配置了端点 URL。运行 uv run tools/verify_setup.py
SadTalker 输出为方形/被裁切忘记使用 --preprocess full。使用该标志重新运行
音频对场景来说过短/过长重新运行步骤 5(同步时序)并更新配置
npm run render 失败确保当前位于项目目录,而不是 toolkit 根目录。先运行 npm install
Remotion 中出现 "Cannot find module"检查导入路径。自定义组件使用 ../../../lib/ 相对路径
Modal 冷启动超时空闲后首次调用需要 30-120s。重试一次 — 第二次调用会使用已预热的 GPU
SadTalker 客户端超时(音频较长)客户端 HTTP 请求可能会在 Modal 完成前超时。Modal 仍会将结果上传到 R2。 在 video-toolkit R2 存储桶中检查 sadtalker/results/ 下的输出。使用 .env 中的 R2 凭据,通过 uv run python -c "import boto3; ..." 列出文件并生成预签名 URL

费用估算(Modal)

工具典型费用备注
Qwen3-TTS~$0.01/场景GPU 预热时每个场景约 20s
FLUX.2~$0.01/张图像预热时约 3s,冷启动时约 30s
ACE-Step~$0.02-0.05取决于时长
SadTalker~$0.05-0.20/场景每 10s 音频约需 3-4 min
Qwen-Edit~$0.03-0.15冷启动约需 8 min(25GB 模型)
RealESRGAN~$0.005/张图像速度非常快
LTX-2.3~$0.20-0.25/片段A100-80GB 上每个 5s 片段约需 2.5 min

**一段 60s 视频的总费用:**约 $1-3,具体取决于场景和旁白片段。

Modal Starter 套餐:每月 $30 的免费计算额度。应用在空闲时会缩容至零。

评论

支持 Markdown