# 快速入门 **本文引用的文件** - [PROJECT_README.md](file://PROJECT_README.md) - [.env.example](file://.env.example) - [requirements.txt](file://requirements.txt) - [package.json](file://package.json) - [main.py](file://main.py) - [backend/extractor.py](file://backend/extractor.py) - [backend/scripter.py](file://backend/scripter.py) - [backend/media_fetcher.py](file://backend/media_fetcher.py) - [backend/data_builder.py](file://backend/data_builder.py) - [frontend/src/render-props-types.ts](file://frontend/src/render-props-types.ts) - [remotion.config.ts](file://remotion.config.ts) - [tests/test_video_cli.py](file://tests/test_video_cli.py) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖与环境配置](#依赖与环境配置) 7. [输入文件准备](#输入文件准备) 8. [执行生成流程](#执行生成流程) 9. [依赖关系分析](#依赖关系分析) 10. [性能与优化建议](#性能与优化建议) 11. [故障排查指南](#故障排查指南) 12. [结论](#结论) ## 简介 本指南面向首次接触本项目的用户,帮助您从零开始完成依赖安装、环境配置、输入准备与完整生成流程。系统采用“Python 后端 + Node.js 前端”的混合架构:Python 负责数据提取、脚本生成、图表模拟与渲染参数构建;前端使用 Remotion 进行程序化视频渲染。通过本指南,您将理解为什么需要 Gemini、Whisper 和 Pexels 的 API 密钥,以及每一步背后的原理。 ## 项目结构 项目采用分层组织: - 根目录包含入口脚本、依赖清单、环境样例与资产目录 - backend 子目录包含数据提取、脚本生成、媒体抓取与图表数据构建等模块 - frontend 子目录为 Remotion 视频渲染前端工程 - assets 目录用于存放输入、中间产物与最终输出 ```mermaid graph TB A["根目录
main.py, .env.example, requirements.txt, package.json"] --> B["backend/
extractor.py, scripter.py, media_fetcher.py, data_builder.py"] A --> C["frontend/
src/*"] A --> D["assets/
0_input, 1_processed, 2_output"] A --> E["remotion.config.ts"] ``` **章节来源** - [PROJECT_README.md](file://PROJECT_README.md#L50-L80) ## 核心组件 - 主入口与流水线编排:负责解析 CLI 参数、组织各阶段任务、保存渲染参数并触发前端渲染 - 数据提取模块:使用 Gemini 解析 PDF,使用 Whisper 提取视频字幕与时间戳 - 脚本生成模块:基于 PDF 与视频内容生成自然日语旁白脚本 - 媒体抓取模块:根据关键词从 Pexels 搜索并下载 B-Roll 视频 - 图表数据构建:基于财务模拟生成资产枯竭与现金流图表数据 - 渲染契约类型定义:前后端共享的渲染参数结构,确保 Python 生成的数据与前端渲染一致 **章节来源** - [main.py](file://main.py#L33-L304) - [backend/extractor.py](file://backend/extractor.py#L1-L84) - [backend/scripter.py](file://backend/scripter.py#L1-L69) - [backend/media_fetcher.py](file://backend/media_fetcher.py#L1-L72) - [backend/data_builder.py](file://backend/data_builder.py#L1-L200) - [frontend/src/render-props-types.ts](file://frontend/src/render-props-types.ts#L1-L251) ## 架构总览 系统采用“数据驱动”的流水线式架构:Python 后端负责数据处理与渲染参数生成,前端 Remotion 负责将数据转换为最终视频。 ```mermaid graph TB subgraph "Python 后端" EX["PDF/视频提取
extractor.py"] SC["脚本生成
scripter.py"] MF["媒体抓取
media_fetcher.py"] DB["图表数据构建
data_builder.py"] VP["主流水线编排
main.py"] end subgraph "前端" RP["渲染契约类型
render-props-types.ts"] RC["Remotion 配置
remotion.config.ts"] end IN["输入 PDF/视频
assets/0_input"] --> VP VP --> EX VP --> SC VP --> MF VP --> DB DB --> RP SC --> RP MF --> RP RP --> RC RC --> OUT["输出视频
assets/2_output"] ``` **图示来源** - [main.py](file://main.py#L33-L304) - [backend/extractor.py](file://backend/extractor.py#L1-L84) - [backend/scripter.py](file://backend/scripter.py#L1-L69) - [backend/media_fetcher.py](file://backend/media_fetcher.py#L1-L72) - [backend/data_builder.py](file://backend/data_builder.py#L1-L200) - [frontend/src/render-props-types.ts](file://frontend/src/render-props-types.ts#L1-L251) - [remotion.config.ts](file://remotion.config.ts#L1-L12) ## 详细组件分析 ### 主流水线编排(main.py) - 负责解析 CLI 参数、组织六步流程(提取、转录、生成脚本、抓取媒体、构建渲染参数、触发渲染),并在 dry-run 模式下仅生成渲染参数 - 输出路径默认保存到 assets/2_output/life_plan_video.mp4 ```mermaid sequenceDiagram participant U as "用户" participant M as "main.py" participant B as "后端模块" participant R as "Remotion" U->>M : 运行 CLI指定 PDF/可选视频/干运行 M->>B : 步骤1:提取 PDF 数据 M->>B : 步骤2:提取视频数据可选 M->>B : 步骤3:生成脚本 M->>B : 步骤4:抓取 B-Roll M->>B : 步骤5:构建渲染参数 M->>R : 步骤6:触发渲染可选 R-->>U : 输出最终视频 ``` **图示来源** - [main.py](file://main.py#L33-L304) **章节来源** - [main.py](file://main.py#L33-L304) ### 数据提取(PDF/视频) - PDF 提取:使用 Gemini 解析 Life Plan 报告,抽取客户信息、财务数据、重大事件等结构化数据 - 视频提取:使用 Whisper 将面试视频转写为文本与时间戳,便于后续脚本与媒体同步 ```mermaid flowchart TD A["输入:PDF/视频"] --> B["PDF 提取Gemini"] A --> C["视频提取Whisper"] B --> D["结构化数据"] C --> E["转写文本与时间戳"] D --> F["脚本生成Gemini"] E --> F ``` **图示来源** - [backend/extractor.py](file://backend/extractor.py#L1-L84) - [backend/scripter.py](file://backend/scripter.py#L1-L69) **章节来源** - [backend/extractor.py](file://backend/extractor.py#L1-L84) - [backend/scripter.py](file://backend/scripter.py#L1-L69) ### 媒体抓取(B-Roll) - 基于脚本与关键词从 Pexels 搜索并下载 B-Roll 视频,作为背景素材 - 支持将日文关键词翻译为英文后再搜索,提高检索命中率 ```mermaid flowchart TD S["脚本生成结果"] --> K["提取关键词"] K --> T["关键词翻译Gemini"] T --> P["Pexels 搜索"] P --> D["下载视频至本地"] D --> A["返回媒体映射"] ``` **图示来源** - [backend/media_fetcher.py](file://backend/media_fetcher.py#L1-L72) **章节来源** - [backend/media_fetcher.py](file://backend/media_fetcher.py#L1-L72) ### 图表数据构建 - 使用财务模拟引擎计算年金收入、支出、资产余额与关键事件影响 - 生成资产枯竭与现金流两个图表所需的时间序列数据 ```mermaid flowchart TD I["PDF 结构化数据"] --> F["财务模拟器"] F --> AD["资产枯竭时间线"] F --> CF["现金流时间线"] AD --> O["渲染参数charts.assetDepletion"] CF --> O ``` **图示来源** - [backend/data_builder.py](file://backend/data_builder.py#L1-L200) **章节来源** - [backend/data_builder.py](file://backend/data_builder.py#L1-L200) ### 渲染契约类型(前后端数据契约) - 定义了渲染参数的完整结构(元信息、图表数据、脚本段落、媒体集合),并与前端类型保持一致 - 通过 Zod Schema 在运行时进行校验,保证数据一致性 ```mermaid classDiagram class YearlySnapshot { +year : number +ages : {rep : number, spouse? : number} +financials : {income, expenditure, assetBalance} +events? : string[] +isCritical? : boolean } class CashFlowData { +year : number +age : number +income.total : number +expenses : {living, housing, education, tax, event} +totalExpense? : number +netCashFlow? : number +assetBalance? : number } class ScriptSegment { +id : number +text : string +duration : number +type : enum +assetUrl? : string +chartSync? : {chartId, highlightYear?, animationStart?} } class AssetCollection { +broll : Record +videoClips : VideoClipReference[] +ttsAudio? : string } class RenderProps { +meta : {title, currencyUnit, duration, clientName?, generatedAt?} +charts : {assetDepletion, cashFlow} +script : ScriptSegment[] +assets : AssetCollection } RenderProps --> YearlySnapshot : "charts.assetDepletion.timeline" RenderProps --> CashFlowData : "charts.cashFlow.timeline" RenderProps --> ScriptSegment : "script[]" RenderProps --> AssetCollection : "assets" ``` **图示来源** - [frontend/src/render-props-types.ts](file://frontend/src/render-props-types.ts#L1-L251) **章节来源** - [frontend/src/render-props-types.ts](file://frontend/src/render-props-types.ts#L1-L251) ## 依赖与环境配置 ### 1) 依赖安装 - Python 依赖:安装项目所需的 Python 包(含 dotenv、ffmpeg-python、requests、tqdm、rich 等) - Node.js 依赖:安装前端渲染与开发工具(Remotion、React、Recharts、TypeScript 等) ```mermaid flowchart TD P["Python 依赖"] --> R["requirements.txt"] N["Node.js 依赖"] --> PJ["package.json"] R --> PY["pip install -r requirements.txt"] PJ --> NP["npm install"] ``` **图示来源** - [requirements.txt](file://requirements.txt#L1-L34) - [package.json](file://package.json#L1-L43) **章节来源** - [requirements.txt](file://requirements.txt#L1-L34) - [package.json](file://package.json#L1-L43) ### 2) 环境配置 - 复制环境样例文件为实际配置文件,并填入对应 API 密钥 - 必需密钥: - GEMINI_API_KEY:用于 PDF 解析与脚本生成 - OPENAI_API_KEY:用于 Whisper 音频转写 - PEXELS_API_KEY:用于 B-Roll 视频搜索与下载 - 可选配置项(财务模拟参数): - DEFAULT_INFLATION_RATE - DEFAULT_DEFICIT_INTEREST_RATE - DEFAULT_INVESTMENT_RETURN ```mermaid flowchart TD CP[".env.example -> .env"] --> KEYS["填写 API 密钥"] KEYS --> RUN["运行生成流程"] ``` **图示来源** - [.env.example](file://.env.example#L1-L23) **章节来源** - [.env.example](file://.env.example#L1-L23) - [PROJECT_README.md](file://PROJECT_README.md#L81-L131) ### 3) 为什么需要这些 API 密钥 - Gemini(Google):用于 PDF 结构化解析与自然日语脚本生成 - Whisper(OpenAI):用于将面试视频转写为带时间戳的文本,便于脚本与画面同步 - Pexels:用于按关键词搜索并下载合适的背景视频素材 **章节来源** - [PROJECT_README.md](file://PROJECT_README.md#L36-L49) - [backend/extractor.py](file://backend/extractor.py#L1-L84) - [backend/scripter.py](file://backend/scripter.py#L1-L69) - [backend/media_fetcher.py](file://backend/media_fetcher.py#L1-L72) ## 输入文件准备 - 将 Life Plan PDF 报告与面试视频放入 assets/0_input 目录 - 系统会自动在 assets/1_processed 中生成中间文件,在 assets/2_output 中生成最终视频 ```mermaid flowchart TD I["assets/0_input/report.pdf"] --> M["main.py"] V["assets/0_input/interview.mp4"] --> M M --> O["assets/2_output/life_plan_video.mp4"] ``` **图示来源** - [PROJECT_README.md](file://PROJECT_README.md#L50-L80) - [main.py](file://main.py#L33-L84) **章节来源** - [PROJECT_README.md](file://PROJECT_README.md#L50-L80) - [main.py](file://main.py#L33-L84) ## 执行生成流程 ### 基础运行(仅 PDF) - 命令示例:参考项目快速启动说明中的基础用法 - 流程:提取 PDF → 生成脚本 → 抓取媒体 → 构建渲染参数 → 触发渲染 **章节来源** - [PROJECT_README.md](file://PROJECT_README.md#L112-L131) ### 带视频输入 - 命令示例:参考项目快速启动说明中的“带面试视频”用法 - 流程:提取 PDF 与视频 → 生成脚本(结合视频转写)→ 抓取媒体 → 构建渲染参数 → 触发渲染 **章节来源** - [PROJECT_README.md](file://PROJECT_README.md#L112-L131) ### 干运行模式(仅生成渲染参数) - 命令示例:参考项目快速启动说明中的“干运行”用法 - 作用:跳过渲染阶段,仅生成 render_props.json,便于调试与验证数据结构 **章节来源** - [PROJECT_README.md](file://PROJECT_README.md#L112-L131) ### CLI 参数说明 - --pdf:必填(当未提供配置文件时),指定 Life Plan 报告路径 - --video:可选,指定面试视频路径 - --config:可选,指定自定义配置 JSON 文件 - --output:可选,自定义输出文件名 - --dry-run:可选,仅生成渲染参数,不触发渲染 **章节来源** - [main.py](file://main.py#L228-L304) ## 依赖关系分析 - Python 后端模块之间存在清晰的职责分离:extractor 负责数据提取,scripter 负责脚本生成,media_fetcher 负责媒体抓取,data_builder 负责图表数据构建 - main.py 作为编排者,协调各模块并生成渲染参数 - 前端通过 render-props-types.ts 严格约束渲染参数结构,确保与后端一致 - remotion.config.ts 控制渲染图像格式与覆盖策略 ```mermaid graph LR EX["extractor.py"] --> DB["data_builder.py"] SC["scripter.py"] --> DB MF["media_fetcher.py"] --> DB DB --> RP["render-props-types.ts"] EX --> RP SC --> RP MF --> RP RP --> RC["remotion.config.ts"] ``` **图示来源** - [backend/extractor.py](file://backend/extractor.py#L1-L84) - [backend/scripter.py](file://backend/scripter.py#L1-L69) - [backend/media_fetcher.py](file://backend/media_fetcher.py#L1-L72) - [backend/data_builder.py](file://backend/data_builder.py#L1-L200) - [frontend/src/render-props-types.ts](file://frontend/src/render-props-types.ts#L1-L251) - [remotion.config.ts](file://remotion.config.ts#L1-L12) **章节来源** - [backend/extractor.py](file://backend/extractor.py#L1-L84) - [backend/scripter.py](file://backend/scripter.py#L1-L69) - [backend/media_fetcher.py](file://backend/media_fetcher.py#L1-L72) - [backend/data_builder.py](file://backend/data_builder.py#L1-L200) - [frontend/src/render-props-types.ts](file://frontend/src/render-props-types.ts#L1-L251) - [remotion.config.ts](file://remotion.config.ts#L1-L12) ## 性能与优化建议 - 优先使用 Gemini 直接解析 PDF,避免额外的本地 PDF 处理依赖 - Whisper 转写建议选择合适语言与采样率,减少不必要的重试与失败 - Pexels 搜索时尽量提供精准关键词,减少无效请求 - 在本地缓存翻译结果与媒体下载结果,降低重复调用成本 - 使用干运行模式先验证数据结构正确性,再进行完整渲染 [本节为通用建议,无需特定文件引用] ## 故障排查指南 - “未找到 API 密钥” - 确认 .env 文件已创建且包含有效密钥 - 确认环境变量加载顺序与 dotenv 配置一致 - “Remotion 渲染失败” - 确认 Node.js 依赖已安装 - 检查前端源码结构是否符合预期 - “PDF 提取失败” - 确认 PDF 可读且未加密 - 检查 Gemini API 配额与限制 - “视频分析依赖缺失” - 使用测试脚本检查 FFmpeg 与 OpenAI 库是否安装 **章节来源** - [PROJECT_README.md](file://PROJECT_README.md#L218-L233) - [tests/test_video_cli.py](file://tests/test_video_cli.py#L1-L161) ## 结论 通过本快速入门指南,您已经了解了项目的整体架构、关键依赖与环境配置要求,并掌握了从输入准备到完整生成的全流程操作。建议在首次运行时使用干运行模式验证数据结构,随后再进行完整渲染以获得最佳体验。