# AI生成
**本文引用的文件**
- [main.py](file://main.py)
- [PROJECT_README.md](file://PROJECT_README.md)
- [requirements.txt](file://requirements.txt)
- [backend/scripter.py](file://backend/scripter.py)
- [backend/extractor.py](file://backend/extractor.py)
- [backend/data_builder.py](file://backend/data_builder.py)
- [backend/media_fetcher.py](file://backend/media_fetcher.py)
- [backend/video_processor/schemas.py](file://backend/video_processor/schemas.py)
- [backend/video_processor/utils.py](file://backend/video_processor/utils.py)
- [tests/test_video_cli.py](file://tests/test_video_cli.py)
- [tests/test_video_processor.py](file://tests/test_video_processor.py)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本项目是一个“自动人生规划视频生成器”,通过将PDF版人生规划报告与采访视频,结合AI生成的自然日语旁白、图表动画与B-Roll素材,最终合成3-5分钟的个性化解释性视频。其中,scripter.py模块负责使用Google Gemini Pro API将结构化的财务数据转化为自然流畅的日语旁白脚本。本文围绕该模块展开,详细说明提示词工程设计(如何整合客户数据、财务预测与视频节奏要求)、在主流程中的位置与输入输出格式、以及面向初学者的流程图与面向高级开发者的实现细节与优化建议。
## 项目结构
- 后端Python模块位于 backend/,包含:
- scripter.py:脚本生成器(当前为占位实现)
- extractor.py:PDF与视频抽取器(当前为占位实现)
- data_builder.py:财务模拟与图表数据构建
- media_fetcher.py:B-Roll素材抓取(当前为占位实现)
- video_processor/:视频处理工具与数据结构(供未来集成)
- 前端Remotion渲染引擎位于 frontend/,通过 render_props.json 与后端对接
- main.py 作为入口,编排整个流水线
```mermaid
graph TB
A["main.py
入口与流水线编排"] --> B["backend/scripter.py
脚本生成器"]
A --> C["backend/extractor.py
PDF/视频抽取器"]
A --> D["backend/data_builder.py
财务模拟与图表数据"]
A --> E["backend/media_fetcher.py
B-Roll素材抓取"]
A --> F["frontend/
Remotion渲染引擎"]
G["backend/video_processor/schemas.py
视频处理数据结构"] -. 可选集成 .-> A
H["backend/video_processor/utils.py
FFmpeg工具集"] -. 可选集成 .-> A
```
**图表来源**
- [main.py](file://main.py#L48-L84)
- [backend/scripter.py](file://backend/scripter.py#L14-L69)
- [backend/extractor.py](file://backend/extractor.py#L15-L84)
- [backend/data_builder.py](file://backend/data_builder.py#L150-L200)
- [backend/media_fetcher.py](file://backend/media_fetcher.py#L15-L72)
- [backend/video_processor/schemas.py](file://backend/video_processor/schemas.py#L12-L91)
- [backend/video_processor/utils.py](file://backend/video_processor/utils.py#L13-L164)
**章节来源**
- [main.py](file://main.py#L48-L84)
- [PROJECT_README.md](file://PROJECT_README.md#L132-L141)
## 核心组件
- 脚本生成器(ScriptGenerator):封装Gemini Pro调用、提示词构建、响应解析与时长估计
- PDF/视频抽取器(PDFExtractor/VideoExtractor):从PDF与视频中提取结构化数据与时间戳
- 财务模拟器(FinancialSimulator):基于参数模拟资产枯竭与现金流,生成图表所需数据
- B-Roll素材抓取器(MediaFetcher):根据关键词检索并下载B-Roll素材
- 视频处理工具(VideoProcessor):提供视频分析与切片等能力(可选)
**章节来源**
- [backend/scripter.py](file://backend/scripter.py#L14-L69)
- [backend/extractor.py](file://backend/extractor.py#L15-L84)
- [backend/data_builder.py](file://backend/data_builder.py#L15-L115)
- [backend/media_fetcher.py](file://backend/media_fetcher.py#L15-L72)
- [backend/video_processor/schemas.py](file://backend/video_processor/schemas.py#L12-L91)
- [backend/video_processor/utils.py](file://backend/video_processor/utils.py#L13-L164)
## 架构总览
脚本生成在整体流水线中的位置如下:
```mermaid
sequenceDiagram
participant U as "用户"
participant M as "main.py
VideoGeneratorPipeline"
participant X as "extractor.py
PDF/视频抽取"
participant S as "scripter.py
ScriptGenerator"
participant D as "data_builder.py
财务模拟"
participant R as "Remotion
前端渲染"
U->>M : 运行命令行
M->>X : 提取PDF/视频数据
X-->>M : 返回结构化数据
M->>S : 生成旁白脚本
S-->>M : 返回脚本片段与同步点
M->>D : 构建图表数据
D-->>M : 返回资产/现金流数据
M->>R : 写入render_props.json并触发渲染
R-->>U : 输出MP4视频
```
**图表来源**
- [main.py](file://main.py#L48-L84)
- [backend/scripter.py](file://backend/scripter.py#L22-L49)
- [backend/data_builder.py](file://backend/data_builder.py#L150-L200)
**章节来源**
- [main.py](file://main.py#L48-L84)
- [PROJECT_README.md](file://PROJECT_README.md#L132-L141)
## 详细组件分析
### ScriptGenerator(脚本生成器)
- 职责
- 初始化:从环境变量读取API密钥,校验可用性
- generate:接收PDF数据与可选视频数据,返回包含分段、总时长与同步点的结构化脚本
- _build_prompt:构建提示词(当前为占位),应整合客户信息、财务预测、风格约束与输出格式要求
- 输入输出
- 输入:pdf_data(结构化财务数据)、video_data(可选,含转录与时间戳)、style(友好/专业/随意)
- 输出:包含segments(脚本文本、时长、类型)、total_duration、sync_points
- 设计要点
- 风格控制:通过style参数与提示词工程控制语气与专业度
- 结构化输出:要求模型以JSON格式返回segments,便于后续解析与时长估算
- 多模态融合:将视频转录的时间戳与脚本同步点对齐,提升节奏一致性
```mermaid
classDiagram
class ScriptGenerator {
+api_key : str
+__init__(api_key)
+generate(pdf_data, video_data, style) Dict
-_build_prompt(pdf_data, style) str
}
```
**图表来源**
- [backend/scripter.py](file://backend/scripter.py#L14-L69)
**章节来源**
- [backend/scripter.py](file://backend/scripter.py#L14-L69)
### 提示词工程设计(Prompt Engineering)
- 数据整合
- 客户数据:姓名、年龄、退休年龄、寿命预期、资产、收入、支出等
- 财务预测:来自data_builder.py的资产枯竭与现金流数据,用于生成“现状”“趋势”“风险预警”等段落
- 视频节奏:来自extractor.py的视频转录与时间戳,用于生成“配合画面”的过渡与强调段落
- 风格与语气
- friendly:自然、温和、易懂
- professional:严谨、准确、适合正式场合
- casual:轻松、口语化、贴近日常
- 输出约束
- JSON格式,包含segments数组,每段含id、text、duration、type
- 总时长控制在3-5分钟范围内
- 同步点
- 在脚本中标注chart/intro/transition等类型,便于后续与图表动画与B-Roll素材对齐
提示词模板设计要点(概念性说明,不对应具体代码):
- 角色设定:你是专业的财务顾问,用日语向客户讲解其人生规划
- 上下文:提供客户画像与财务预测摘要
- 任务:生成一段自然流畅的旁白,包含引言、现状分析、趋势解读、风险提示与建议
- 风格:根据style参数调整语气
- 输出:严格遵循JSON结构,包含分段文本与时长
**章节来源**
- [backend/scripter.py](file://backend/scripter.py#L22-L49)
- [backend/data_builder.py](file://backend/data_builder.py#L150-L200)
- [backend/extractor.py](file://backend/extractor.py#L23-L41)
### main.py 中的 generate_script 方法
- 位置:VideoGeneratorPipeline.generate_script
- 功能:调用后端脚本生成模块,返回结构化脚本
- 当前实现:占位返回mock脚本,包含segments列表
- 实际实现建议:调用ScriptGenerator.generate,传入pdf_data与video_data,解析返回的JSON并估算每段时长
```mermaid
flowchart TD
Start(["进入 generate_script"]) --> CheckArgs["检查输入参数
pdf_data, video_data"]
CheckArgs --> CallGen["调用 ScriptGenerator.generate(...)"]
CallGen --> ParseResp["解析返回的JSON结构
segments, total_duration, sync_points"]
ParseResp --> EstimateDur["估算每段时长
按目标时长比例分配"]
EstimateDur --> ReturnScript["返回结构化脚本"]
```
**图表来源**
- [main.py](file://main.py#L115-L134)
- [backend/scripter.py](file://backend/scripter.py#L22-L49)
**章节来源**
- [main.py](file://main.py#L115-L134)
### 财务数据与脚本的衔接
- data_builder.py 模块根据pdf_data生成资产枯竭与现金流数据,供前端图表使用
- scripter.py 应在提示词中引用这些数据摘要,使脚本内容与图表一致
- 通过style参数与提示词工程,确保脚本语气与数据呈现相匹配
**章节来源**
- [backend/data_builder.py](file://backend/data_builder.py#L150-L200)
- [backend/scripter.py](file://backend/scripter.py#L22-L49)
### B-Roll素材与脚本的协同
- media_fetcher.py 的fetch_broll函数可根据脚本关键词检索B-Roll素材
- 关键词提取:从segments.text中抽取主题词,如“資産”“将来”“リスク”等
- 同步:将脚本的sync_points与B-Roll片段起止时间对齐,提升观看体验
**章节来源**
- [backend/media_fetcher.py](file://backend/media_fetcher.py#L15-L72)
- [backend/scripter.py](file://backend/scripter.py#L22-L49)
### 视频处理(可选集成)
- schemas.py 定义了VideoSegment、KeyMoment、VideoAnalysisResult等数据结构
- utils.py 提供FFmpeg封装,支持时长查询、音频提取、视频切片
- 可选策略:audio-first或direct,用于抽取视频转录与时间戳,辅助scripter生成更贴合画面的脚本
**章节来源**
- [backend/video_processor/schemas.py](file://backend/video_processor/schemas.py#L12-L91)
- [backend/video_processor/utils.py](file://backend/video_processor/utils.py#L13-L164)
- [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)
## 依赖关系分析
- main.py 依赖 backend/scripter.py 生成脚本,依赖 backend/data_builder.py 生成图表数据
- backend/scripter.py 依赖环境变量中的GEMINI_API_KEY
- backend/media_fetcher.py 依赖PEXELS_API_KEY
- backend/extractor.py 依赖GEMINI_API_KEY与OPENAI_API_KEY
- 视频处理模块与main.py之间为可选集成
```mermaid
graph LR
M["main.py"] --> SG["backend/scripter.py"]
M --> DB["backend/data_builder.py"]
M --> MF["backend/media_fetcher.py"]
M --> EX["backend/extractor.py"]
SG --> ENV1["GEMINI_API_KEY"]
MF --> ENV2["PEXELS_API_KEY"]
EX --> ENV3["GEMINI_API_KEY/OPENAI_API_KEY"]
```
**图表来源**
- [main.py](file://main.py#L48-L84)
- [backend/scripter.py](file://backend/scripter.py#L17-L21)
- [backend/media_fetcher.py](file://backend/media_fetcher.py#L18-L22)
- [backend/extractor.py](file://backend/extractor.py#L18-L21)
**章节来源**
- [requirements.txt](file://requirements.txt#L1-L34)
- [PROJECT_README.md](file://PROJECT_README.md#L106-L111)
## 性能考量
- API调用成本控制
- 使用缓存:对重复的提示词与翻译结果进行缓存,减少Gemini/Whisper调用次数
- 批量请求:合并相似请求,避免频繁往返
- 响应解析与结构化
- 强制JSON输出,减少后处理开销
- 对异常响应进行重试与降级策略
- 渲染阶段
- render_props.json尽量紧凑,避免冗余字段
- 图表数据按需生成,避免不必要的计算
[本节为通用建议,无需特定文件引用]
## 故障排查指南
- API密钥缺失
- 确认 .env 文件存在且包含有效密钥
- GEMINI_API_KEY、OPENAI_API_KEY、PEXELS_API_KEY
- FFmpeg依赖
- 使用测试脚本检查依赖安装情况
- 若未安装,按提示安装FFmpeg与ffprobe
- 渲染失败
- 确认前端依赖已安装
- 检查render_props.json结构是否符合前端schema
**章节来源**
- [PROJECT_README.md](file://PROJECT_README.md#L106-L111)
- [tests/test_video_cli.py](file://tests/test_video_cli.py#L68-L91)
- [backend/video_processor/utils.py](file://backend/video_processor/utils.py#L148-L164)
## 结论
scripter.py模块是将结构化财务数据转化为自然日语旁白的关键环节。通过精心设计的提示词工程,将客户数据、财务预测与视频节奏要求有机融合,可生成既专业又富有人情味的脚本。在主流水线中,它位于PDF/视频抽取之后、图表数据构建之前,为后续B-Roll与渲染阶段提供高质量的文本基础。随着各模块逐步完善,系统将形成一条从数据到视频的完整自动化管线。
[本节为总结性内容,无需特定文件引用]
## 附录
### 实际代码示例(路径指引)
- 调整生成风格
- 在调用处设置style参数,参考:[backend/scripter.py](file://backend/scripter.py#L22-L49)
- 添加新的解说段落类型
- 在提示词中新增类型定义与样例,参考:[backend/scripter.py](file://backend/scripter.py#L50-L59)
- 解析与扩展脚本结构
- 在返回后对segments进行二次加工,参考:[main.py](file://main.py#L115-L134)
### API与配置清单
- 环境变量
- GEMINI_API_KEY:Google Gemini API
- OPENAI_API_KEY:OpenAI Whisper
- PEXELS_API_KEY:Pexels B-Roll
- 依赖安装
- Python依赖:参考 [requirements.txt](file://requirements.txt#L1-L34)
**章节来源**
- [PROJECT_README.md](file://PROJECT_README.md#L106-L111)
- [requirements.txt](file://requirements.txt#L1-L34)