通过火山方舟Ark API调用Seedance 2.0生成第一人称带货短视频,v2 新增剧本驱动的配音(edge-tts/火山TTS)、背景音乐自动混音、字幕烧录,内置 8 套人设模板(传统女、时尚主播、老中医、厨房主妇、美妆博主、健身教练、户外探店、数码博主)。触发词:生成视频、带货视频、产品视频、拍视频、剧本...
产品图 + 剧本 → 带配音、背景音乐、字幕的第一人称带货短视频。 内置 8 套人设模板,一句话指定品类即可自动选模板。
模块v1v2(本次)视频生成Seedance 2.0 ✅Seedance 2.0 ✅配音❌edge-tts(默认免费) / 火山 TTS(可选) ✅背景音乐❌ffmpeg 自动循环+降音量+淡出 ✅字幕❌按行字数比例切时间轴 + 烧录 ✅人设模板1 套(传统女)8 套(按品类自动推荐) ✅剧本驱动❌JSON 剧本一键端到端 ✅
text
huo15-influencer-video-skill/
├── SKILL.md # 本文档
├── _meta.json
├── scripts/
│ ├── templates.py # 8 套人设模板配置
│ ├── tts.py # 配音引擎(edge-tts + 火山)
│ ├── bgm.py # BGM 库 + 混音 + 视频/音频合并
│ └── pipeline.py # 端到端 pipeline(推荐入口)
└── examples/
├── script_traditional_lady.json
├── script_fashion_host.json
└── script_auto_template.json
bash
# 必需
brew install ffmpeg
pip install edge-tts requests
# 视频生成
export ARK_API_KEY=ak-xxxxx # 方舟控制台获取
# 可选:火山 TTS(不设则降级到 edge-tts,免费但音质稍弱)
export VOLC_TTS_APP_ID=xxxxx
export VOLC_TTS_TOKEN=xxxxx
export VOLC_TTS_CLUSTER=volcano_tts
# 可选:BGM 库目录(默认 ~/Music/huo15-bgm/)
export HUO15_BGM_DIR=~/Music/huo15-bgm
把 5 个免版税音乐放到 ~/Music/huo15-bgm/(缺哪个跳过哪个,不影响视频生成):
文件名风格推荐用途下载关键词warm.mp3温暖钢琴养生/食品/手工warm piano backgroundenergetic.mp3活力电子美妆/服装/直播upbeat electronicasian.mp3中国风古筝中药/茶/古风chinese guzhengsoft.mp3柔和氛围数码/护肤soft ambient padcinematic.mp3电影弦乐户外/特产cinematic strings
下载渠道: Pixabay Music(CC0)、 Freesound、 Incompetech(注明出处)。
key角色推荐音色推荐 BGM适用品类traditional_lady传统中年女性(默认)晓秋(沉稳)warm养生 / 茶叶 / 手工 / 古法食品fashion_host时尚女主播晓晓(活泼)energetic美妆 / 服装 / 饰品 / 数码配件tcm_doctor老中医云健(沉稳男)asian中药 / 保健品 / 膏方 / 艾灸kitchen_mom厨房主妇晓涵(温暖)warm调味料 / 食材 / 厨具 / 速食beauty_blogger美妆博主晓梦(活泼)soft护肤 / 彩妆 / 香水 / 美容仪fitness_coach健身教练云皓(激情男)energetic蛋白粉 / 运动器材 / 补剂outdoor_explorer户外探店达人云夏(轻快男)cinematic地方特产 / 户外装备 / 民俗tech_geek数码博主云扬(专业男)soft手机 / 耳机 / 智能家居 / 电脑
json
{ "template": "auto", "category": "蛋白粉", ... }
→ 命中 fitness_coach。无匹配回退 traditional_lady。
json
{
"template": "traditional_lady",
"image": "/path/to/product.jpg",
"lines": [
{"text": "姐妹们,今天给大家推一款好东西", "action": "举起产品给镜头"},
{"text": "古法配方,纯手工制作", "action": "微笑展示产品细节"},
{"text": "用过的姐妹都说好", "action": "点头肯定"}
],
"bgm": "warm",
"bgm_volume": 0.18,
"subtitle": true,
"voice_override": null,
"rate_override": null,
"output": "/tmp/huo15/final.mp4"
}
字段必填说明template✅模板 key 或 "auto"(配合 category)categorytemplate=auto 时必填品类关键词,自动选模板image✅产品图本地路径lines✅数组,每条 {text, action}。 首条 action 会写进 Seedance promptbgm❌BGM key(warm/energetic/...)或绝对路径;null=无 BGMbgm_volume❌01,覆盖模板默认(0.180.25 较合适)subtitle❌默认 true;烧录字幕到视频voice_override❌强制换音色,如 "zh-CN-XiaoxiaoNeural"``rate_override❌强制改语速,如 "+10%"``output❌成片路径
整段配音必须 ≤ 14.5 秒(Seedance 单次最长 15s)。中文约 50~70 字。 超长会抛错并提示精简,不强行截断。
bash
cd huo15-influencer-video-skill
# 自检 — 第一次跑先做这一步
python3 scripts/pipeline.py preflight
# 列出 8 套人设模板 / 8 个推荐音色
python3 scripts/pipeline.py templates
python3 scripts/pipeline.py voices
# dry-run — 只跑 TTS + 字幕,不调 Seedance(省 ¥)
# 用于先验证剧本节奏、TTS 音色、字幕断句
python3 scripts/pipeline.py dry-run examples/script_traditional_lady.json
# 完整端到端
python3 scripts/pipeline.py render examples/script_traditional_lady.json
python
import sys, json
sys.path.insert(0, "scripts")
from pipeline import render
result = render({
"template": "auto",
"category": "蛋白粉",
"image": "/path/to/protein.jpg",
"lines": [
{"text": "兄弟们练完这一组", "action": "拿起产品"},
{"text": "蛋白吸收率高得离谱", "action": "展示成分"},
],
"subtitle": True,
})
print(result)
# {'output': '/tmp/huo15_video/final.mp4', 'template': 'fitness_coach',
# 'voice_duration': 6.2, 'video_duration': 8, 'tokens': 172800,
# 'cost_yuan': 7.95, 'size_mb': 3.1}
需要老接口的话,从 pipeline._generate_silent_video 直接调,跳过 TTS/BGM。
python
result = render(script, dry_run=True)
# 返回:voice_path / srt_path / tokens 预估 / cost_yuan / prompt
# 不调 Seedance,不计费;TTS 是免费的
用途:调剧本节奏、试音色、看字幕断行 —— 全部确认满意再跑 render(dry_run=False)。 Agent 应该在用户首次给剧本时 默认先做 dry-run,把生成的 voice.mp3 路径告诉用户试听。
当用户说"用这张图按这个剧本拍带货视频"时,按下面的步骤走:
templates.suggest_template(category)estimate_cost),告知用户render(script) 端到端text
用户: 用 product.jpg 拍个卖蛋白粉的,3 句台词,自己想词
Agent: 我帮您起草剧本,按健身教练模板(云皓男声 + energetic BGM):
1) 兄弟们,练完这一组
2) 蛋白吸收率高得离谱
3) 练大一年,从这罐开始
预估视频时长 8s ≈ ¥7.95,配音免费。确认生成?
用户: 行
Agent: [render] → /tmp/huo15/protein.mp4 (3.1MB),实际 ¥7.95
项值模型doubao-seedance-2-0-260128端点https://ark.cn-beijing.volces.com/api/v3计费Token = 秒 × 720 × 1280 × 24 / 1024, ¥ = Token × 46 / 1e6比例9:16 竖屏带货时长4 ~ 15 秒时长Token费用4s86,400¥3.975s108,000¥4.9710s216,000¥9.9415s324,000¥14.90
content 中的 role:
role用途reference_image默认;AI 参考产品外观first_frame视频必须从这张图开始last_frame指定结束画面reference_video运动风格参考reference_audio音频风格参考
text
voice 主轨 ──┐
├─ amix(duration=first) ─ afade(out, 0.5s) ─→ mixed.mp3
BGM 副轨 ────┘ (BGM aloop 到与 voice 等长,volume=bgm_volume)
bgm_volume 默认 0.18~0.25。模板已按角色调过,一般不用改。voice_volume 默认 1.0;想突出 BGM 可降到 0.85。成片合成: mux_video_audio(silent.mp4, mixed.mp3, final.mp4) —
-c:v copy -c:a aac -shortest,无视频重编码,秒出。
subtitles 滤镜烧录到视频"subtitle": false字体不可用时报 Fontconfig error,换 font: "Heiti SC" 或装 brew install --cask font-noto-sans-cjk-sc。
失败降级行为火山 TTS 凭证缺失自动用 edge-ttsedge-tts 也挂抛错,提示 pip install edge-tts 并检查网络BGM 文件找不到跳过 BGM,仅人声 + 0.5s 淡出字体找不到subtitle: false 重跑,或装中文字体Seedance 超时默认 20 分钟轮询,超时抛 TimeoutError
A: 在 lines.text 里用谐音字。edge-tts 不支持 SSML phoneme tag。
A: 剧本里 "bgm_volume": 0.12 进一步压低,或换 soft.mp3。
A: 剧本里 "bgm": null。
A: 当前版本不支持。建议拆段:每段 ≤15s 单独生成,再用 ffmpeg concat 拼接。
A: 把第一句的 action 写得更具体("举起产品贴近镜头"比"展示"准)。
剧本中段的 action 仅用于字幕节奏参考,不会写进 Seedance prompt。
A: 直接调 pipeline._generate_silent_video(image, prompt, duration, output)。