一句话总结:输入一个成语,Hermes Agent 自动完成「故事脚本→文生图→图生视频→拼接长片」全流水线,零手动操作。
一、效果预览
我以成语**「破茧成蝶」**为例,让整条流水线自动跑通:
- Hermes Agent 解析成语意境,输出5场景故事脚本
- BlazeAI API 调用视频生成模型,逐段生成视频片段
- ffmpeg 拼接 + 过渡 + 旁白,输出3分钟完整故事片
最终产出:一个有画面、有旁白、有字幕的成语故事短片。
二、核心工具与模型介绍
2.1 Hermes Agent——AI 调度中枢
Hermes Agent 是整个流水线的中枢神经,负责:
- 故事生成:理解成语的文化内涵,构建叙事结构
- 任务编排:串联文生图、图生视频、拼接等环节
- 错误处理:某环节失败自动重试或降级
调用方式:
在 Hermes 中输入:
“请用成语’破茧成蝶’创作一个3分钟AI视频故事,包含5个场景,每个场景需要:画面描述+旁白文案+情绪标签”
Hermes 返回结构化 JSON,包含每个场景的完整参数,直接喂给后续环节。
2.2 BlazeAI——多模型聚合 API
Base URL: https://blazeai.boxu.dev/api/
BlazeAI 是一个兼容 OpenAI 格式的多模型聚合平台,一个 Key 调用多种模型:
| 能力 | 推荐模型 | 说明 |
|---|---|---|
| 文生图 | flux-dev, sdxl | 高质量场景图 |
| 图生视频 | kling, runway-gen3 | 静态图动态化 |
| 文生视频 | ltx-video, cogvideo | 直接文本生成视频 |
| 旁白 TTS | elevenlabs, azure-tts | 多语言配音 |
API 调用示例(Python):
import requests
BASE_URL = "https://blazeai.boxu.dev/api/v1"
API_KEY="blz_xxxxx" # Your Blaze AI key
# 文生图
response = requests.post(
f"{BASE_URL}/images/generations",
headers={"Authorization": f"Bearer *** "model": "flux-dev",
"prompt": "A golden cocoon opening under moonlight, butterfly emerging, cinematic 8K",
"n": 1,
"size": "1024x1024"
}
}
)
image_url = response.json()["data"][0]["url"]
# 图生视频
response = requests.post(
f"{BASE_URL}/videos/generations",
headers={"Authorization": f"Bearer *** "model": "kling",
"image_url": image_url,
"duration": 5,
"mode": "standard"
}
)
video_url = response.json()["url"]
2.3 Agnes 文生图——中文场景特化
- 模型:
agnes-image-2.1-flash - Endpoint:
https://apihub.agnes-ai.cn/v1/images/generations
Agnes 在中文意境表达上有独特优势,特别适合成语故事的中国风画面:
import subprocess, json
prompt = "金色蚕茧在月光下缓缓裂开,一只发光蝴蝶破茧而出,数字粒子特效"
payload = json.dumps({
"model": "agnes-image-2.1-flash",
"prompt": prompt,
"n": 1,
"size": "768x1024"
})
# Windows 需用 subprocess curl 绕过 SSL 问题
with open("_payload.json", "w") as f:
f.write(payload)
result = subprocess.run([
"curl", "-sS", "-X", "POST",
"https://apihub.agnes-ai.cn/v1/images/generations",
"-H", "Authorization: Bearer *** "-H", "Content-Type: application/json",
"-d", "@_payload.json"
], capture_output=True, text=True, timeout=90)
data = json.loads(result.stdout)
image_url = data["data"][0]["url"]
三、完整流水线搭建
3.1 流水线架构
整个流水线分成五个阶段:
阶段一:成语 → Hermes Agent → 结构化故事脚本(含每场景的画面描述、旁白、情绪标签)
阶段二:场景描述 → 文生图(Agnes / BlazeAI)→ 静态场景图
阶段三:场景图 → 图生视频(BlazeAI Kling)→ 5秒短视频片段
阶段四:所有片段 → ffmpeg 拼接 + 淡入淡出过渡 → 完整长视频
阶段五:生成封面 + 撰写推文 → 微信公众号/视频号一键发布
3.2 Hermes Agent 自动编排
让 Hermes 生成一个完整的 Python 脚本,一键运行整个流水线:
#!/usr/bin/env python3
"""
成语AI视频生成器 - 完整流水线
输入:一个成语
输出:一段完整的AI视频故事
"""
import json, os, subprocess, time, requests
# ============ 配置 ============
BLAZE_BASE = "https://blazeai.boxu.dev/api/v1"
BLAZE_KEY = "blz_xxxxx"
AGNES_BASE = "https://apihub.agnes-ai.cn/v1"
AGNES_KEY = "sk_xxxxx"
IDIOM = "破茧成蝶"
def generate_script(idiom):
"""用 Hermes Agent 生成结构化故事脚本"""
return {
"title": f"{idiom}—— 一个关于蜕变的故事",
"scenes": [
{
"id": 1,
"description": "暗金色的茧悬挂在古老树枝上,月光透过树叶洒下",
"narration": "在幽深的森林里,一只小小的茧正在等待命运的召唤。",
"mood": "mysterious",
"duration": 5
},
{
"id": 2,
"description": "茧开始微微颤动,金色裂纹从内部蔓延开来",
"narration": "内心的力量开始涌动,那是生命对自由的渴望。",
"mood": "tension",
"duration": 5
},
]
}
def generate_image(prompt, outpath):
"""使用 Agnes 生成场景图"""
payload = json.dumps({
"model": "agnes-image-2.1-flash",
"prompt": prompt, "n": 1, "size": "1024x1024"
})
pl = outpath.replace(".png", ".json")
with open(pl, "w") as f:
f.write(payload)
result = subprocess.run([
"curl", "-sS", "-X", "POST",
f"{AGNES_BASE}/images/generations",
"-H", f"Authorization: Bearer *** "-H", "Content-Type: application/json",
"-d", f"@{pl}"
], capture_output=True, text=True, timeout=90)
os.remove(pl)
data = json.loads(result.stdout)
img_url = data["data"][0]["url"]
subprocess.run(["curl", "-sS", "-o", outpath, img_url], timeout=60)
return outpath
def generate_video(image_path, outpath, duration=5):
"""使用 BlazeAI 将静态图转为视频"""
response = requests.post(
f"{BLAZE_BASE}/videos/generations",
headers={"Authorization": f"Bearer {BLAZE_KEY}"},
json={
"model": "kling-v2",
"image_url": upload_image(image_path),
"duration": duration,
"mode": "standard"
}
)
video_url = response.json()["url"]
subprocess.run(["curl", "-sS", "-o", outpath, video_url], timeout=120)
return outpath
def stitch_videos(video_paths, output_path):
"""使用 ffmpeg 拼接多段视频"""
with open("concat_list.txt", "w") as f:
for v in video_paths:
f.write(f"file '{v}'\n")
subprocess.run([
"ffmpeg", "-f", "concat", "-safe", "0",
"-i", "concat_list.txt",
"-c:v", "libx264", "-crf", "18",
"-preset", "medium",
"-c:a", "aac", "-b:a", "192k",
"-movflags", "+faststart",
"-y", output_path
], check=True)
def main():
script = generate_script(IDIOM)
video_clips = []
for scene in script["scenes"]:
print(f"处理场景 {scene['id']}...")
img_path = f"scene_{scene['id']}.png"
generate_image(scene["description"], img_path)
vid_path = f"scene_{scene['id']}.mp4"
generate_video(img_path, vid_path, scene["duration"])
video_clips.append(vid_path)
stitch_videos(video_clips, f"{IDIOM}_final.mp4")
print(f"完成!输出: {IDIOM}_final.mp4")
if __name__ == "__main__":
main()
四、长视频生成核心技巧
这是最容易踩坑的环节。目前没有任何模型能一次生成几分钟的高质量视频,必须分段生成再拼接。
4.1 技巧一:分段策略
3分钟视频 = 6个场景 × 30秒/场景 = 6 × (6段 × 5秒/段) = 36个5秒短视频片段
关键原则:每个场景生成多段短视频(3-5秒),而非试图一次生成30秒。
4.2 技巧二:ffmpeg 无缝拼接
# 方法1: 直接拼接(同编码参数)
ffmpeg -f concat -i clips.txt -c copy output.mp4
# 方法2: 带过渡效果的拼接(推荐)
ffmpeg -i clip1.mp4 -i clip2.mp4 -filter_complex "
[0:v]trim=0:4,setpts=PTS-STARTPTS[v0];
[1:v]trim=0:4,setpts=PTS-STARTPTS[v1];
[v0][v1]xfade=transition=fade:duration=1:offset=3[outv];
[0:a]atrim=0:4,asetpts=PTS-STARTPTS[a0];
[1:a]atrim=0:4,asetpts=PTS-STARTPTS[a1];
[a0][a1]acrossfade=d=1[outa]
" -map "[outv]" -map "[outa]" output.mp4
4.3 技巧三:统一编码参数
# 将所有片段统一为相同参数,避免拼接失败
for f in scene_*.mp4; do
ffmpeg -i "$f" \
-vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2" \
-r 30 -c:v libx264 -crf 18 -c:a aac -ar 48000 \
"uniform_$f"
done
4.4 技巧四:添加旁白与字幕
# 生成旁白(BlazeAI TTS)
curl -X POST "https://blazeai.boxu.dev/v1/audio/speech" \
-H "Authorization: Bearer *** \
-d '{"model":"elevenlabs","input":"在幽深的森林里...","voice":"zh_female"}' \
-o narration.mp3
# 合并音视频
ffmpeg -i video.mp4 -i narration.mp3 -c:v copy -c:a aac output.mp4
# 烧字幕
ffmpeg -i output.mp4 -vf "subtitles=story.srt" -c:a copy final.mp4
4.5 技巧五:Hermes 自动化一切
让 Hermes Agent 写一个 master script,自动完成:
- 读取故事脚本 JSON
- 循环每个场景:调用 Agnes 生成场景图 → 调用 BlazeAI 生成视频片段 → 统一转码
- ffmpeg 拼接所有片段
- 调用 TTS 生成旁白
- 合并音视频 + 烧字幕
- 输出最终视频
五、踩坑与解决方案
| 坑 | 原因 | 解决方案 |
|---|---|---|
| Agnes API 返回空 | Windows SSL 握手失败 | 用 curl -k 或 subprocess 绕过 |
| 视频片段音画不同步 | 帧率不一致 | 统一用 -r 30 转码 |
| ffmpeg concat 失败 | 编码参数不统一 | 先统一转码再拼接 |
| 微信公众号封面上传失败 | CLI banner_path bug | 用 upload-cover.js 手动上传获取 media_id |
| BlazeAI 视频生成超时 | 任务排队 | 设置 120s timeout + 重试机制 |
| 长视频画面跳跃 | 场景间缺乏连贯性 | 增加 0.5-1s 淡入淡出过渡 |
| 微信API报40164 | IP不在白名单 | 登录 mp.weixin.qq.com → 开发 → IP白名单添加 |
六、进阶玩法
- 成语系列矩阵:批量跑100个成语,形成短视频内容矩阵
- 多语言版本:同一故事生成中英双语旁白,覆盖海外平台
- 互动分支:每个场景生成3个选项,做成互动叙事视频
- 风格迁移:用 BlazeAI 的视频转视频能力,统一全片视觉风格
- 自动发布流水线:视频生成 → 封面截图 → Hermes 写推文 → 公众号/视频号自动发布
七、总结
核心心法:不要试图让AI一次生成完美长视频,而是拆成「文本→图片→5秒片段→拼接」的流水线。
技术栈速查:
| 环节 | 工具 | 模型 |
|---|---|---|
| 故事生成 | Hermes Agent | Claude/GPT |
| 文生图 | Agnes API | agnes-image-2.1-flash |
| 图生视频 | BlazeAI | kling-v2 / runway-gen3 |
| 视频拼接 | ffmpeg | libx264 |
| 旁白 | BlazeAI TTS | elevenlabs |
| 发布 | wechat-public-cli | 公众号API |
📌 现在你也试试:打开 Hermes,输入一个成语,让 AI 为你生成一段属于自己的 AI 视频故事吧!
本文封面及正文插图均由 agnes-image-2.1-flash 模型生成,视频由 Hermes Agent + BlazeAI + ffmpeg 流水线自动拼接。