File size: 6,485 Bytes
dd9b31b
429e139
 
dd9b31b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
429e139
dd9b31b
 
 
 
429e139
 
 
dd9b31b
 
 
 
 
 
 
 
 
 
 
 
 
 
429e139
 
 
 
dd9b31b
 
 
 
 
 
 
429e139
dd9b31b
 
 
 
 
 
 
 
 
429e139
 
 
 
 
dd9b31b
429e139
dd9b31b
429e139
dd9b31b
 
 
 
 
429e139
 
dd9b31b
429e139
 
dd9b31b
 
429e139
 
dd9b31b
429e139
dd9b31b
429e139
dd9b31b
 
 
 
 
429e139
dd9b31b
429e139
dd9b31b
 
 
 
 
 
 
 
 
 
429e139
 
dd9b31b
429e139
 
dd9b31b
 
 
 
 
 
 
429e139
 
 
dd9b31b
 
 
 
429e139
dd9b31b
429e139
dd9b31b
429e139
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dd9b31b
429e139
 
 
 
 
 
dd9b31b
 
429e139
 
 
 
 
dd9b31b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# 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
```