视频生成逻辑 & Agent 调用结构 · v1.6.9
最后更新:2026-07-31
| 入口 | 文件 | 技术 | 用途 |
|---|---|---|---|
| FastAPI | main.py → app/asgi.py | uvicorn | REST API 服务 |
| CLI | cli.py | argparse | 命令行 + Agent 模式 |
| WebUI | webui/Main.py | Streamlit | 可视化操作界面 |
核心调用链:
入口 → 构建 VideoParams → task.start(task_id, params) → _run_pipeline()
定义:cli.py — _PIPELINE_STAGES = ("script", "terms", "audio", "subtitle", "materials", "video")
编排:app/services/task.py — _run_pipeline()
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...
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 已预设时跳过
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
task.generate_subtitle(task_id, params, video_script, sub_maker, audio_file)
→ 返回: subtitle_path: str (.srt 文件)
来源:TTS 自带时间轴 或 调用 Whisper 识别后对齐
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
task.generate_final_videos(...) 分 4 个子步骤:
video.combine_videos() — 拼接素材片段,匹配音频时长(支持 random/sequential 模式和转场特效)llm.annotate_core_info() — 标记关键短语(用 **...** 包裹)_apply_annotated_subtitles() — 更新 .srt 字幕文件video.generate_video() — 叠加字幕/BGM/标题 → 输出 final.mp4| 模块 | 大小 | 职责 |
|---|---|---|
voice.py | 71KB | TTS 语音合成 —— 多引擎适配(Edge/Azure/Gemini/OpenAI/ElevenLabs/MiMo/Chatterbox) |
video.py | 68KB | 视频合成引擎 —— MoviePy/FFmpeg 渲染,拼接,字幕叠加,转场特效 |
llm.py | 56KB | AI 文本生成 —— 脚本/词条提取/重排序/关键信息标注 |
task.py | 52KB | 流水线编排器 —— 串联所有阶段的中央调度器 |
volcano_kb.py | 50KB | 火山知识库 —— 切片语义搜索与匹配 |
material.py | 17KB | 素材获取 —— Pexels/Pixabay/Coverr API + 本地文件 |
bgm.py | 14KB | 背景音乐管理 |
subtitle.py | 10KB | 字幕生成 —— Whisper + 时间轴对齐 |
# 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
mgvp-agent → 辅助脚本通过 subprocess 调用 mgvp-cliMGVP_VIDEO_SCRIPT — Agent 撰写的脚本MGVP_VIDEO_TERMS — 搜索关键词MGVP_RERANK_TASK_ID — 打分后重跑的任务 IDMPT_LLM_API_KEY — LLM API 凭证MPT_PEXELS_API_KEY — 素材 API 凭证MPT_RESULT — 成功,含产物路径MPT_NEEDS_SCRIPT — 需要脚本MPT_NEEDS_RERANK — 需要打分MPT_NEEDS_INPUT — 需要凭证MPT_PROGRESS — 进度信息
文件:docs/skill/meiyi_geo_video_power_agent.py — main()
--subject(必填)、--root(数据目录)
pip install → 复制配置文件 → 读取环境变量写入 config → 复用已有 LLM 配置 → 恢复缓存脚本
generate_video():
--video-script 跳过 LLMmgvp-cli(subprocess.Popen + 心跳线程)MPT_RESULT VIDEO_FILE=/path/to/video.mp4 TASK_DIR=...
这是 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│ │
│←──────────────────────────│ │
│ │ │
Agent 能做的越多,CLI 内部需要的 AI 越少。
Agent 写脚本 → 跳过 LLM API
Agent 打分 → 覆盖自动匹配
Agent 提供凭证 → 解锁更多素材源
不使用复杂 RPC 协议
仅用进程退出码 + 结构化 stdout 消息
Agent 解析退出码决定下一步
通过 task_id 复用任务状态
多次失败不重复已完成阶段
心跳保活防止超时断开
MoneyPrinterTurbo Project Analysis · Generated by CodeBuddy · 2026-07-31