A newer version of the Streamlit SDK is available:
1.53.1
Lec2Note 开发者指南 (Developer Guide)
1. 项目概述
Lec2Note 致力于提供一个端到端的 “视频讲座自动生成笔记” 解决方案。
通过多模态分析技术,深度融合视频画面与音频内容,生成 图文并茂、结构清晰 的笔记。
1.1 核心流程
- 基于字幕的精细分块:将 ASR 生成的每一句话视为独立的 micro-chunk,并在句末时间点精确截取关键帧。
- 分层合并策略
- 阶段一·视觉预合并:仅根据视觉相似度合并连续 micro-chunks。
- 阶段二·语义合并:在视觉合并结果上再根据文本语义相似度合并。
- 多模态信息提取与采样
- 文本:拼接主题块包含的全部字幕文本。
- 图像:采样该主题块的关键帧(最多 6 张)。
- 分块笔记生成:调用多模态 LLM,为每个主题块生成独立笔记。
- 全局笔记合成:再次调用 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. 目录结构与模块划分
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 分块与合并策略
- 生成句块:
sentence_chunker.run()根据 ASR 输出生成{start, end, text, keyframe_path}的 sentence_chunks。 - 分层合并:
chunk_merger.run()先视觉预合并,再语义合并,得到 topic_chunks。 - 关键帧采样:
image_sampler.sample()均匀采样关键帧,最多保留 6 张。 - 输出:最终得到包含文本及代表性截图的
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 数据格式示例
{
"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. 开发环境搭建
# 克隆仓库
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
python -m lec2note.scripts.run_pipeline \
--video example.mp4 \
--output notes.md
6. 部署指南
6.1 Docker Compose
docker compose up -d --build