MoneyPrinterTurbo 项目分析

视频生成逻辑 & Agent 调用结构 · v1.6.9

最后更新:2026-07-31

🎬 一、视频生成逻辑

1.1 入口层

入口文件技术用途
FastAPImain.pyapp/asgi.pyuvicornREST API 服务
CLIcli.pyargparse命令行 + Agent 模式
WebUIwebui/Main.pyStreamlit可视化操作界面

核心调用链:

入口 → 构建 VideoParams → task.start(task_id, params) → _run_pipeline()

1.2 视频生成流水线(6 阶段)

阶段 1
script
llm.py
阶段 2
terms
llm.py
阶段 3
audio
voice.py
阶段 4
subtitle
subtitle.py
阶段 5
materials
material.py
阶段 6
video
video.py

定义:cli.py_PIPELINE_STAGES = ("script", "terms", "audio", "subtitle", "materials", "video")
编排:app/services/task.py_run_pipeline()

[阶段1] script — 生成视频脚本

task.generate_script(task_id, params)llm.generate_script(video_subject, language, paragraph_number, ...)返回: video_script: str

支持 20+ LLM Provider:OpenAI, Gemini, DeepSeek, Moonshot, Qwen, Zhipu, Ollama, DashScope, Volcengine, Tencent, Baidu...

[阶段2] terms — 提取素材搜索关键词

task.generate_terms(task_id, params, video_script)llm.generate_terms(video_subject, video_script, amount, ...)返回: video_terms: List[str]

⚠ 当 video_source == "local" 时跳过 ⚠ 当 params.video_terms 已预设时跳过

[阶段3] audio — 生成配音/TTS

task.generate_audio(task_id, params, video_script)voice.tts(script, language, voice_name, ...)返回: (audio_file, audio_duration, sub_maker)

引擎:Edge TTS Azure TTS Google TTS OpenAI TTS ElevenLabs MiMo Gemini TTS Chatterbox

[阶段4] subtitle — 生成字幕

task.generate_subtitle(task_id, params, video_script, sub_maker, audio_file)返回: subtitle_path: str (.srt 文件)

来源:TTS 自带时间轴 或 调用 Whisper 识别后对齐

[阶段5] materials — 获取视频素材

task.get_video_materials(task_id, params, video_terms, audio_duration, video_script)material.download_videos(video_source, video_terms, audio_duration, ...)返回: downloaded_videos: List[str]

素材来源:pexels pixabay coverr local volcano_kb

[阶段6] video — 合成最终视频

task.generate_final_videos(...) 分 4 个子步骤:

  1. video.combine_videos() — 拼接素材片段,匹配音频时长(支持 random/sequential 模式和转场特效)
  2. llm.annotate_core_info() — 标记关键短语(用 **...** 包裹)
  3. _apply_annotated_subtitles() — 更新 .srt 字幕文件
  4. video.generate_video() — 叠加字幕/BGM/标题 → 输出 final.mp4

1.3 核心服务模块

模块大小职责
voice.py71KBTTS 语音合成 —— 多引擎适配(Edge/Azure/Gemini/OpenAI/ElevenLabs/MiMo/Chatterbox)
video.py68KB视频合成引擎 —— MoviePy/FFmpeg 渲染,拼接,字幕叠加,转场特效
llm.py56KBAI 文本生成 —— 脚本/词条提取/重排序/关键信息标注
task.py52KB流水线编排器 —— 串联所有阶段的中央调度器
volcano_kb.py50KB火山知识库 —— 切片语义搜索与匹配
material.py17KB素材获取 —— Pexels/Pixabay/Coverr API + 本地文件
bgm.py14KB背景音乐管理
subtitle.py10KB字幕生成 —— Whisper + 时间轴对齐

1.4 关键函数签名

# task.py — 流水线控制
def _run_pipeline(task_id, params, stop_at=None, voice_preview=None) -> dict

# task.py — 各阶段函数
def generate_script(task_id, params) -> str
def generate_terms(task_id, params, video_script) -> List[str]
def generate_audio(task_id, params, video_script, voice_preview=None) -> tuple
def generate_subtitle(task_id, params, video_script, sub_maker, audio_file) -> str
def get_video_materials(task_id, params, video_terms, audio_duration, video_script="") -> List[str]
def generate_final_videos(task_id, params, downloaded_videos, audio_file,
                          subtitle_path, audio_duration, video_script="") -> tuple

# video.py — 视频合成
def combine_videos(output_path, video_paths, audio_file, aspect,
                   concat_mode, transition_mode, ...) -> str
def generate_video(video_path, audio_path, subtitle_path, output_file,
                   params, bgm_file=None, ...) -> bool

# llm.py — AI 文本
def generate_script(video_subject, language, paragraph_number, ...) -> str
def generate_terms(video_subject, video_script, amount, ...) -> List[str]
def rerank_slices(script_sentence, candidates, language, ...) -> list
def annotate_core_info(video_script, language) -> str

🤖 二、Agent 调用结构

2.1 整体三层架构

AI Agent
Claude / Cursor / 其他
辅助调度脚本
meiyi_geo_video_power_agent.py
业务 CLI
cli.py → app/services/
Agent 调用 mgvp-agent → 辅助脚本通过 subprocess 调用 mgvp-cli
CLI 通过 退出码 + stdout 消息 与 Agent 交互
Agent → 辅助脚本(环境变量)
  • MGVP_VIDEO_SCRIPT — Agent 撰写的脚本
  • MGVP_VIDEO_TERMS — 搜索关键词
  • MGVP_RERANK_TASK_ID — 打分后重跑的任务 ID
  • MPT_LLM_API_KEY — LLM API 凭证
  • MPT_PEXELS_API_KEY — 素材 API 凭证
辅助脚本 → Agent(stdout 消息)
  • MPT_RESULT — 成功,含产物路径
  • MPT_NEEDS_SCRIPT — 需要脚本
  • MPT_NEEDS_RERANK — 需要打分
  • MPT_NEEDS_INPUT — 需要凭证
  • MPT_PROGRESS — 进度信息

2.2 Agent 交互协议:退出码

0
MPT_RESULT
视频生成成功,读取 VIDEO_FILE / TASK_DIR 获取产物路径
1
MPT_ERROR
未知错误,读取 stderr 获取错误信息
10
MPT_NEEDS_INPUT
缺少 API 凭证(非 volcano_kb 源时),需设置 MPT_* 环境变量后重试
20
MPT_NEEDS_SCRIPT
无 LLM API Key 且无预设脚本,需设置 MGVP_VIDEO_SCRIPT 后重试
30
MPT_NEEDS_RERANK
火山知识库候选切片置信度不足,需对 *_candidates.json 打分后重试

2.3 辅助脚本完整工作流程

文件:docs/skill/meiyi_geo_video_power_agent.pymain()

Step 1 解析参数:--subject(必填)、--root(数据目录)
Step 2 环境准备:pip install → 复制配置文件 → 读取环境变量写入 config → 复用已有 LLM 配置 → 恢复缓存脚本
Step 3 判断是否需要 Agent 生成脚本:无 LLM Key 且无预设脚本 → 退出码 20
Step 4 校验 Pexels 配置:HTTP 验证每个 API Key → 无效则 退出码 10
Step 5 执行 generate_video()
  • 确定 task_id(优先用 MGVP_RERANK_TASK_ID 重跑)
  • Agent 提供脚本 → 用 --video-script 跳过 LLM
  • 启动 mgvp-cli(subprocess.Popen + 心跳线程)
  • 处理退出码 30 → 输出候选切片 JSON 供 Agent 打分
  • 收集产物 → 创建软链接 → 输出 MPT_RESULT
Step 6 输出最终结果:MPT_RESULT VIDEO_FILE=/path/to/video.mp4 TASK_DIR=...

2.4 Agent 重排序(Rerank)交互流程

这是 Agent 模式最核心的交互 —— 当火山知识库搜索结果置信度不够时,由 Agent 来为候选切片打分。

┌──────────────┐          ┌─────────────────┐          ┌──────────────┐
│   AI Agent   │          │   agent.py      │          │   cli.py     │
└──────┬───────┘          └────────┬────────┘          └──────┬───────┘
       │                           │                          │
       │  调用 --subject=".."       │                          │
       │──────────────────────────→│                          │
       │                           │  subprocess: mgvp-cli    │
       │                           │─────────────────────────→│
       │                           │                          │
       │                           │    [volcano_kb 搜索]      │
       │                           │    [置信度不足]            │
       │                           │                          │
       │                           │  exit code 30             │
       │                           │  + *_candidates.json      │
       │                           │←──────────────────────────│
       │                           │                          │
       │  退出码 30                 │                          │
       │  MPT_NEEDS_RERANK         │                          │
       │  TASK_ID=...              │                          │
       │  RERANK_FILE=...json      │                          │
       │←──────────────────────────│                          │
       │                           │                          │
       │  Agent 读取 candidates    │                          │
       │  Agent 对每个 sentence    │                          │
       │  的候选切片打分            │                          │
       │                           │                          │
       │  设置 MGVP_RERANK_TASK_ID  │                          │
       │  重新调用 agent.py         │                          │
       │──────────────────────────→│                          │
       │                           │  subprocess: mgvp-cli    │
       │                           │  --task-id=xxx            │
       │                           │─────────────────────────→│
       │                           │                          │
       │                           │    [复用任务状态]          │
       │                           │    [用打分选切片]          │
       │                           │    [继续生成视频]          │
       │                           │                          │
       │                           │  exit code 0              │
       │                           │←──────────────────────────│
       │                           │                          │
       │  退出码 0                  │                          │
       │  MPT_RESULT               │                          │
       │  VIDEO_FILE=/path/to/video│                          │
       │←──────────────────────────│                          │
       │                           │                          │

2.5 Agent 相关关键文件

docs/skill/
├── meiyi_geo_video_power_agent.py ← 辅助调度脚本(30KB)
├── SKILL.md ← 英文 Skill 说明
└── MeiyiGeoVideoPower_SKILL.md ← 中文 Skill 说明(更详细)

cli.py
← CLI 入口(含 RerankNeeded 异常处理,退出码 30)
test/services/test_mpt_agent_skill.py
← Agent Skill 测试
pyproject.toml
← 注册 mgvp-agent 和 mgvp-cli 入口点

2.6 Agent 模式设计思想

渐进式降级

Agent 能做的越多,CLI 内部需要的 AI 越少。
Agent 写脚本 → 跳过 LLM API
Agent 打分 → 覆盖自动匹配
Agent 提供凭证 → 解锁更多素材源

退出码驱动

不使用复杂 RPC 协议
仅用进程退出码 + 结构化 stdout 消息
Agent 解析退出码决定下一步

幂等重试

通过 task_id 复用任务状态
多次失败不重复已完成阶段
心跳保活防止超时断开

MoneyPrinterTurbo Project Analysis · Generated by CodeBuddy · 2026-07-31