产品介绍视频自动生成
将文案、图片素材自动合成为带字幕和配音的产品介绍视频,不依赖大模型生成视频,以控制成本。
API Key
用户需要提供平台 API Key,用于鉴权。配置示例:
{
"api_key": "YOUR_API_KEY_HERE",
"voice_id": "YOUR_VOICE_ID_HERE"
}
⚠️ 未配置 API Key 时,不得执行检索,必须先提示用户: "config.json 中的 api_key 尚未配置。请前往 https://open.delilegal.com/personal/keys 创建 API Key,并填入技能目录下的 config.json 文件中。"
快速开始
- 阅读
references/dependencies.md了解环境依赖 - 运行
scripts/generate_video.py执行完整流程
输入规范
用户需要提供:
| 输入 | 说明 | 是否必须 |
|------|------|----------|
| 文案脚本 | 每段对应一张图片的旁白文本;首段可加"口播:"前缀触发真人口播模式 | 必须 |
| 图片素材 | JPG/PNG,建议16:9或9:16比例 | 口播模式下仅非口播段需要 |
| 真人照片 | JPG/PNG,主持人正面照,用于口播视频 | 口播模式必须 |
| 口播质量 | high(高质量720P)或 standard(标准质量480P),统一使用 wan2.7-i2v 模型 | 可选(默认standard) |
| 口播提示词 | wan2.7 高质量模式下的 prompt,用于控制生成画面质感 | 可选(默认带美颜+高清提示词) |
| 声音偏好 | "我的"复刻声音 或 edge-tts(男声/女声) | 可选(默认edge-tts女声) |
| 配图风格 | --image-style 参数。例如:"动漫"、"卡通"、"自然风景"、"赛博朋克"等 | 可选(默认专业严肃风格) |
| 字幕类型 | soft(软字幕)/ hard(硬字幕)/ none(无字幕) | 可选(默认soft) |
| 目标语言 | zh-CN / en-US / ja-JP 等 | 可选(默认自动检测) |
| 输出分辨率 | 默认1920×1080 | 可选 |
用户只提供了生成视频,但不包含文案脚本,需提示用户提供更多信息,脚本格式示例:
生成视频,竖屏,男声,硬字幕:
口播:大家好,我是得理科技的我的。今天很高兴为大家介绍我们的新产品。
第1段:欢迎使用我们的产品,这是全球领先的解决方案。
第2段:我们的技术创新已获得超过200项专利认证。
第3段:现在就加入我们,开启智能化新时代。
参数收集
当用户请求生成视频但参数不明确时,系统必须按以下优先级主动询问,收集确认后再执行生成。
1. 声音选择
| 场景 | 询问内容 | 选项 | |------|----------|------| | 用户未提及声音 | "视频配音使用什么声音?" | ① 我的复刻声音;② edge-tts 默认女声;③ edge-tts 男声 | | 用户提到"默认""自动" | 同上 | 同上 | | 用户指定"我的" | 无需询问,直接使用 | — | | 用户指定"男声"或"女声" | 无需询问,直接使用对应性别edge-tts | — |
2. 字幕选择(关键参数,必须确认)
| 场景 | 询问内容 | 选项 | |------|----------|------| | 用户未提及字幕 | 必须主动询问:"需要生成字幕吗?如果需要,要软字幕还是硬字幕?" | ① 软字幕:播放器内可开关;② 硬字幕:烧录进画面,始终显示;③ 无字幕 | | 用户只说"要字幕" | 追问软/硬选择 | 同上 | | 用户说"不要字幕" | 无需询问,使用 none | — | | 用户明确指定 soft/hard | 无需询问,直接使用 | — |
3. 图片素材
| 场景 | 处理 |
|------|------|
| 用户未提供图片或没找到任何产品图片 | 基于段落文案自动使用 wan2.7-image 模型生成统一风格的图片。若无 DASHSCOPE_API_KEY,会自动降级使用 Python Pillow 生成包含专业法律风格(深蓝底+金字)的配图 |
| 图片数 ≠ 文案段落数且提供了图片 | 报错提示不匹配详情,要求用户调整 |
参数 → CLI 映射表
收集到的参数通过以下命令行参数传递给 generate_video.py:
| 用户选择 | 命令行参数 | 示例 |
|----------|-----------|------|
| 我的声音 | --voice myvoice | --voice myvoice |
| 自动复刻(公网音频) | --clone-audio-url | --clone-audio-url https://yourAudioFileUrl |
| 自动复刻(本地音频) | --clone-audio-file | --clone-audio-file /path/to/voice.wav |
| 生成配图风格 | --image-style | --image-style 动漫 |
| edge-tts 女声 | --voice edge_tts --edge-tts-gender female(默认) | — |
| edge-tts 男声 | --voice edge_tts --edge-tts-gender male | --edge-tts-gender male |
| 真人口播照片 | --portrait | --portrait /path/to/host.jpg |
| 软字幕 | --subtitle soft(默认) | — |
| 硬字幕 | --subtitle hard | --subtitle hard |
| 无字幕 | --subtitle none | --subtitle none |
询问模板
当多个参数都不明确时,一次性询问(避免多次来回):
在生成视频前,需要确认以下参数:
- 声音:使用"我的"复刻声音,还是 edge-tts 默认女声 / 男声?
- 字幕:需要生成字幕吗?软字幕(可开关)还是硬字幕(烧录进画面)?
- 图片:请提供图片素材,数量应与文案段落数一致(口播模式下首段无需图片)。
- 口播:若脚本第一段以"口播:"开头,请提供主持人真人照片(JPG/PNG),否则任务无法继续。
工作流程
用户输入(文案 + 图片)
│
▼
① 参数收集确认(声音 / 字幕 / 图片 / 口播照片)
│
▼
② 解析文案脚本(按段落切分)
│
├── 首段含"口播:"前缀 → 验证 --portrait 照片存在,否则立即退出
│
├── 检查图片素材,若未提供或没找到,则使用 wan2.7-image 依据每段内容自动生成统一风格的对应图片
│
▼
③ 声音合成(TTS)
├── 指定 --voice myvoice → 需提供 --clone-audio-url/file 复刻声音后合成
└── edge-tts → 根据 --edge-tts-gender 选择男/女声(免费)
│
▼
④ 获取每段音频时长,生成时间轴
│
├── --subtitle soft/hard ↓
│
⑤a 生成SRT字幕文件(与音频时间对齐)
│
▼
⑥ 生成视频片段
├── 首段(口播模式)
│ ├── 音频 ≤ 15s → 上传照片+音频 → 调用 wan2.7-i2v 模型 → 轮询 → 下载口播视频
│ └── 音频 > 15s 或 API 失败 → 降级:真人照片+音频 → ffmpeg 图片视频
└── 其余段落 → 普通图片视频(ffmpeg)
│
├── soft → ⑦a 软字幕嵌入(mov_text轨道)
└── hard → ⑦b 硬字幕烧录(libass → drawtext → Python fallback)
│
▼
⑦ 输出MP4(含字幕版本)
├── --subtitle none → 直接跳过 ⑤⑥
│
⑤b 静态图片视频合成(ffmpeg,无字幕)
│
▼
⑥b 输出MP4(无字幕版本)
口播视频生成模块
当脚本首段文案以以下任意前缀开头时,自动进入口播模式:
口播:(全角冒号)口播:(半角冒号)【口播】[口播]
生成流程
- 验证
--portrait照片路径存在,否则立即报错退出 - 合成该段 TTS 音频,检查时长
- 若音频时长 ≤ 15s 且
DASHSCOPE_API_KEY可用:- 上传照片到阿里百炼系统临时文件存储,获取临时 URL (oss://)
- 上传 TTS 音频,获取临时 URL (oss://)
- 根据
--portrait-quality调用模型:standard(默认):resolution=480Phigh:resolution=720P
- 提交任务后,每 5 秒轮询一次任务状态,最长等待 300s
- 任务成功后下载视频并用作第一段
- 若音频时长 > 15s 或生成失败:降级为 ffmpeg 图片视频(使用真人照片)
API 规格(通过自有平台 SkillController 代理)
POST https://platform.delilegal.com/api/v1/skill/video/create
Headers: Authorization: Bearer {PLATFORM_API_KEY}
Content-Type: application/json
Body: {
"photoUrl": "https://...", // 真人照片 OSS URL
"audioUrl": "https://...", // 驱动音频 OSS URL
"quality": "standard", // standard(480P) 或 high(720P)
"duration": 5, // 2-15 整数
"prompt": "..." // high 质量时的 prompt
}
Response: { "success": true, "body": { "taskId": "..." } }
Task query: GET https://platform.delilegal.com/api/v1/skill/video/task/{taskId}
Success: { "success": true, "body": { "taskStatus": "SUCCEEDED", "videoUrl": "..." } }
文件上传(三步上传到 OSS)
步骤一: POST https://platform.delilegal.com/api/v1/skill/video/prepareUpload
获取 OSS 上传地址和临时 URL
步骤二: PUT {ossUploadUrl}(直接上传文件内容到 OSS)
步骤三: POST https://platform.delilegal.com/api/v1/skill/video/saveFile
确认保存,获取最终文件访问 URL
声音合成模块
策略选择逻辑
def select_tts_strategy(voice_arg: Optional[str]) -> str:
"""返回 'myvoice' 或 'edge_tts'"""
if voice_arg and "myvoice" in voice_arg.lower():
return "myvoice"
return "edge_tts"
voice_config.json 格式
保存平台 API Key,用于鉴权, voice_id 用于保存我的声音(myvoice)
{
"api_key": "YOUR_PLATFORM_API_KEY_HERE"
"voice_id": "YOUR_VOICE_ID_HERE"
}
我的声音复刻(自有平台 SkillController)
将符合声音复刻要求的音频上传到公网可访问地址(例如 OSS)后,调用自有平台接口:
curl -X POST "https://platform.delilegal.com/api/v1/skill/voice/enroll" \
-H "Authorization: Bearer $PLATFORM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"audioUrl": "https://yourAudioFileUrl",
"prefix": "myvoice",
"language": "zh",
"targetModel": "cosyvoice-v3.5-plus"
}'
建议直接使用脚本:
/usr/local/bin/python3 scripts/enroll_my_voice.py \
--audio-url "https://yourAudioFileUrl" \
--prefix "myvoice" \
--language zh
如果只有本地音频文件:
/usr/local/bin/python3 scripts/enroll_my_voice.py \
--audio-file "/path/to/voice.wav" \
--prefix "myvoice"
voice_id 仅在当次有效,不会写入配置文件。在 generate_video.py 中通过 --clone-audio-url 或 --clone-audio-file 参数自动复刻并使用。
--audio-file "/path/to/voice.wav"
--prefix "myvoice"
--language zh
### edge-tts 声音映射
| 语言 | 女声(默认) | 男声 |
|------|-------------|------|
| zh-CN | zh-CN-XiaoxiaoNeural | zh-CN-YunxiNeural |
| zh-TW | zh-TW-HsiaoYuNeural | zh-TW-YunJheNeural |
| en-US | en-US-JennyNeural | en-US-GuyNeural |
| en-GB | en-GB-SoniaNeural | en-GB-RyanNeural |
| ja-JP | ja-JP-NanamiNeural | ja-JP-KeitaNeural |
| ko-KR | ko-KR-SunHiNeural | ko-KR-InJoonNeural |
| fr-FR | fr-FR-DeniseNeural | fr-FR-HenriNeural |
| de-DE | de-DE-KatjaNeural | de-DE-ConradNeural |
---
## 字幕生成规范
- 格式:SRT(SubRip Text)
- 编码:UTF-8
- 每条字幕时长:与对应音频段完全对齐
- 每行字符数:中文≤20字,英文≤42字,超出自动换行
- 时间戳精度:毫秒级
SRT示例:
1 00:00:00,000 --> 00:00:04,230 欢迎使用我们的产品, 这是全球领先的解决方案。
2 00:00:04,500 --> 00:00:08,100 我们的技术创新已获得 超过200项专利认证。
---
## 视频合成规范
- 工具:**ffmpeg**(不使用大模型,成本为零)
- 每张图片持续时长 = 对应音频时长(含0.3秒过渡缓冲)
- 图片缩放策略:`scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080`
- 音频:AAC 128kbps
- 视频:H.264,CRF 23
- 字幕:`--subtitle soft`(软字幕,独立轨道,用户可关闭)/ `--subtitle hard`(硬字幕,烧录进视频)/ `--subtitle none`(无字幕)
---
## 执行步骤
### Step 1:环境检查
```bash
# 建议使用系统 Python(托管 Python 可能存在 Pillow 签名冲突)
/usr/local/bin/python3 scripts/check_env.py
检查 ffmpeg、edge-tts、pillow、pydub 等依赖是否就绪。
Step 2:复刻我的声音(可选)
voice_id 不在配置文件中存储。如需使用复刻声音,在 generate_video.py 中通过 --clone-audio-url 或 --clone-audio-file 参数自动复刻。
也可单独执行复刻脚本获取 voice_id:
/usr/local/bin/python3 scripts/enroll_my_voice.py \
--audio-url "https://your-public-audio-url"
voice_id 仅在当次有效,不会写入配置文件。
Step 3:准备输入
将图片素材放入 input/images/,文案写入 input/script.txt(每行一段)。
如果不想提供图片素材,WorkBuddy 会自动根据文案生成场景描述,写入 input/scene_descriptions.txt(每行一条),然后在运行脚本时通过 --scene-descriptions input/scene_descriptions.txt 传入即可。
Step 4:运行生成
/usr/local/bin/python3 scripts/generate_video.py \
--script input/script.txt \
--images input/images/ \
--voice myvoice \
--clone-audio-file "/path/to/voice.wav" \
--edge-tts-gender female \
--lang zh-CN \
--subtitle soft \
--output output/product_video.mp4
# 无素材模式(使用 WorkBuddy 生成的场景描述替代图片)
/usr/local/bin/python3 scripts/generate_video.py \
--script input/script.txt \
--scene-descriptions input/scene_descriptions.txt \
--voice edge_tts \
--edge-tts-gender female \
--lang zh-CN \
--subtitle soft \
--output output/product_video.mp4
# 口播模式示例(首段文案以"口播:"开头):
/usr/local/bin/python3 scripts/generate_video.py \
--script input/script.txt \
--images input/images/ \
--portrait input/host.jpg \
--voice myvoice \
--subtitle soft \
--output output/product_video.mp4
参数说明:
-- --voice:myvoice 或 edge_tts(默认 edge_tts)
-- --clone-audio-url:使用 --voice myvoice 时,通过公网音频URL自动复刻声音
-- --clone-audio-file:使用 --voice myvoice 时,通过本地音频文件自动复刻声音
-- --clone-prefix:声音复刻时的前缀,默认 myvoice
--clone-language:声音复刻时语言提示,默认zh--edge-tts-gender:female(女声,默认)或male(男声),仅在--voice edge_tts时生效--scene-descriptions:场景描述文件路径(由 WorkBuddy 生成),每行一条,与文案段落一一对应;用于文生图 prompt--subtitle:soft(软字幕,默认)/hard(硬字幕烧录)/none(无字幕)--resolution:1920x1080(默认)或1280x720/1080x1920
Step 5:查看输出
output/
├── product_video.mp4 # 最终视频(含软字幕)
├── product_video.srt # 独立字幕文件
└── audio/
├── segment_001.mp3
├── segment_002.mp3
└── ...
错误处理
| 错误情况 | 处理方式 | |----------|----------| | voice_config.json 不存在 | 使用 edge-tts(无需 API Key 即可运行) | | 指定 --voice myvoice 但未提供复刻音频 | 降级使用 edge-tts,提示用户提供 --clone-audio-url/file | | 声音API调用失败 | 降级使用 edge-tts,记录警告 | | 图片数量 ≠ 文案段落数且已提供部分图片 | 报错提示,显示不匹配详情 | | 未提供图片且未提供 --scene-descriptions | 使用原始文案作为文生图 prompt | | 未提供图片/场景描述且未配置 API Key | 自动降级使用 Pillow 生成包含专业法律风格(深蓝底金字)的本地配图 | | ffmpeg 未安装 | 报错并给出安装指引 | | 图片格式不支持 | 自动转换为PNG后继续 | | 口播模式未提供 --portrait | 立即报错退出,提示用户提供真人照片 | | 口播视频生成超时/失败 | 自动降级为真人照片图片视频,记录警告 | | 口播音频时长 > 15s | 自动降级为图片视频,无需用户干预 | | 余额不足 | 提示用户去 https://open.delilegal.com/personal/keys 充值 |
参考文档
- 依赖安装:
references/dependencies.md - 阿里百炼 TTS 文档:https://help.aliyun.com/zh/model-studio/text-to-speech
主执行脚本入口
核心逻辑在 scripts/generate_video.py,详见脚本内注释。
微信扫一扫