Agent自动化视频生产:skills技能包与MinimaxH3模型实战指南
2026/9/7 9:15:38 网站建设 项目流程

做直播带货和知识分享类视频,最耗时间的往往不是“拍摄”本身,而是“准备一套能持续生产的稿子、画面和剪辑流程”。很多团队一个月做十几条视频,结果每条都要人工写文案、找素材、配音、加字幕,做完之后下一批又要重复同样的循环。如果能用 Agent 工具把选题、脚本、分镜、生成、合成这条链路自动化起来,再配合 MinimaxH3 这类长视频生成模型,就能把单条视频的生产时间从“按天计算”压缩到“按分钟计算”。

本文将围绕一套完整方案展开:我会先解释 Agent 工具、skills 技能包、MinimaxH3 长视频生成模型三者分别是什么,再带着你完成一个可以落地的自动化视频生产流水线。内容包括自定义 skills 的编写规范、Agent 编排脚本的实现、视频生成模型接入思路、合成与质检脚本,以及大量排错经验。适合正在做直播带货内容团队、短视频运营、知识付费项目的读者,也适合想学习 Agent 工程化应用的开发者。

1. 方案背景:视频生产的瓶颈在哪里

1.1 传统视频生产流程为什么慢

直播带货和知识分享类视频,表面上只需要“一个人对着镜头讲”,实际上背后是一整套流程。我先按大多数团队的现状拆一下:

  1. 选题:运营需要从商品库、用户评论、行业热点里找话题。
  2. 写稿:文案根据商品卖点、用户痛点、竞品话术写口播稿。
  3. 设计分镜:把口播稿拆成一句一句的镜头脚本,标注画面、字幕、时长。
  4. 准备素材:拍摄或找素材,大量团队卡在这一步。
  5. 录制:真人出镜,或者用 TTS 配音。
  6. 剪辑合成:加字幕、背景音乐、转场、切片。
  7. 审核发布:检查内容是否合规、卖点是否准确。

这里面每一步都是耗时点。写稿要 1 小时,分镜要 0.5 小时,准备画面素材可能要半天,剪辑又要 2 小时。如果做的是“日更型”账号,整个团队会被耗死在重复劳动里。

1.2 自动化改造的核心思路

这套方案的核心思路,是让 AI 承担“内容生产”的大部分工作,人类只负责“定义规则、审核结果”。

我们可以把上面的 7 步简化成一条数据流水线:

  • 输入:一条商品信息、一个选题方向、一段产品卖点描述。
  • 中间产物:口播脚本、分镜列表、每个分镜对应的画面提示词。
  • 输出:若干个视频片段,最终合成一条完整的竖屏或横屏视频。

在这个流水线里,Agent 工具负责“理解并执行任务”,skills 技能包负责“沉淀某一步的具体操作方法”,MinimaxH3 模型负责“把文字画面提示词变成真正的视频片段”。三者组合起来,就是一条自动化的视频生产线。

1.3 三个核心概念先搞清楚

  • Agent 工具:这里指的是能够自主规划和调用工具的 AI 编程/执行环境,比如 Claude Code、Codex 这类命令行 Agent。它们能读文件、执行命令、调用 API,适合作为流水线的“调度器”。
  • skills:可以理解为一套“技能包”。每个 skill 是一个包含 SKILL.md 说明文件和辅助脚本的目录,Agent 在需要时会读取它并按照里面的操作步骤执行。相比普通 prompt,skills 把“怎么做某个任务”沉淀成了可复用、可版本管理的资产。
  • MinimaxH3 模型:这是一类面向视频生成的 AI 模型,专门用来根据文字提示词生成视频画面。市面上已经有类似视频生成能力,本文以 MinimaxH3 作为长视频生成模型的代表来演示接入思路。具体接口、参数、版本以你使用的官方文档为准。

结合这几个概念,本文要做的就是:用 Agent 工具作为总指挥,把“选题、写稿、分镜、生成、合成”分别封装成 skills,最后调用 MinimaxH3 模型生成视频片段,自动拼成一条可发布的长视频。

2. 环境准备与版本说明

2.1 运行环境清单

在开始之前,先确认你的开发环境。本文示例以 macOS / Linux 为主,Windows 用户请使用 PowerShell 或 WSL 运行命令。

环境项建议版本说明
操作系统macOS 14+ / Ubuntu 22.04+示例命令兼容两者
Python3.10+需要支持 f-string、类型注解
Node.js18+部分 Agent CLI 依赖 Node 环境
ffmpeg6.0+用于视频片段合成
Claude Code最新稳定版以官方安装方式为准
视频生成模型服务以官方文档为准本文使用 MinimaxH3 作为示例

版本需要根据你的项目实际情况调整。比如你使用的 Agent 工具版本不同,skills 目录的加载路径、命令参数可能会略有差异,本文重点演示配置思路和运行逻辑,遇到不兼容时优先查官方文档。

2.2 安装 Agent 工具并确认 skills 机制

本文的编排依赖 Agent 工具,且会用到 skills 技能包机制。下面以 Claude Code 为例进行说明,其他 Agent 工具的 skills 加载方式请参考对应官方文档。

安装完成后,在终端里确认版本:

claude --version

接着创建 skills 目录。Claude Code 支持项目级和用户级 skills,用户级目录通常是:

mkdir -p ~/.claude/skills

项目级目录则建议放到项目根目录下的.claude/skills中:

mkdir -p .claude/skills

你可以在两个目录下分别放置不同的 skills。用户级 skills 可以被多个项目共用,适合放通用能力,比如“生成分镜脚本”“检查视频文件完整性”;项目级 skills 适合放业务相关能力,比如“根据某个商品库生成带货口播”。

2.3 视频生成模型账号与密钥准备

使用 MinimaxH3 这类视频生成模型,通常需要:

  1. 注册官方平台账号并完成实名认证。
  2. 创建一个 API Key,并保存好密钥。
  3. 确认你的账户有足够的调用额度。
  4. 阅读官方 API 文档,确认接口地址、请求格式、并发限制。

这里要特别提醒一点:像 MinimaxH3 这样的视频生成模型,一般通过云端 API 提供能力,调用后需要等待几秒到几分钟不等。不要尝试从非官方渠道下载所谓“模型包”,这既不稳定也有安全风险。

准备好 API Key 后,建议先放到环境变量里,不要在代码中硬编码:

export VIDEO_API_KEY="你的密钥" export VIDEO_API_ENDPOINT="https://api.你的服务商.com"

在命令行临时设置环境变量是可以的,生产环境建议使用.env文件配合 python-dotenv 管理,并确保.env文件被.gitignore忽略。

3. skills 机制详解:从 prompt 到可复用技能包

3.1 skills 是什么

如果你是第一次接触 skills,可以把它理解成“给 Agent 看的操作手册”。普通 prompt 是一次性的,你告诉 Agent“帮我写一个口播脚本”,它根据上下文自由发挥;但 skills 不一样,它把一个任务的标准流程、输入格式、输出格式、脚本位置都写清楚,Agent 一旦识别到任务匹配,就会读取 skill 目录中的 SKILL.md,再按里面的步骤执行。

一个典型 skill 目录长这样:

skills/ └── video_script_writer/ ├── SKILL.md ├── scripts/ │ ├── generate_script.py │ └── requirements.txt └── assets/ └── prompt_templates.md
  • SKILL.md:核心说明文件,包含技能名称、描述、使用步骤、参数说明。
  • scripts/:辅助脚本,负责真正执行任务。
  • assets/:存放模板、参考资料。

Agent 在工作时,会扫描 skills 目录,读取每个 SKILL.md 的 description,判断是否与当前任务匹配。一旦匹配,就会使用该 skill。

3.2 SKILL.md 怎么编写

SKILL.md 的文件头通常是 YAML 格式的 frontmatter,包含 name 和 description 两个核心字段。description 非常关键,它决定了 Agent 会不会找到这个技能,所以要写得具体,最好包含触发场景。

--- name: video_script_writer description: 根据商品信息和受众画像生成直播带货口播脚本。适合在需要准备视频文案、直播讲稿、商品介绍内容时使用。 ---

正文部分建议包含:

  1. 这个 skill 能做什么。
  2. 输入需要哪些字段。
  3. 输出是什么格式。
  4. 具体执行步骤。
  5. 一个最小示例。

这样设计的好处是,Ag ent 不需要“猜”怎么做,而是有一个明确的 SOP 可以参考。即使未来替换 Agent 工具,只要 SKILL.md 写得好,技能包本身是可以迁移复用的。

3.3 skills 与 MCP 工具的关系

MCP(Model Context Protocol)是一种标准化的工具连接协议,解决了“Agent 如何调用外部系统”的问题。skills 和 MCP 工具并不是同一个层次的东西。

简单来说:

  • MCP 工具更像是“外设”,提供数据或操作能力,比如查询商品系统、读取数据库、生成图片。
  • skills 更像是“操作规程”,告诉 Agent 怎么完成一个复杂任务。
  • skill 的内部实现里,可以调用 MCP 工具来获取数据。

举个例子,一个“生成带货视频分镜”的 skill,可能需要先通过 MCP 工具读取商品信息,再用本地脚本生成分镜 JSON。这样 skill 就包了一层业务逻辑,MCP 只负责底层数据连接。

3.4 最小可运行 skill 示例

先看一个最简单的技能包,它做的事情是:输入一个商品名称,输出一个 60 秒口播脚本模板。

目录结构:

~/.claude/skills/video_script_writer/ ├── SKILL.md └── scripts/ └── generate_script.py

SKILL.md 内容:

--- name: video_script_writer description: 输入商品名称、卖点和目标用户,生成60秒以内的直播带货口播脚本。适合在准备带货视频文案时使用。 --- # 视频口播脚本生成器 ## 功能 根据商品信息生成结构化的口播脚本,包含开场、痛点、卖点、转化、结尾五个部分。 ## 输入 - product_name: 商品名称 - selling_points: 卖点列表 - target_audience: 目标用户描述 ## 输出 - output/script.md:完整口播脚本 ## 执行步骤 1. 读取输入参数。 2. 运行 `python scripts/generate_script.py --config <config.json>`。 3. 将生成的 script.md 路径返回给用户。

generate_script.py 内容:

#!/usr/bin/env python3 import argparse import json import os import sys from datetime import datetime def load_config(config_path: str) -> dict: with open(config_path, "r", encoding="utf-8") as f: return json.load(f) def generate_script(config: dict) -> str: product_name = config.get("product_name", "示例商品") selling_points = config.get("selling_points", []) audience = config.get("target_audience", "普通消费者") points_text = "\n".join([f"- {point}" for point in selling_points]) lines = [ f"# {product_name} 口播脚本", "", f"适用人群:{audience}", f"生成时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}", "", "## 一、开场(0-5秒)", f"各位朋友,今天给大家带来一个『{product_name}』。", "", "## 二、痛点(5-15秒)", "你是不是也遇到过类似的问题?", "", "## 三、卖点(15-40秒)", points_text, "", "## 四、转化(40-50秒)", "今天下单,还有限时优惠。", "", "## 五、结尾(50-60秒)", "点击下方链接,抓紧入手!", ] return "\n".join(lines) def main(): parser = argparse.ArgumentParser() parser.add_argument("--config", required=True, help="配置文件路径") args = parser.parse_args() config = load_config(args.config) script = generate_script(config) output_dir = "output" os.makedirs(output_dir, exist_ok=True) output_path = os.path.join(output_dir, "script.md") with open(output_path, "w", encoding="utf-8") as f: f.write(script) print(f"[video_script_writer] 脚本已生成: {output_path}") if __name__ == "__main__": main()

这是一个最小示例。它不依赖第三方库,任何 Python 3.10 环境都能直接运行。后面实战案例中,我会在这个基础上扩展出更完整的技能包。

4. 完整实战:Agent + skills + MinimaxH3 自动生成带货知识视频

现在我们进入核心实战。目标是在本地搭建一条“视频生产流水线”,输入一个商品配置,最终得到一条完整的长视频文件。

4.1 流水线设计与数据流

先把流程拆成 5 个阶段,每个阶段对应一个 skill:

阶段Skill 名称输入输出
1. 选题分析topic_researcher商品关键词、品类推荐选题 JSON
2. 脚本撰写video_script_writer商品信息、选题口播脚本 markdown
3. 分镜设计storyboard_designer口播脚本分镜 JSON
4. 视频生成video_generator分镜 JSON、提示词视频片段文件
5. 合成质检video_composer视频片段列表最终长视频文件

数据流可以用一句话描述:上一个 skill 的输出,经过解析后成为下一个 skill 的输入。所有中间产物都用 JSON 落盘到output/目录,方便排查和回溯。

4.2 创建项目结构

在任意目录创建项目文件夹:

mkdir -p mini-video-pipeline/.claude/skills cd mini-video-pipeline mkdir -p output

最终目录结构如下:

mini-video-pipeline/ ├── .claude/ │ └── skills/ │ ├── topic_researcher/ │ ├── video_script_writer/ │ ├── storyboard_designer/ │ ├── video_generator/ │ └── video_composer/ ├── config.json ├── pipeline.py └── output/

4.3 编写选题与脚本 Skill

先写第一个技能:topic_researcher。它的作用是输入商品关键词,输出推荐选题。为了演示方便,这里用本地规则生成候选选题,实际项目中你可以让 Agent 调用大模型或外部数据接口。

~/.claude/skills/topic_researcher/SKILL.md

--- name: topic_researcher description: 根据商品关键词和品类分析潜在选题方向。适合直播带货、知识分享视频开始前的选题调研。 --- # 选题调研 ## 输入 - keyword: 商品关键词 - category: 品类 ## 输出 - output/topics.json:候选选题列表

~/.claude/skills/topic_researcher/scripts/research.py

#!/usr/bin/env python3 import argparse import json import os import sys from datetime import datetime def build_topic_pool(keyword: str, category: str) -> list: return [ {"title": f"{keyword}到底怎么选?一看就懂的选购指南", "type": "选购"}, {"title": f"用了3个月{keyword},说说真实体验", "type": "体验"}, {"title": f"直播间都在推的{keyword},真的值得买吗?", "type": "测评"}, {"title": f"3个关于{keyword}的认知误区,你中招了吗?", "type": "误区"}, ] def main(): parser = argparse.ArgumentParser() parser.add_argument("--config", required=True) args = parser.parse_args() with open(args.config, "r", encoding="utf-8") as f: config = json.load(f) keyword = config.get("keyword", "示例商品") category = config.get("category", "百货") topics = build_topic_pool(keyword, category) output_dir = "output" os.makedirs(output_dir, exist_ok=True) output_path = os.path.join(output_dir, "topics.json") with open(output_path, "w", encoding="utf-8") as f: json.dump({"topics": topics, "generated_at": datetime.now().isoformat()}, f, ensure_ascii=False, indent=2) print(f"[topic_researcher] 已生成选题: {output_path}") for t in topics: print(f" - {t['title']}") if __name__ == "__main__": main()

接下来是脚本撰写技能 video_script_writer。这个技能在上文最小示例的基础上做增强:支持从 topics.json 中读取选题,把选题标题作为脚本主题,并且预留了大模型调用接口。

~/.claude/skills/video_script_writer/SKILL.md

--- name: video_script_writer description: 根据商品信息和选题标题生成直播带货知识分享口播脚本。适合在需要准备视频文案、直播讲稿、商品介绍内容时使用。 --- # 视频口播脚本生成器 ## 功能 根据商品信息和选题生成结构化口播脚本,包含开场、痛点、知识分享、卖点、转化、结尾。 ## 输入 - topic: 选题标题 - product_name: 商品名称 - selling_points: 卖点列表 - target_audience: 目标用户描述 ## 输出 - output/script.md:完整口播脚本 ## 执行步骤 1. 读取输入参数。 2. 运行 `python scripts/generate_script.py --config <config_json>`。 3. 将生成的 script.md 路径返回给用户。

~/.claude/skills/video_script_writer/scripts/generate_script.py

#!/usr/bin/env python3 import argparse import json import os import sys from datetime import datetime def generate_script(config: dict) -> str: topic = config.get("topic", "如何选购优质商品") product_name = config.get("product_name", "示例商品") selling_points = config.get("selling_points", ["卖点1", "卖点2"]) audience = config.get("target_audience", "普通消费者") points_text = "\n".join([f"{i+1}. {point}" for i, point in enumerate(selling_points)]) lines = [ f"# {topic}", "", f"目标用户:{audience}", f"生成时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}", "", "## 一、开场(0-5秒)", "大家好,欢迎来到直播间。今天分享一个很实用的话题:" + topic + "。", "", "## 二、痛点(5-15秒)", "很多朋友在选购时都很纠结,担心买贵、买错、买完后悔。", "", "## 三、知识分享(15-40秒)", "其实只要抓住3个关键点,就能少走很多弯路。", "", points_text, "", "## 四、产品引入(40-50秒)", f"我手里这款『{product_name}』,就正好满足这些条件。", "", "## 五、转化与结尾(50-60秒)", "如果觉得有用,点个关注,更多选购技巧持续分享。", ] return "\n".join(lines) def main(): parser = argparse.ArgumentParser() parser.add_argument("--config", required=True) args = parser.parse_args() with open(args.config, "r", encoding="utf-8") as f: config = json.load(f) script = generate_script(config) output_dir = "output" os.makedirs(output_dir, exist_ok=True) output_path = os.path.join(output_dir, "script.md") with open(output_path, "w", encoding="utf-8") as f: f.write(script) print(f"[video_script_writer] 脚本已生成: {output_path}") if __name__ == "__main__": main()

4.4 编写分镜与视频生成 Skill

分镜设计 stage 的作用,是把口播脚本拆成一句一句的镜头单位,并为每个镜头生成一个视频画面提示词。

~/.claude/skills/storyboard_designer/SKILL.md

--- name: storyboard_designer description: 将口播脚本拆分为分镜列表,并为每个分镜生成视频画面提示词。适合在视频生成前准备分镜脚本时使用。 --- # 分镜设计 ## 功能 读取口播脚本,按段落拆分成镜头单位,输出分镜 JSON。 ## 输出 - output/storyboard.json:分镜列表

~/.claude/skills/storyboard_designer/scripts/build_storyboard.py

#!/usr/bin/env python3 import argparse import json import os import sys import re def split_script(script_path: str) -> list: with open(script_path, "r", encoding="utf-8") as f: content = f.read() blocks = re.findall(r"##\s+[^ ]+\s+([^)]+)\s*\n(.*?)(?=\n##|\Z)", content, re.S) if not blocks: lines = [line.strip() for line in content.splitlines() if line.strip()] blocks = lines return blocks def build_prompt_for_block(block: str, index: int) -> str: block = block.strip().replace("\n", " ") return ( f"直播带货视频镜头{index + 1},画面需要配合口播内容展示相关场景。" f"口播内容:{block[:80]}。" f"风格:专业、明亮、适合短视频平台。" ) def main(): parser = argparse.ArgumentParser() parser.add_argument("--script", required=True) args = parser.parse_args() blocks = split_script(args.script) storyboard = [] for i, block in enumerate(blocks): storyboard.append({ "id": i + 1, "narration": block.strip(), "prompt": build_prompt_for_block(block, i), "duration": 5, }) output_dir = "output" os.makedirs(output_dir, exist_ok=True) output_path = os.path.join(output_dir, "storyboard.json") with open(output_path, "w", encoding="utf-8") as f: json.dump({"shots": storyboard}, f, ensure_ascii=False, indent=2) print(f"[storyboard_designer] 已生成分镜: {output_path}") print(f"共 {len(storyboard)} 个镜头") if __name__ == "__main__": main()

接下来是视频生成技能 video_generator。这个 skill 负责调用 MinimaxH3 模型或任意视频生成模型,为每个分镜生成一个短视频片段。这里的示例代码会给出通用请求结构,但接口路径、鉴权方式、字段名一定要以你使用的官方文档为准,不要直接复制到生产环境。

~/.claude/skills/video_generator/SKILL.md

--- name: video_generator description: 根据分镜列表调用视频生成模型生成短视频片段。适合在长视频自动化生产中生成画面素材时使用。 --- # 视频片段生成器 ## 功能 读取 storyboard.json,逐条调用视频生成模型接口,生成并保存视频片段。 ## 输入 - storyboard.json:分镜列表 - api_key:模型服务密钥 - endpoint:模型接口地址 ## 输出 - output/clips/:视频片段文件目录

~/.claude/skills/video_generator/scripts/generate_video.py

#!/usr/bin/env python3 import argparse import json import os import sys import time import urllib.request def generate_single_clip( prompt: str, duration: int, api_key: str, endpoint: str, model_name: str, ) -> str: """ 调用视频生成模型,生成单个视频片段。 示例代码使用通用 JSON 请求结构,具体字段以官方文档为准。 """ request_body = { "model": model_name, "prompt": prompt, "duration_seconds": duration, } req = urllib.request.Request( endpoint, data=json.dumps(request_body).encode("utf-8"), headers={ "Authorization": f"Bearer {api_key}", "Content-Type": "application/json", }, method="POST", ) with urllib.request.urlopen(req, timeout=180) as resp: result = json.loads(resp.read().decode("utf-8")) # 注意:这里假设接口返回里包含视频文件地址,字段名请按官方文档调整 video_url = result.get("video_url") or result.get("data", {}).get("video_url") if not video_url: raise RuntimeError(f"视频生成接口响应中没有找到 video_url,响应内容:{str(result)[:500]}") return video_url def download_video(url: str, save_path: str) -> None: req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"}) with urllib.request.urlopen(req, timeout=180) as resp, open(save_path, "wb") as f: f.write(resp.read()) def main(): parser = argparse.ArgumentParser() parser.add_argument("--storyboard", required=True) parser.add_argument("--api-key", default=os.environ.get("VIDEO_API_KEY", "")) parser.add_argument("--endpoint", default=os.environ.get("VIDEO_API_ENDPOINT", "")) parser.add_argument("--model", default="minimax-h3") args = parser.parse_args() if not args.api_key or not args.endpoint: print("请设置 VIDEO_API_KEY 和 VIDEO_API_ENDPOINT 环境变量") sys.exit(1) with open(args.storyboard, "r", encoding="utf-8") as f: storyboard = json.load(f) shots = storyboard.get("shots", []) output_dir = "output/clips" os.makedirs(output_dir, exist_ok=True) for shot in shots: shot_id = shot["id"] prompt = shot["prompt"] duration = shot.get("duration", 5) save_path = os.path.join(output_dir, f"clip_{shot_id:03d}.mp4") if os.path.exists(save_path) and os.path.getsize(save_path) > 0: print(f"[video_generator] 片段 {shot_id} 已存在,跳过: {save_path}") continue print(f"[video_generator] 正在生成片段 {shot_id}/{len(shots)} ...") try: video_url = generate_single_clip(prompt, duration, args.api_key, args.endpoint, args.model) download_video(video_url, save_path) print(f" 已保存: {save_path}") except Exception as e: print(f" 生成片段 {shot_id} 失败: {e}") print(" 继续下一个片段,稍后可对缺失片段进行重试。") # 控制请求频率,避免超出接口限流 time.sleep(2) print("[video_generator] 视频片段生成完毕") print(f"已生成目录: {os.path.abspath(output_dir)}") if __name__ == "__main__": main()

这里的“生成结果分片重试”“跳过已存在文件”都是有实际工程意义的。视频生成接口是异步且昂贵的,网络抖动会导致个别片段失败,所以脚本必须支持断点续跑。

4.5 编写合成与质检 Skill

生成完视频片段后,最后一步是把所有片段拼接成一条长视频,并做基础质检。这里依赖 ffmpeg,并且校验片段文件是否存在、大小是否合理。

~/.claude/skills/video_composer/SKILL.md

--- name: video_composer description: 将多个视频片段按顺序拼接为长视频,并检查输出文件完整性。适合在视频生成后的合成阶段使用。 --- # 视频合成器 ## 功能 读取分镜列表,使用 ffmpeg 拼接视频片段,输出最终长视频。 ## 输出 - output/final_video.mp4:拼接后的完整视频

~/.claude/skills/video_composer/scripts/compose.py

#!/usr/bin/env python3 import argparse import json import os import subprocess import sys def check_clips(shots: list, clips_dir: str) -> tuple: missing = [] existing = [] for shot in shots: clip_path = os.path.join(clips_dir, f"clip_{shot['id']:03d}.mp4") if not os.path.exists(clip_path) or os.path.getsize(clip_path) < 1024: missing.append(shot["id"]) else: existing.append(clip_path) return existing, missing def compose_video(clip_paths: list, output_path: str) -> None: os.makedirs(os.path.dirname(output_path), exist_ok=True) list_file = "output/clips_list.txt" with open(list_file, "w", encoding="utf-8") as f: for clip_path in clip_paths: f.write(f"file '{clip_path}'\n") cmd = [ "ffmpeg", "-y", "-f", "concat", "-safe", "0", "-i", list_file, "-c:v", "libx264", "-c:a", "aac", output_path, ] result = subprocess.run(cmd, capture_output=True, text=True) if result.returncode != 0: print(result.stderr[-2000:]) raise RuntimeError("ffmpeg 合成失败") print(f"[video_composer] 已生成长视频: {output_path}") def main(): parser = argparse.ArgumentParser() parser.add_argument("--storyboard", required=True) parser.add_argument("--clips-dir", default="output/clips") parser.add_argument("--output", default="output/final_video.mp4") args = parser.parse_args() with open(args.storyboard, "r", encoding="utf-8") as f: storyboard = json.load(f) shots = storyboard.get("shots", []) existing, missing = check_clips(shots, args.clips_dir) if missing: print(f"[video_composer] 缺少片段: {missing}") print("请先重新生成缺失片段,再执行合成。") sys.exit(1) compose_video(existing, args.output) final_size = os.path.getsize(args.output) print(f"[video_composer] 最终视频大小: {final_size / 1024 / 1024:.2f} MB") if __name__ == "__main__": main()

4.6 编写 Agent 编排入口

到这里,5 个 skill 已经写完。现在需要一个总入口来把它们串起来。这个入口脚本读取配置,依次调用各个 skill 的脚本,完成整条流水线。

项目根目录下创建config.json

{ "keyword": "智能保温杯", "category": "家居生活", "product_name": "智能保温杯 Pro", "selling_points": [ "316L 不锈钢内胆,食品级材质", "智能温度显示,触摸杯盖即亮", "12 小时长效保温,适合办公场景" ], "target_audience": "办公室白领、经常喝热饮的人群" }

创建pipeline.py

#!/usr/bin/env python3 import argparse import json import os import subprocess import sys from datetime import datetime SKILLS_DIR = os.path.expanduser("~/.claude/skills") def run_script(script_path: str, *args: str) -> None: if not os.path.exists(script_path): print(f"[pipeline] 脚本不存在: {script_path}") sys.exit(1) print(f"\n[pipeline] 执行: {script_path}") result = subprocess.run( [sys.executable, script_path, *args], capture_output=True, text=True, ) print(result.stdout) if result.returncode != 0: print(result.stderr[-2000:]) sys.exit(result.returncode) def main() -> None: parser = argparse.ArgumentParser() parser.add_argument("--config", default="config.json") args = parser.parse_args() with open(args.config, "r", encoding="utf-8") as f: config = json.load(f) output_dir = "output" os.makedirs(output_dir, exist_ok=True) # 阶段1:生成选题 run_script( os.path.join(SKILLS_DIR, "topic_researcher", "scripts", "research.py"), "--config", args.config, ) # 新建带选题的配置,供脚本撰写使用 script_config = dict(config) script_config["topic"] = "智能保温杯到底怎么选?看完少花冤枉钱" temp_config = os.path.join(output_dir, "script_config.json") with open(temp_config, "w", encoding="utf-8") as f: json.dump(script_config, f, ensure_ascii=False, indent=2) # 阶段2:生成脚本 run_script( os.path.join(SKILLS_DIR, "video_script_writer", "scripts", "generate_script.py"), "--config", temp_config, ) # 阶段3:生成分镜 run_script( os.path.join(SKILLS_DIR, "storyboard_designer", "scripts", "build_storyboard.py"), "--script", os.path.join(output_dir, "script.md"), ) # 阶段4:生成视频片段 run_script( os.path.join(SKILLS_DIR, "video_generator", "scripts", "generate_video.py"), "--storyboard", os.path.join(output_dir, "storyboard.json"), ) # 阶段5:合成长视频 run_script( os.path.join(SKILLS_DIR, "video_composer", "scripts", "compose.py"), "--storyboard", os.path.join(output_dir, "storyboard.json"), "--output", os.path.join(output_dir, "final_video.mp4"), ) print("\n[pipeline] 流水线执行完成") print(f"最终视频位置: {os.path.abspath(os.path.join(output_dir, 'final_video.mp4'))}") if __name__ == "__main__": main()

这里需要注意,pipeline.py中阶段 1 生成的选题,实际生产里可能会包含多个候选,你可以让 Agent 自动选择最优的,也可以手工指定。为了保持示例简单,我在脚本中直接固定了选题标题,真实项目中建议由 Agent 读取 topics.json 后再决定。

4.7 运行与验证

运行完整流水线:

export VIDEO_API_KEY="你的密钥" export VIDEO_API_ENDPOINT="https://你的视频服务商接口地址" python pipeline.py --config config.json

预期执行过程如下:

[pipeline] 执行: ~/.claude/skills/topic_researcher/scripts/research.py [topic_researcher] 已生成选题: output/topics.json - 智能保温杯到底怎么选?一看就懂的选购指南 [pipeline] 执行: ~/.claude/skills/video_script_writer/scripts/generate_script.py [video_script_writer] 脚本已生成: output/script.md [pipeline] 执行: ~/.claude/skills/storyboard_designer/scripts/build_storyboard.py [storyboard_designer] 已生成分镜: output/storyboard.json 共 6 个镜头 [pipeline] 执行: ~/.claude/skills/video_generator/scripts/generate_video.py [video_generator] 正在生成片段 1/6 ... [video_generator] 正在生成片段 2/6 ... ... [pipeline] 执行: ~/.claude/skills/video_composer/scripts/compose.py [video_composer] 已生成长视频: output/final_video.mp4 [pipeline] 流水线执行完成 最终视频位置: /Users/xxx/mini-video-pipeline/output/final_video.mp4

如果某个环节失败,不要急着把整个流程重跑。我在脚本里特意加了“跳过已存在片段”的逻辑,它允许你在修正问题后重新执行 pipeline.py,已经生成好的片段不会被覆盖,节省 API 调用成本。

5. 常见问题与排查思路

在实际使用这套方案时,比较容易踩到下面这些坑。

问题现象可能原因解决思路
Agent 找不到自定义 skillskills 目录路径不对,或 SKILL.md 的 name/description 不够明确确认目录在~/.claude/skills或项目.claude/skills;检查 description 是否写清楚触发场景
skill 脚本报 ModuleNotFoundError脚本依赖了第三方库但未安装在对应 skill 的 requirements.txt 中声明依赖,并执行pip install -r requirements.txt
视频生成接口返回 401API Key 错误或权限不足检查环境变量,确认账户额度;不要将 Key 直接写入代码
调用视频生成接口超时请求阻塞,或模型生成时间较长延长 timeout,或改用异步任务 + 轮询结果
部分视频片段缺失网络抖动、接口限流脚本加入重试和断点续跑逻辑,只补生成缺失片段
ffmpeg 合成失败片段格式不一致,码率或分辨率不统一先统一转码,或使用 filter_complex 拼接
最终视频没有声音片段本身无音轨,或合成参数缺音频编码生成时检查声道配置,合成时用-c:a aac
视频内容与口播不匹配画面提示词写得太模糊在分镜设计中强化画面描述,把口播文本中的名词放进去

这里挑几个典型问题展开说一下。

5.1 视频生成接口的返回结构不一致

不同的视频生成服务商接口差异很大,有的返回一个 task_id 需要轮询,有的直接返回视频下载地址,还有的会返回一个任务状态,需要你之后主动查询。我建议在正式接入前,先手动发一条测试请求,确认响应 JSON 的真实结构,再修改generate_single_clip函数中的解析逻辑。

5.2 长视频应该一次生成还是分片拼接

当前主流的视频生成模型对单次生成时长通常有限制,一次性生成几十秒的长视频容易失败。更稳妥的做法是:每个分镜只生成 5 到 10 秒的短视频片段,最后用 ffmpeg 拼接。这样即使中间某个片段失败,重新生成的成本也低。

5.3 片段拼接后音画不同步

如果每个片段都带独立的配音或背景音乐,拼接后很容易出现节奏错乱。建议在合成阶段只保留主音轨,或者在上游统一控制生成参数,让每个片段都是“带有统一风格音轨”的素材。最省事的方案是生成时关闭片段自带音频,最后统一加一条背景音乐。

6. 最佳实践与工程建议

6.1 skills 的命名与版本管理

skills 会越写越多,建议从一开始就做好规划:

  • 每个 skill 只做一件事,名字使用“动词_对象”结构,例如build_storyboardgenerate_video
  • SKILL.md 的 description 必须写清楚“什么时候用”,这是 Agent 判断是否加载技能的依据。
  • 用 Git 管理 skills 目录,版本发生变化时打 tag,方便回滚。
  • 公共技能放到用户级目录,业务技能放到项目级目录。

6.2 不要把密钥写进 skill

skills 目录可能会被分享或提交到代码仓库,所以 API Key、数据库密码绝不能写进 SKILL.md 或脚本里。统一使用环境变量:

export VIDEO_API_KEY="xxx" export VIDEO_API_ENDPOINT="https://xxx"

如果你使用.env文件,记得加入.gitignore

6.3 视频生成的成本控制

视频生成模型按秒计费时,成本不可忽视。以下几个建议可以帮你省钱:

  1. 先小批量测试:先拿一个分镜测试整个链路,确认没问题再批量生成。
  2. 断点续跑:每个片段生成后立即落盘,已经存在的文件跳过。
  3. 失败重试要有上限:连续失败 3 次就暂停,避免浪费额度。
  4. 缓存分镜结果:分镜 JSON 不需要每次重新生成,脚本稳定后直接复用。

6.4 内容审核与合规

直播带货和知识分享视频有内容合规要求。自动化生产确实提高了效率,但也放大了风险,因为模型不会主动判断一句话是否违规。建议在流水线中加入审核环节:

  • 口播脚本生成后,检查是否存在夸大宣传、绝对化用语、医疗功效类敏感词。
  • 视频生成后,人工抽检画面与口播是否匹配。
  • 广告法禁止的表述(如“最”“第一”“100%”)要提前做词表过滤。
  • 涉及保健品、金融、医疗等行业时,不要完全依赖自动化,必须人工审核。

6.5 日志与可追溯性

自动化流水线的最大问题是“出了问题不好定位”。建议在每个 skill 的脚本里都输出格式化的日志,并把中间产物 JSON 完整落盘。我在前面脚本中把输出目录固定为output/,你可以进一步按日期分子目录:

output/ └── 2025-01-01/ ├── topics.json ├── script.md ├── storyboard.json ├── clips/ └── final_video.mp4

这样每次生产的视频链路都有完整留痕。

7. 总结与下一步学习方向

到这里,一套完整的“Agent 工具 + skills + MinimaxH3 模型自动生成长视频”方案已经落地。你学会了:

  1. 如何理解 Agent 工具和 skills 技能包的协作关系。
  2. 如何编写一个规范的自定义 skill,包括 SKILL.md 和辅助脚本。
  3. 如何把视频生产流程拆成选题、脚本、分镜、生成、合成五个阶段。
  4. 如何接入 MinimaxH3 视频生成模型,并做好异常处理和断点续跑。
  5. 如何在生产环境中做成本控制、内容审核和日志管理。

这套流水线的第一版并不完美,但它最大的价值是把“可复用的视频生产能力”沉淀下来了。以后无论换商品、换选题、换账号,都只需要修改config.json,然后重新执行pipeline.py,剩下的事情交给 Agent。

下一步,建议你先不要急着把所有环节都接上模型。先把“脚本→分镜→视频片段生成”这一小段打通,用最小的成本验证视频生成效果。然后再逐步补充素材管理、异步任务队列、多平台发布等能力。也可以继续学习 MCP 协议,把你的商品系统、素材库、审核系统接入进来,让这套视频流水线离真正的商业生产更近一步。

如果本文对你有帮助,可以收藏备用,后面做自动化视频生产时照着配就行。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询