lec2note / DEVELOPER_GUIDE.md
LRU1's picture
sentence
dd9b31b
# Lec2Note 开发者指南 (Developer Guide)
## 1. 项目概述
Lec2Note 致力于提供一个端到端的 **“视频讲座自动生成笔记”** 解决方案。
通过多模态分析技术,深度融合视频画面与音频内容,生成 **图文并茂、结构清晰** 的笔记。
### 1.1 核心流程
1. **基于字幕的精细分块**:将 ASR 生成的每一句话视为独立的 *micro-chunk*,并在句末时间点精确截取关键帧。
2. **分层合并策略**
- **阶段一·视觉预合并**:仅根据视觉相似度合并连续 *micro-chunks*
- **阶段二·语义合并**:在视觉合并结果上再根据文本语义相似度合并。
3. **多模态信息提取与采样**
- **文本**:拼接主题块包含的全部字幕文本。
- **图像**:采样该主题块的关键帧(最多 6 张)。
4. **分块笔记生成**:调用多模态 LLM,为每个主题块生成独立笔记。
5. **全局笔记合成**:再次调用 LLM,对所有分块笔记进行整合、去重与润色。
### 1.2 目标使用场景
- 学术课程录播
- 会议 / 研讨会记录
- 企业内部培训视频
---
## 2. 技术栈
| 层级 | 主要技术 | 说明 |
|------|----------|------|
| **语言** | Python 3.9+ | 主代码基于 Python |
| **视频 / 图像处理** | OpenCV, Pillow | 截图、图像处理、图像相似度计算 (SSIM / pHash) |
| **OCR** | PaddleOCR / Tesseract | 提取关键帧中的幻灯片文字 |
| **ASR** | Whisper / Faster-Whisper | 生成句子级时间戳 |
| **语义分析** | Sentence Transformers | 计算文本语义相似度 |
| **LLM** | Gemini-2.5-pro | 多模态模型,生成笔记 |
| **Web 框架** | FastAPI | 提供 RESTful & WebSocket 服务 |
| **任务编排** | Prefect / Celery | 批处理与重试机制 |
| **数据库** | SQLite (dev) / PostgreSQL (prod) | 存储元数据与任务状态 |
| **容器** | Docker & Docker Compose | 一键部署 |
---
## 3. 目录结构与模块划分
```text
Lec2Note/
├── docs/ # 设计文档 & 会议记录
├── lec2note/ # 源码包 (Python)
│ ├── ingestion/ # 音频处理 & ASR
│ ├── vision/ # 视频画面处理模块
│ │ ├── frame_extractor.py
│ │ ├── image_comparator.py
│ │ ├── image_sampler.py
│ │ └── ocr_processor.py
│ ├── segmentation/ # 分块与合并模块
│ │ ├── sentence_chunker.py
│ │ └── chunk_merger.py
│ ├── processing/ # 多模态信息融合与 LLM 生成
│ ├── synthesis/ # 全局笔记整合与导出
│ ├── assets/ # 静态模板 (Markdown/HTML)
│ └── api/ # FastAPI 路由
├── scripts/ # CLI 脚本 & 任务调度
├── tests/ # PyTest 单元与集成测试
├── Dockerfile
├── docker-compose.yml
└── README.md
```
---
## 4. 核心功能说明
### 4.1 分块与合并策略
1. **生成句块**`sentence_chunker.run()` 根据 ASR 输出生成 `{start, end, text, keyframe_path}`*sentence_chunks*
2. **分层合并**`chunk_merger.run()` 先视觉预合并,再语义合并,得到 *topic_chunks*
3. **关键帧采样**`image_sampler.sample()` 均匀采样关键帧,最多保留 6 张。
4. **输出**:最终得到包含文本及代表性截图的 `final_chunks`
### 4.2 信息提取 (Extraction)
对采样后的截图进行 OCR,丰富文本信息。
### 4.3 图文融合与生成 (Processing)
- **Prompt 构建**:在文本中插入 `[IMAGE_n]` 占位符,并附上对应图像列表。
- **LLM 调用**`processor.generate_note_chunk()` 使用多模态 LLM 生成 Markdown 格式笔记。
### 4.4 笔记合成 (Synthesis)
`assembler.merge()` 收集所有 `note_chunk` 文本,构建新 Prompt,调用 LLM 进行去重、重排与润色,输出完整笔记。
### 4.5 API 一览
| 方法 | 路径 | 功能 |
|------|------|------|
| `POST` | `/upload` | 上传视频 → 返回任务 ID |
| `GET` | `/status/{id}` | 查询任务进度 |
| `GET` | `/notes/{id}` | 获取生成的图文笔记 |
### 4.6 内部模块接口
| 模块 | 关键类 / 方法 | 输入 | 输出 | 说明 |
|------|--------------|------|------|------|
| `ingestion.whisper_runner` | `WhisperRunner.transcribe()` | 音频路径 | `[{start, end, text}, …]` | 句子级 ASR 结果 |
| `vision.frame_extractor` | `FrameExtractor.capture_at()` | 视频路径, 时间戳列表 | 图片路径列表 | 精确截图 |
| `vision.image_comparator` | `ImageComparator.get_similarity()` | 两张图片路径 | 相似度 (0-1) | pHash / SSIM |
| `vision.image_sampler` | `ImageSampler.sample()` | 图片路径列表, `max_n` | 采样后路径列表 | 均匀采样 |
| `segmentation.sentence_chunker` | `SentenceChunker.run()` | 字幕列表, 视频路径 | *sentence_chunks* | 生成微型块 |
| `segmentation.chunk_merger` | `ChunkMerger.run()` | *sentence_chunks* | `final_chunks` | 分层合并 |
| `processing.processor` | `Processor.generate_note()` | `final_chunk` | `NoteChunk` | 调用 LLM |
| `synthesis.assembler` | `Assembler.merge()` | `NoteChunk` 列表 | Markdown/HTML | 全局整合 |
### 4.7 数据格式示例
```json
{
"start": 0.0,
"end": 25.4,
"text": "欢迎来到 Lec2Note 课程。今天我们介绍多模态笔记生成。首先,我们会讲解系统的核心流程...",
"representative_frames": [
"frames/kf_3.20s.png",
"frames/kf_15.80s.png",
"frames/kf_22.10s.png"
]
}
```
### 4.8 健壮性:错误处理与重试
- **任务原子性**:每步定义为独立任务。
- **自动重试**:针对网络/LLM 失败采用指数退避重试。
- **失败隔离**:单任务失败不会阻断整体流程,可记录后续排查。
---
## 5. 开发环境搭建
```bash
# 克隆仓库
git clone git@github.com:your_org/lec2note.git
cd lec2note
# (可选) 创建虚拟环境
python -m venv .venv && source .venv/bin/activate
# 安装依赖
pip install -r requirements.txt
# 设置环境变量
export OPENAI_API_KEY="YOUR_KEY"
# 运行单元测试
pytest -q
```
### 5.1 快速运行本地 Pipeline
```bash
python -m lec2note.scripts.run_pipeline \
--video example.mp4 \
--output notes.md
```
---
## 6. 部署指南
### 6.1 Docker Compose
```bash
docker compose up -d --build
```