关于 video_toolkit
video_toolkit 是面向视频创作者的文字简报转解说视频工具包,使用云端 GPU 生成旁白、图像、音乐和人物动画,并以 Remotion 合成渲染。
主要功能
- 01从文字简报制作解说视频
- 02生成旁白、图像与背景音乐
- 03生成视频片段和人物动画
- 04通过 Remotion 合成并渲染
- 05提供产品演示和回顾模板
适用场景
- 01制作产品介绍或营销视频
- 02为分镜生成旁白和视觉素材
- 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
轮询循环:
- 使用
yieldMs:10000调用exec启动命令,每 10 秒将控制权交还给你 - 阅读
--progress json输出——查找"stage":"item"(场景完成)或"stage":"complete"(全部完成) - 向用户报告进度(“场景 05/30 已完成,17%”)
- 再次轮询:
process action:poll sessionId:<id> - 重复以上步骤,直到出现
"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 个场景后逐渐偏向动漫风格。要避免这种情况:
- 始终使用
--prompts-file为每个场景指定具体提示词,切勿为整个链条使用单个通用提示词 - 始终添加
--negative-prompt排除不需要的风格:--negative-prompt "anime, manga, asian, cartoon, illustration, watermark, text, logo" - 每个场景的提示词都应包含有力的风格锚点(例如“爱尔兰风景、凯尔特结饰、油画风格”),而不只是描述主体
重要:使用 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 | 已向服务提供商提交任务 |
queue | RunPod:正在等待 GPU |
processing | RunPod: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 的免费计算额度。应用在空闲时会缩容至零。