题目范围:
在线公开视频链接或本地视频文件
题目要求:
熟悉主流编程开发语言和基本模型原理,有业务开发经验或大模型使用经验,有过MCP、Agent等开发经验者优先。
MCP: Model Context Protocol(OpenAI 最近推出的一种让模型调用外部工具的接口标准)。一种让 AI(比如 ChatGPT)自动调用你写的 Python 代码、API、数据库的方法。
难度设置:
低难度(5天):
- 上传视频文件或解析视频链接,通过ffmpeg二进制工具实现音视频分流,音频送ASR转文字和时间范围。
- 转录文字稿送摘要生成摘要稿,并进行分段处理, 要求模型返回JSON格式解析对应时间范围指向原视频时间范围。
中难度(10天):
- 视频时间范围内抽帧为多张图片,图片送embedding转向量,内存中根据向量相似度算法对比图片中的向量相似度,去除相似度高的重复图片。
- 后续考虑对图片裁剪等功能。
高难度(15天):
- 对每段摘要文字并发处理上述中难度步骤,汇总后生成图文混排报告,并将结果生成本地PDF报告或写入腾讯文档在线文档内。
词 |
大白话解释 |
举个例子 |
ffmpeg |
一个处理音视频的“瑞士军刀”命令行工具,可以分离音频、剪视频、抽帧等。 |
用 ffmpeg 把 video.mp4 的音频提取成 audio.wav |
ASR(Automatic Speech Recognition) |
自动语音识别,把说话声转换成文字(还能给出时间戳)。 |
给一段讲课视频,识别成文字稿 |
摘要(summarization) |
从长文字里提炼重点。 |
把 1 分钟的转录内容总结成 2 句话 |
Embedding(向量化) |
把文本或图片转成一组数字向量,便于计算相似度。 |
用 CLIP 模型把两张相似的菜品图片转成向量,比较它们相似度 |
相似度去重 |
找出重复或很像的图片,只保留一张。 |
抽帧得到很多几乎一样的图,删掉重复的 |
并发处理 |
同时做多个任务,提高速度。 |
一边识别文字,一边抽帧,而不是等一个做完再做另一个 |
当前任务
- 上传视频文件或解析视频链接,通过ffmpeg二进制工具实现音视频分流,音频送ASR转文字和时间范围。
- 转录文字稿送摘要生成摘要稿,并进行分段处理, 要求模型返回JSON格式解析对应时间范围指向原视频时间范围。
音视频分流
GPT指导
太好了,这个题目非常适合做成一个端到端的小型多模态流水线项目。下面给你一份“可直接落地”的路线图:分阶段目标(低/中/高难度对应 5/10/15 天),每一步要做什么、产出什么,以及推荐技术栈与数据格式约定。你直接照着清单干就能完成。
总体架构(建议用 Python,最快交付)
- 流程:输入(视频/链接)→ 媒体解复用 → ASR 转录(带时间戳)→ 结构化分段 → 摘要(带时间范围)→ 抽帧与图像去重 →(可选裁剪)→ 片段级图文拼装 → 导出 PDF / 写入腾讯文档
- 核心三类能力:音视频工程(ffmpeg/pyav)、文本(ASR/摘要/结构化)、图像(抽帧/向量化/去重/裁剪)
- 推荐技术栈(你会 Go/C++ 也行,Python最快)
- 媒体:
ffmpeg
CLI + ffprobe
- ASR:
whisper
或 faster-whisper
(CPU/GPU 均可)
- 文本摘要/分段:任意大模型(本地/云端),或
transformers
的 summarization
- 抽帧:
ffmpeg -ss/-to -r
或 opencv-python
- 图像向量:
OpenAI CLIP
/ Sentence-Transformers (clip-ViT)
/ open_clip
- 向量相似度:
numpy
/faiss-cpu
(内存版即可)
- PDF:
reportlab
/ weasyprint
(HTML→PDF)
- 并发:
asyncio
/concurrent.futures
- 腾讯文档:官方 API(HTTP 调用)
数据结构约定(先定下来,后续模块都围绕它开发)
- 项目元数据
project.json
1 2 3 4 5 6 7 8 9 10
| { "id": "uuid", "source": {"type": "file|url", "path": "xxx.mp4", "duration_sec": 1234.5}, "created_at": "2025-08-13T12:34:56Z", "settings": { "frame_fps": 1.0, "image_embed_model": "clip-ViT-B/32", "asr_model": "faster-whisper-medium" } }
|
- ASR 转录
transcript.jsonl
(一行一条,便于流式写入)
1
| {"start": 12.34, "end": 16.78, "text": "欢迎大家..."}
|
- 分段与摘要
segments.json
1 2 3 4 5 6 7 8 9 10 11 12 13
| { "segments": [ { "id": 0, "start": 10.0, "end": 85.2, "title": "引言:问题背景", "summary": "本段介绍了…", "bullets": ["要点1", "要点2"], "source_refs": [{"start":12.34,"end":16.78},{"start":20.1,"end":30.0}] } ] }
|
- 抽帧与去重结果
frames.json
1 2 3 4 5 6 7
| { "frames": [ {"ts": 12.0, "path": "frames/000123.jpg", "vec": "npz/000123.npy"}, {"ts": 13.0, "path": "frames/000124.jpg", "dup_of": 12.0} ], "kept": ["frames/000123.jpg","frames/000140.jpg","frames/000200.jpg"] }
|
- 最终图文块(用于导出)
doc_blocks.json
1 2 3 4 5 6 7 8 9 10 11
| { "blocks": [ { "segment_id": 0, "time_range": [10.0, 85.2], "title": "引言:问题背景", "text": "本段摘要…", "images": ["frames/000123.jpg","frames/000140.jpg"] } ] }
|
低难度(5 天)——打通音频→文本→摘要的主干
第 1 天:工程骨架 & 输入
- 做什么:项目脚手架(
src/
、data/
、outputs/
)、命令行入口。
- 功能:
ingest
: 接受本地文件或 URL(yt-dlp 下载),生成 project.json
。
- 校验 ffmpeg/ffprobe 可用。
- 产出:
cli.py
基本命令:ingest <path_or_url> -o workdir/
第 2 天:音视频分流
- 做什么:使用
ffmpeg
解复用出 audio.wav
(单声道 16k)。
- 命令示例:
ffmpeg -i input.mp4 -vn -ac 1 -ar 16000 outputs/audio.wav
- 产出:
media.json
(采样率、时长)
第 3–4 天:ASR(含时间戳)
- 做什么:
faster-whisper
推理,输出 transcript.jsonl
(带 start/end)。
- 要点:
- 可选 VAD(
pyannote.audio
/silero-vad
)先切段提速。
- 长音频分块(重叠 1–2s 防断句)。
- 产出:
transcript.jsonl
与简单统计(词数、时长覆盖率)。
第 5 天:摘要与分段(时间对齐)
- 做什么:
- 根据暂停点/时间窗(如每 60–120s 或基于 ASR 段落停顿)先粗分段。
- 将每段文本送摘要模型,输出段级
summary/bullets/title
。
- 要求:模型返回 JSON,并保留每段的
start/end
映射。
- 产出:
segments.json
(上面的结构)。
中难度(第 6–10 天)——抽帧、去重、图像候选
第 6 天:抽帧
- 做什么:对每个段的时间范围内按
fps
抽帧(默认 0.5–1 fps)。
- 两种实现:
ffmpeg -ss {start} -to {end} -r {fps} frame_%06d.jpg
- 或
opencv
逐帧精准控制
- 产出:每段
frames/segment_{id}/...
第 7 天:图像向量化
- 做什么:CLIP 模型对图片生成向量,保存为
.npy
;索引存内存。
- 要点:批量化、GPU 优先;向量归一化以便余弦相似度。
第 8 天:相似度去重
- 做什么:同一段内做近邻/聚类(阈值如 cosine > 0.9 判重复)。
- 实现:
- 简单版:两两比较 + 并查集/贪心保留代表帧。
- 快速版:Faiss
IndexFlatIP
,阈值筛选。
- 产出:
frames.json
(标记 dup_of
与 kept
列表)。
第 9 天:(可选)图片裁剪
- 做什么:基于人脸/主体/字幕区域做自动裁剪建议:
- 人脸:
opencv
/mediapipe
检测后裁到 4:3/1:1
- 主体:
torchvision
的 saliency
/简单阈值 + 最大连通域
- 字幕:底部字幕区域检测,留白比控制
- 产出:保存裁剪版本到
frames_cropped/
,在 frames.json
里关联。
第 10 天:段级图文拼装(中期演示)
- 做什么:为每段挑 1–3 张代表图;生成
doc_blocks.json
。
- 验收:用简易 HTML 模板渲染一页(段标题+摘要+图片)。
高难度(第 11–15 天)——并发、汇总导出、在线文档
第 11 天:并发与健壮性
- 做什么:将“每段摘要”与“抽帧→向量→去重”并发执行:
asyncio.gather
或 ThreadPoolExecutor
(IO 密集足够)
- 失败重试、进度条、可中断恢复(基于落盘的中间文件)
- 产出:稳定的流水线
pipeline.run(workdir, stages=[...])
第 12 天:全局汇总排版
- 做什么:把
doc_blocks.json
合并为一本文档结构(章节=段)。
- 样式:封面(视频标题、时长、作者)、目录、段落页(时间戳可点击/带链接到原视频时间)。
第 13 天:导出 PDF
- 做什么:
- 方案 A:HTML 模板 +
weasyprint
导出 PDF(版式更美观)
- 方案 B:
reportlab
逐页绘制(更可控)
- 验证:字体嵌入、图片压缩、页码/页眉/页脚、超链接(
#t=123s
)。
第 14 天:写入腾讯文档
- 做什么:调用腾讯文档 API:
- 新建文档 → 逐段插入标题、摘要、图片(上传素材)→ 生成分享链接
- 产出:保存
tencent_doc.json
(文档 ID、链接、版本号)
第 15 天:打磨与评测
- 做什么:CLI 子命令与配置、日志/错误上报、示例数据和 README。
- 指标:
- ASR WER、摘要覆盖率(ROUGE 可选)、图片冗余率下降%、处理耗时
模块划分与接口(按包开发)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| src/ cli.py # 命令行入口 config.py # 全局配置与默认参数 media/ ingest.py # 下载/本地校验 demux.py # 音视频分离、元信息 asr/ transcribe.py # ASR + VAD + 分块 nlp/ segmenter.py # 基于时间/停顿的分段 summarize.py # 段级摘要 -> JSON vision/ frames.py # 抽帧 embed.py # 图像向量 dedup.py # 相似度去重/聚类 crop.py # 可选自动裁剪 compose/ assemble.py # 生成 doc_blocks.json html_render.py # 渲染 HTML export_pdf.py # 导出 PDF tencent_docs.py # 写入腾讯文档 runtime/ pipeline.py # 串/并行编排、断点续跑 utils.py # 日志、时间格式、路径
|
CLI 预期用法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| # 1) 导入与分流 python -m src.cli ingest --input demo.mp4 --workdir runs/demo python -m src.cli demux --workdir runs/demo
# 2) 转录与摘要 python -m src.cli asr --workdir runs/demo python -m src.cli segment --workdir runs/demo python -m src.cli summarize --workdir runs/demo
# 3) 抽帧、去重、裁剪 python -m src.cli frames --workdir runs/demo --fps 0.5 python -m src.cli embed --workdir runs/demo python -m src.cli dedup --workdir runs/demo --thr 0.9 python -m src.cli crop --workdir runs/demo
# 4) 组装与导出 python -m src.cli compose --workdir runs/demo python -m src.cli export-pdf --workdir runs/demo --theme clean python -m src.cli tdoc --workdir runs/demo
|
关键实现要点(易踩坑与建议)
- 时间戳一致性:ASR、分段、抽帧用同一时间基准(以 ffprobe 的
start_time
为准)。
- 长视频内存:向量不要全常驻内存,段内处理、段内释放,或落盘
.npy
。
- 去重阈值:0.85–0.92 之间调;不同内容/分辨率下要有自适应(比如同一秒内优先保留清晰度更高的帧)。
- 并发控制:限制并发数(如 4–8);GPU 显存压力来自 ASR/CLIP。
- 可恢复性:每步写入中间文件;
pipeline
根据存在的产物跳过已完成步骤。
- 隐私与合规:网络视频需注明来源与仅作学习使用;PDF 内嵌版权页。
里程碑验收清单
- 低难度完成标志:
- 有
transcript.jsonl
(覆盖>95%时长)
- 有
segments.json
(每段摘要、时间范围、JSON 结构正确)
- 中难度完成标志:
- 段内抽帧与
frames.json
(含 dup_of/kept
)
- 可视化对比:原帧数 vs 保留帧数(冗余下降>70%)
- 高难度完成标志:
doc_blocks.json
→ 成功导出 PDF(封面/目录/段落、图片插入、时间链接)
- 成功写入 腾讯文档 并返回文档链接
你现在可以立刻做的第一步
- 建项目目录 +
requirements.txt
(ffmpeg/faster-whisper/torch/opencv/open-clip-torch/reportlab 或 weasyprint/faiss-cpu)。
- 写
ingest
与 demux
两个最小命令;能把音频抽出来即算开工成功。
- 跑一小段视频(1–2 分钟)走通 ASR→摘要→分段,生成一份最小
segments.json
作为金样本。
如果你愿意,我下一步可以直接给你:
requirements.txt
与可运行的 cli.py
雏形;
- ASR→摘要→分段的示例实现(含一个最小可用的摘要 Prompt/模板);
- 抽帧与去重的简明代码骨架。