# 故障排除 **本文引用的文件** - [PROJECT_README.md](file://PROJECT_README.md) - [verify_structure.py](file://verify_structure.py) - [main.py](file://main.py) - [requirements.txt](file://requirements.txt) - [package.json](file://package.json) - [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) - [tests/test_video_cli.py](file://tests/test_video_cli.py) - [tests/test_video_processor.py](file://tests/test_video_processor.py) - [.env.example](file://.env.example) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能注意事项](#性能注意事项) 8. [故障排除指南](#故障排除指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本指南面向使用本项目的用户与开发者,聚焦“常见问题现象—根本原因—解决方案”的闭环排查流程,并结合项目内置的结构验证脚本,帮助快速定位缺失文件、环境变量、依赖安装与渲染失败等问题。同时提供可操作的诊断步骤与修复命令,降低技术支持门槛。 ## 项目结构 项目采用“Python 后端 + Node.js 前端(Remotion)”的混合架构,数据通过中间产物 JSON 在两端之间传递。关键目录与文件包括: - assets/0_input:原始输入(PDF、MP4) - assets/1_processed:中间产物(提取结果、翻译缓存、B-Roll下载等) - assets/2_output:最终输出(生成的视频) - backend:Python 模块(PDF/视频解析、脚本生成、媒体抓取、数据模拟) - frontend:Remotion 前端工程(React + TypeScript + Recharts) - 根目录配置:.env、requirements.txt、package.json、remotion.config.ts、verify_structure.py、main.py ```mermaid graph TB A["main.py
主入口与流水线编排"] --> B["backend.extractor.py
PDF/视频解析"] A --> C["backend.scripter.py
脚本生成"] A --> D["backend.media_fetcher.py
B-Roll抓取"] A --> E["backend.data_builder.py
财务模拟/图表数据"] A --> F["assets/1_processed/render_props.json
数据契约"] F --> G["frontend/src/index.ts
Remotion渲染入口"] G --> H["frontend/src/components/*
图表与合成组件"] H --> I["最终视频输出
assets/2_output/*.mp4"] ``` 图示来源 - [main.py](file://main.py#L1-L305) - [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) 章节来源 - [PROJECT_README.md](file://PROJECT_README.md#L50-L80) - [PROJECT_README.md](file://PROJECT_README.md#L132-L141) ## 核心组件 - 主入口与流水线编排:负责参数解析、目录准备、步骤调度与调用各模块、保存 render_props.json 并触发 Remotion 渲染。 - 数据提取器:封装 PDF 与视频解析接口,读取环境变量中的 API Key,抛出明确错误提示。 - 脚本生成器:根据 PDF 与可选视频内容生成自然语言脚本,同样依赖环境变量。 - 媒体抓取器:基于关键词从 Pexels 抓取 B-Roll 视频,依赖 Pexels API Key。 - 数据构建器:执行财务模拟,生成资产枯竭与现金流图表数据,供前端渲染使用。 - 结构验证脚本:校验目录与文件完整性、导入可用性、CLI 可用性,辅助迁移与初始化。 章节来源 - [main.py](file://main.py#L33-L301) - [backend/extractor.py](file://backend/extractor.py#L15-L84) - [backend/scripter.py](file://backend/scripter.py#L14-L69) - [backend/media_fetcher.py](file://backend/media_fetcher.py#L15-L72) - [backend/data_builder.py](file://backend/data_builder.py#L1-L200) - [verify_structure.py](file://verify_structure.py#L1-L136) ## 架构总览 下图展示从输入到输出的端到端流程,以及关键错误点的定位位置。 ```mermaid sequenceDiagram participant U as "用户" participant M as "main.py" participant X as "extractor.py" participant S as "scripter.py" participant MF as "media_fetcher.py" participant DB as "data_builder.py" participant R as "Remotion渲染" participant O as "assets/2_output" U->>M : 运行命令传入PDF/可选视频 M->>X : 提取PDF/视频数据 X-->>M : 返回结构化数据或报错 M->>S : 生成脚本 S-->>M : 返回脚本或报错 M->>MF : 抓取B-Roll MF-->>M : 返回资源或报错 M->>DB : 构建图表数据 DB-->>M : 返回render_props.json M->>R : 触发渲染npx remotion render R-->>O : 输出最终视频 ``` 图示来源 - [main.py](file://main.py#L48-L225) - [backend/extractor.py](file://backend/extractor.py#L23-L42) - [backend/scripter.py](file://backend/scripter.py#L22-L48) - [backend/media_fetcher.py](file://backend/media_fetcher.py#L25-L41) - [backend/data_builder.py](file://backend/data_builder.py#L150-L200) ## 详细组件分析 ### 组件A:主入口与流水线编排 - 功能要点 - 参数解析与配置合并(支持 --pdf/--video/--config/--output/--dry-run) - 自动创建 assets 子目录 - 步骤顺序:PDF 解析 → 视频解析(可选)→ 脚本生成 → B-Roll 抓取 → 图表数据构建 → 保存 render_props.json → 触发渲染 - 渲染命令通过 npx remotion render 执行,当前处于占位状态(注释掉实际子进程调用) - 关键错误点 - 缺少必要参数时直接报错 - 渲染阶段若未启用实际子进程调用,会显示占位信息而非真实错误 - 优化建议 - 在渲染阶段取消注释子进程调用,确保错误能被上层捕获 - 将 dry-run 与渲染阶段解耦,便于独立调试 ```mermaid flowchart TD Start(["开始"]) --> Parse["解析参数与配置"] Parse --> MkDirs["创建assets子目录"] MkDirs --> Step1["Step 1: PDF解析"] Step1 --> Step2["Step 2: 视频解析可选"] Step2 --> Step3["Step 3: 生成脚本"] Step3 --> Step4["Step 4: 抓取B-Roll"] Step4 --> Step5["Step 5: 构建图表数据"] Step5 --> SaveProps["保存render_props.json"] SaveProps --> Render["触发Remotion渲染"] Render --> End(["结束"]) ``` 图示来源 - [main.py](file://main.py#L48-L225) 章节来源 - [main.py](file://main.py#L228-L301) ### 组件B:数据提取器(PDF/视频) - 功能要点 - PDFExtractor:从 PDF 中抽取结构化数据,需要 GEMINI_API_KEY - VideoExtractor:对视频进行转录与时间戳抽取,需要 OPENAI_API_KEY - 错误处理 - 若环境变量缺失,直接抛出异常,提示缺少对应 API Key - 诊断要点 - 确认 .env 文件存在且包含有效密钥 - 确认网络可达与配额充足 ```mermaid classDiagram class PDFExtractor { +__init__(api_key) +extract(pdf_path) Dict } class VideoExtractor { +__init__(api_key) +extract(video_path) Dict } PDFExtractor <.. VideoExtractor : "均依赖环境变量" ``` 图示来源 - [backend/extractor.py](file://backend/extractor.py#L15-L84) 章节来源 - [backend/extractor.py](file://backend/extractor.py#L15-L84) ### 组件C:脚本生成器 - 功能要点 - 基于 PDF 与可选视频内容生成自然语言脚本,需要 GEMINI_API_KEY - 错误处理 - 环境变量缺失时抛出异常 - 诊断要点 - 配置 .env 并确认 Gemini API 可用 章节来源 - [backend/scripter.py](file://backend/scripter.py#L14-L48) ### 组件D:媒体抓取器(B-Roll) - 功能要点 - 依据关键词从 Pexels 搜索并下载 B-Roll,需要 PEKELS_API_KEY - 错误处理 - 环境变量缺失时抛出异常 - 诊断要点 - 配置 .env 并确认 Pexels API 可用 章节来源 - [backend/media_fetcher.py](file://backend/media_fetcher.py#L15-L41) ### 组件E:数据构建器(财务模拟) - 功能要点 - 使用默认通胀率、赤字利率、投资回报率等参数进行年金模拟,生成资产枯竭与现金流数据 - 错误处理 - 无显式异常处理,需在上游保证输入数据合法 - 诊断要点 - 确保 PDF 解析返回的数据字段齐全 章节来源 - [backend/data_builder.py](file://backend/data_builder.py#L150-L200) ## 依赖关系分析 - Python 依赖 - dotenv:加载 .env - ffmpeg-python、requests:媒体处理与网络请求 - tqdm、rich:进度与日志 - Node.js 依赖 - remotion、react、recharts:渲染引擎与图表 - 开发工具链:ESLint、TypeScript、Prettier - 外部服务 - Google Gemini API(PDF 解析、脚本生成) - OpenAI Whisper(音频转录) - Pexels API(B-Roll) ```mermaid graph LR subgraph "Python" P1["dotenv"] P2["ffmpeg-python"] P3["requests"] P4["tqdm/rich"] end subgraph "Node.js" N1["remotion"] N2["react/recharts"] N3["typescript/eslint/prettier"] end subgraph "外部服务" E1["Gemini API"] E2["OpenAI Whisper"] E3["Pexels API"] end P1 --> E1 P2 --> E2 P3 --> E3 N1 --> E3 ``` 图示来源 - [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) ## 性能注意事项 - API 调用成本与配额 - Gemini、Whisper、Pexels 均有配额限制,建议在本地或 CI 中合理控制并发与重试策略 - 渲染性能 - Remotion 渲染耗时与图表复杂度、B-Roll 视频长度相关,建议先使用 dry-run 生成数据以验证流程 - 本地依赖 - FFmpeg 安装与可用性直接影响视频转录与处理,建议在测试前单独验证 [本节为通用指导,不直接分析具体文件] ## 故障排除指南 ### 一、环境变量与密钥问题 - 现象 - “API 密钥未找到” - 根因 - .env 文件缺失或未正确填写;或运行环境中未加载 .env - 修复步骤 - 复制示例文件并填写密钥 - 复制命令参考:[PROJECT_README.md](file://PROJECT_README.md#L99-L111) - 示例文件路径:[.env.example](file://.env.example#L1-L23) - 确认密钥类型与来源 - Gemini:用于 PDF 解析与脚本生成 - OpenAI:用于 Whisper 转录 - Pexels:用于 B-Roll 下载 - 验证方法 - 运行结构验证脚本,检查后端模块导入是否成功 - 参考:[verify_structure.py](file://verify_structure.py#L75-L97) 章节来源 - [PROJECT_README.md](file://PROJECT_README.md#L97-L111) - [.env.example](file://.env.example#L1-L23) - [verify_structure.py](file://verify_structure.py#L75-L97) ### 二、PDF 提取失败 - 现象 - PDF 解析阶段报错或返回空数据 - 根因 - PDF 不可读或受密码保护;Gemini API 额度不足或网络异常 - 修复步骤 - 确保输入 PDF 可打开且非加密 - 检查 .env 中 GEMINI_API_KEY 是否正确 - 如为首次使用,确认 API 已激活并有足够配额 - 验证方法 - 使用 verify_structure.py 的导入测试,确认 extractor 模块可用 - 参考:[verify_structure.py](file://verify_structure.py#L75-L97) - 查看 extractor 抛出的异常信息(缺少密钥时会直接报错) - 参考:[backend/extractor.py](file://backend/extractor.py#L18-L22) 章节来源 - [PROJECT_README.md](file://PROJECT_README.md#L228-L231) - [backend/extractor.py](file://backend/extractor.py#L18-L22) - [verify_structure.py](file://verify_structure.py#L75-L97) ### 三、视频转录失败 - 现象 - 视频解析阶段报错或无法生成时间戳 - 根因 - 缺少 OPENAI_API_KEY;FFmpeg 未安装或不可用;视频格式不受支持 - 修复步骤 - 安装 FFmpeg 并确保在 PATH 中 - 参考:[tests/test_video_cli.py](file://tests/test_video_cli.py#L71-L80) - 确认 .env 中 OPENAI_API_KEY 已设置 - 使用独立测试工具检查依赖 - 参考:[tests/test_video_cli.py](file://tests/test_video_cli.py#L68-L91) - 验证方法 - 运行单元测试(需 OPENAI_API_KEY),验证音频优先策略 - 参考:[tests/test_video_processor.py](file://tests/test_video_processor.py#L113-L140) 章节来源 - [tests/test_video_cli.py](file://tests/test_video_cli.py#L68-L91) - [tests/test_video_processor.py](file://tests/test_video_processor.py#L113-L140) - [backend/extractor.py](file://backend/extractor.py#L48-L51) ### 四、B-Roll 抓取失败 - 现象 - B-Roll 获取阶段报错或返回空结果 - 根因 - 缺少 PEKELS_API_KEY;网络异常;关键词为空 - 修复步骤 - 确认 .env 中 PEKELS_API_KEY 已设置 - 检查网络连通性与 API 配额 - 验证方法 - 运行结构验证脚本,确认 media_fetcher 模块可用 - 参考:[verify_structure.py](file://verify_structure.py#L75-L97) - 查看 media_fetcher 抛出的异常信息(缺少密钥时会直接报错) - 参考:[backend/media_fetcher.py](file://backend/media_fetcher.py#L18-L21) 章节来源 - [PROJECT_README.md](file://PROJECT_README.md#L228-L231) - [backend/media_fetcher.py](file://backend/media_fetcher.py#L18-L21) - [verify_structure.py](file://verify_structure.py#L75-L97) ### 五、Remotion 渲染失败 - 现象 - 渲染阶段报错或无输出 - 根因 - Node.js 依赖未安装;Remotion 配置不正确;前端组件缺失;渲染命令未启用 - 修复步骤 - 安装 Node.js 依赖 - 参考:[PROJECT_README.md](file://PROJECT_README.md#L91-L95) - 依赖清单:[package.json](file://package.json#L1-L43) - 确认 frontend/src 目录结构与组件注册正确 - 参考:[PROJECT_README.md](file://PROJECT_README.md#L50-L80) - 检查 remotion.config.ts 是否存在 - 参考:[PROJECT_README.md](file://PROJECT_README.md#L56-L58) - 在 main.py 中启用渲染子进程调用(当前为占位) - 参考:[main.py](file://main.py#L217-L225) - 验证方法 - 使用 verify_structure.py 的 CLI 测试,确认 main.py --help 可用 - 参考:[verify_structure.py](file://verify_structure.py#L98-L121) 章节来源 - [PROJECT_README.md](file://PROJECT_README.md#L91-L95) - [PROJECT_README.md](file://PROJECT_README.md#L50-L80) - [package.json](file://package.json#L1-L43) - [main.py](file://main.py#L217-L225) - [verify_structure.py](file://verify_structure.py#L98-L121) ### 六、项目目录结构完整性检查 - 现象 - 运行后提示某些文件缺失或导入失败 - 根因 - 迁移或克隆后遗漏关键目录/文件 - 修复步骤 - 使用结构验证脚本一次性检查所有必需项 - 参考:[verify_structure.py](file://verify_structure.py#L12-L74) - 若缺失,请对照项目结构补充 - 参考:[PROJECT_README.md](file://PROJECT_README.md#L50-L80) - 验证方法 - 运行导入测试,确认 backend 包与子模块均可导入 - 参考:[verify_structure.py](file://verify_structure.py#L75-L97) - 运行 CLI 测试,确认 main.py --help 可用 - 参考:[verify_structure.py](file://verify_structure.py#L98-L121) 章节来源 - [verify_structure.py](file://verify_structure.py#L12-L74) - [verify_structure.py](file://verify_structure.py#L75-L97) - [verify_structure.py](file://verify_structure.py#L98-L121) - [PROJECT_README.md](file://PROJECT_README.md#L50-L80) ### 七、Dry Run 与数据验证 - 现象 - 希望跳过渲染阶段,仅生成数据 - 根因 - 未使用 --dry-run 参数 - 修复步骤 - 使用 --dry-run 生成 render_props.json,随后手动检查 - 参考:[PROJECT_README.md](file://PROJECT_README.md#L126-L130) - 验证方法 - 检查 assets/1_processed/render_props.json 是否生成 - 参考:[main.py](file://main.py#L72-L77) 章节来源 - [PROJECT_README.md](file://PROJECT_README.md#L126-L130) - [main.py](file://main.py#L72-L77) ### 八、Python 依赖缺失 - 现象 - 导入 backend 模块时报错或功能受限 - 根因 - requirements.txt 未安装或版本不匹配 - 修复步骤 - 安装 Python 依赖 - 参考:[PROJECT_README.md](file://PROJECT_README.md#L87-L90) - 依赖清单:[requirements.txt](file://requirements.txt#L1-L34) - 验证方法 - 运行 verify_structure.py 的导入测试 - 参考:[verify_structure.py](file://verify_structure.py#L75-L97) 章节来源 - [PROJECT_README.md](file://PROJECT_README.md#L87-L90) - [requirements.txt](file://requirements.txt#L1-L34) - [verify_structure.py](file://verify_structure.py#L75-L97) ## 结论 本指南围绕“环境变量、API 密钥、依赖安装、数据提取、脚本生成、B-Roll 抓取、财务模拟、Remotion 渲染”八个关键环节,提供了系统化的诊断与修复路径。配合 verify_structure.py 的结构检查与 dry-run 数据验证,可显著降低问题定位成本,提升整体使用体验。 [本节为总结性内容,不直接分析具体文件] ## 附录 ### A. 常见命令速查 - 安装 Python 依赖 - 参考:[PROJECT_README.md](file://PROJECT_README.md#L87-L90) - 安装 Node.js 依赖 - 参考:[PROJECT_README.md](file://PROJECT_README.md#L91-L95) - 运行结构验证 - 参考:[verify_structure.py](file://verify_structure.py#L128-L136) - 生成数据(跳过渲染) - 参考:[PROJECT_README.md](file://PROJECT_README.md#L126-L130) - 检查 FFmpeg 依赖 - 参考:[tests/test_video_cli.py](file://tests/test_video_cli.py#L71-L80) ### B. 关键文件清单 - 环境变量模板:[.env.example](file://.env.example#L1-L23) - Python 依赖清单:[requirements.txt](file://requirements.txt#L1-L34) - Node.js 依赖清单:[package.json](file://package.json#L1-L43) - 主入口与流水线:[main.py](file://main.py#L1-L305) - 结构验证脚本:[verify_structure.py](file://verify_structure.py#L1-L136) - 数据提取器:[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) - 视频处理测试工具:[tests/test_video_cli.py](file://tests/test_video_cli.py#L1-L161) - 视频处理单元测试:[tests/test_video_processor.py](file://tests/test_video_processor.py#L1-L143)