| name | doc2video |
| description | 从文档(PDF/Word/TXT)自动生成宣传短视频。全流程包括:文档阅读与内容提取、AI生成口播文案、文生图、图生视频、声音复刻TTS配音(qwen-voice-enrollment)、字幕烧录、背景音乐混合、完整视频合成。触发词:帮我做视频、生成宣传片、根据这个文档做视频、为这个文件制作短视频、文档转视频、pdf转视频。 |
doc2video — 文档转宣传视频
概览
输入:PDF / DOCX / TXT 文件
输出:带配音+字幕+背景音乐的完整宣传短视频(上传 对象存储 后发链接)
总时长约 60-90 秒(6 个分镜,每段 8-12 秒)
环境与工具
| 工具 | 路径/说明 |
|---|
| DashScope API Key | 从用户处获取,或 DASHSCOPE_API_KEY 环境变量 |
| Wan 脚本 | ~/.openclaw/skills/wan-image-video-generation-editting-1.0.2/scripts/wan-magic.py |
| 对象存储 上传 | your_upload_script.sh # 替换为你自己的对象存储上传脚本 |
| Python 环境 | /tmp/index-tts/,命令前加 export PATH="$HOME/.local/bin:$PATH" && cd /tmp/index-tts && uv run python3 |
| 输出目录 | /tmp/videos/(原始视频)、/tmp/output/(成品)、/tmp/files/(音频/图片) |
| HTTP 代理 | http://YOUR_PROXY_HOST:YOUR_PROXY_PORT |
完整流程
- 读取文档 → 提取核心信息
- 撰写 6 段口播文案 → 用户确认
- 文生图(Wan text2image,6张并行)
- 图生视频(Wan i2v-flash,6个并行提交)
- 声音复刻(qwen-voice-enrollment,用用户音频或文字描述)
- TTS 合成(QwenTtsRealtime,逐段合成,失败自动重试)
- 音视频合并 + 字幕烧录(每段)
- 拼接 6 段 + 混入背景音乐
- 上传 对象存储,发链接
Step 1:读取文档
- PDF:pdftotext file.pdf - 或用 pdf skill
- DOCX:用 docx skill 或 python-docx
- TXT:直接 read
- 提取:主题、时间地点、人物/机构、核心事件、关键数字
Step 2:撰写口播文案
| 段落 | 内容方向 | 时长 | 字数 |
|---|
| shot1 | 悬念钩子,吸引注意 | ~8s | 35-40字 |
| shot2 | 核心主题/人物/故事 | ~8s | 35-40字 |
| shot3 | 关键细节/冲突/特色 | ~10s | 45-50字 |
| shot4 | 深度内容/历史/意义 | ~10s | 45-50字 |
| shot5 | 情感高潮/转折 | ~10s | 45-50字 |
| shot6 | 结尾 CTA,告知活动信息 | ~10s | 45-50字 |
注意:每段文案内容要与对应画面匹配(如状元游街画面配高中荣耀文案,展馆画面配 CTA)。
保存到 workspace 的 tts_scripts.json,生成后展示给用户确认再继续。
Step 3:文生图
每段生成一张场景图(6张并行提交),记录图片 URL:
export PATH="$HOME/.local/bin:$PATH" && export DASHSCOPE_API_KEY=
python3 ~/.openclaw/skills/wan-image-video-generation-editting-1.0.2/scripts/wan-magic.py
text2image --prompt "中文场景描述" --model wanx2.1-t2i-turbo --size 1280*720
Step 4:图生视频
6个任务并行提交后轮询结果,成功后下载到 /tmp/videos/shot{N}_名称.mp4:
python3 wan-magic.py image2video --image-url "" --prompt "镜头描述"
--model wan2.6-i2v-flash --duration 5
python3 wan-magic.py image2video-get --task-id <TASK_ID>
Step 5:声音复刻
优先询问用户是否有 10-20 秒清晰朗读音频(短音频 2-3 秒也可试用)。
1. 压缩音频(降低 base64 大小,避免代理截断问题)
ffmpeg -y -i input.m4a -ar 24000 -ac 1 -b:a 32k /tmp/files/voice_24k.mp3
2. 生成并提交 enrollment(必须用 curl,比 Python requests 更稳定)
python3 -c "
import base64, json
with open('/tmp/files/voice_24k.mp3','rb') as f:
b64 = base64.b64encode(f.read()).decode()
payload = {
'model': 'qwen-voice-enrollment',
'input': {
'action': 'create',
'target_model': 'qwen3-tts-vc-realtime-2026-01-15',
'preferred_name': 'proj01',
'audio': {'data': f'data:audio/mpeg;base64,{b64}'}
}
}
with open('/tmp/enrollment.json','w') as f: json.dump(payload, f)
"
curl -sL --max-time 60
-x "http://YOUR_PROXY_HOST:YOUR_PROXY_PORT"
-H "Authorization: Bearer $DASHSCOPE_API_KEY"
-H "Content-Type: application/json"
-d @/tmp/enrollment.json
"https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization"
-o /tmp/files/enrollment_resp.json -w "HTTP:%{http_code}"
3. 提取 voice_id
python3 -c "import json; d=json.load(open('/tmp/files/enrollment_resp.json')); print(d['output']['voice'])"
若无用户音频,用 cosyvoice-v3.5-plus voice-enrollment(文字描述创建虚拟音色),见 references/tts-api.md。
Step 6:TTS 合成
用 QwenTtsRealtime + HTTPS_PROXY 环境变量,详细代码见 references/tts-api.md。
要点:
- 每段合成一次,失败重试最多 5 次,间隔 3s
- WebSocket 偶尔 5s 超时是代理抖动,重试即可
- 合成完检查时长:音频明显比视频长(>3s)时考虑精简文案
Step 7:音视频合并 + 字幕
详细 FFmpeg 命令见 references/ffmpeg-recipes.md。
规则:
- 音频 > 视频:视频冻结最后帧补齐(tpad=stop_mode=clone)
- 视频 > 音频:音频静音补齐(apad)
- 字幕按句子切分,字数比例分配时间,0.2s 引入
Step 8:拼接 + 混音
ffmpeg -y -f concat -safe 0 -i concat_list.txt
-c:v libx264 -preset fast -crf 20 -c:a aac -b:a 128k full.mp4
DURATION=$(ffprobe -v quiet -show_entries format=duration -of csv=p=0 full.mp4)
ffmpeg -y -i full.mp4 -stream_loop -1 -i bgm.mp3
-filter_complex "[0:a]volume=1.0[v];[1:a]volume=0.20,atrim=0:${DURATION},asetpts=PTS-STARTPTS[b];[v][b]amix=inputs=2:duration=first:dropout_transition=2[out]"
-map 0:v -map "[out]" -c:v copy -c:a aac -b:a 192k -t $DURATION final_bgm.mp4
背景音乐由用户提供(推荐:爱给网 aigei.com,有免费CC音乐)。
Step 9:上传 对象存储
替换为你自己的上传命令,例如:aws s3 cp 或 ossutil cp \
--file /tmp/output/final_bgm.mp4
常见错误处理
| 错误 | 原因 | 解决 |
|---|
| Arrearage | DashScope 账户欠费 | 提示充值:https://account.aliyun.com/balance/add.htm |
| cosyvoice 418 | cosyvoice-v3.5-plus 不支持系统音色 | 必须先 enrollment 创建 voice_id |
| curl HTTP 000 | 代理连接超时 | 重试 2-3 次,间隔 5s |
| WebSocket 5s timeout | 代理偶尔抖动 | 重试,最多 5 次 |
| task can not be null | qwen3-tts-vc-2026-01-22 不支持 REST | 改用 QwenTtsRealtime(WebSocket 方式) |
| 字幕乱码 | 字体缺失 | 用 SimHei 或 WenQuanYi Micro Hei |
| 视频 DTS 警告 | 拼接时间戳不连续 | 加 -c:v libx264 重新编码 |
用户交互节点
- 文案确认:展示 6 段让用户确认/修改,再继续
- 音色选择:询问男声/女声、有无音频可复刻
- 背景音乐:用户自行提供或列推荐选项
- 视频审片:上传后发链接,收集反馈
- 迭代修改:单段修改只需重合成该段再重新拼接,无需全部重做