返回 Skill 列表
extension
分类: 其它需要 API Key

口播视频生成

产品介绍视频自动生成技能。当用户需要生成产品介绍视频、宣传视频、演示视频时、复刻声音时触发。支持:(1) 声音合成——若用户明确指定"我的"声音,则复刻声音并用于下次合成;否则自动使用edge-tts合成语音(支持男声/女声选择);(2) 基于用户提供的图片素材生成静态幻灯片视频(无需大模型生成视频);(3) 自动生成对应语言的SRT字幕(软字幕/硬字幕/无字幕可选)并与音频同步。(4)复刻声音。(5)口播引导视频:当脚本首段以"口播:"开头时,使用真人照片+TTS音频 并生成真人口播片段。适用场景:用户说"帮我生成产品视频"、"制作一个XX的介绍视频"、"用我的声音或男声或女声生成视频"、"把这些图片做成视频"、"生成一段口播视频"时,务必使用此技能。

person作者: user_f26b93e2hubcommunity

产品介绍视频自动生成

将文案、图片素材自动合成为带字幕和配音的产品介绍视频,不依赖大模型生成视频,以控制成本。

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 文件中。"

快速开始

  1. 阅读 references/dependencies.md 了解环境依赖
  2. 运行 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 |

询问模板

当多个参数都不明确时,一次性询问(避免多次来回):

在生成视频前,需要确认以下参数:

  1. 声音:使用"我的"复刻声音,还是 edge-tts 默认女声 / 男声?
  2. 字幕:需要生成字幕吗?软字幕(可开关)还是硬字幕(烧录进画面)?
  3. 图片:请提供图片素材,数量应与文案段落数一致(口播模式下首段无需图片)。
  4. 口播:若脚本第一段以"口播:"开头,请提供主持人真人照片(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(无字幕版本)

口播视频生成模块

当脚本首段文案以以下任意前缀开头时,自动进入口播模式:

  • 口播:(全角冒号)
  • 口播:(半角冒号)
  • 【口播】
  • [口播]

生成流程

  1. 验证 --portrait 照片路径存在,否则立即报错退出
  2. 合成该段 TTS 音频,检查时长
  3. 若音频时长 ≤ 15s 且 DASHSCOPE_API_KEY 可用:
    • 上传照片到阿里百炼系统临时文件存储,获取临时 URL (oss://)
    • 上传 TTS 音频,获取临时 URL (oss://)
    • 根据 --portrait-quality 调用模型:
      • standard (默认):resolution=480P
      • high:resolution=720P
    • 提交任务后,每 5 秒轮询一次任务状态,最长等待 300s
    • 任务成功后下载视频并用作第一段
  4. 若音频时长 > 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

参数说明: -- --voicemyvoiceedge_tts(默认 edge_tts) -- --clone-audio-url:使用 --voice myvoice 时,通过公网音频URL自动复刻声音 -- --clone-audio-file:使用 --voice myvoice 时,通过本地音频文件自动复刻声音 -- --clone-prefix:声音复刻时的前缀,默认 myvoice

  • --clone-language:声音复刻时语言提示,默认 zh
  • --edge-tts-genderfemale(女声,默认)或 male(男声),仅在 --voice edge_tts 时生效
  • --scene-descriptions:场景描述文件路径(由 WorkBuddy 生成),每行一条,与文案段落一一对应;用于文生图 prompt
  • --subtitlesoft(软字幕,默认)/ hard(硬字幕烧录)/ none(无字幕)
  • --resolution1920x1080(默认)或 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,详见脚本内注释。