Schwertlilien
As a recoder: notes and ideas.

2025-8-13

题目范围:

在线公开视频链接或本地视频文件

题目要求:

熟悉主流编程开发语言和基本模型原理,有业务开发经验或大模型使用经验,有过MCP、Agent等开发经验者优先。

MCP: Model Context Protocol(OpenAI 最近推出的一种让模型调用外部工具的接口标准)。一种让 AI(比如 ChatGPT)自动调用你写的 Python 代码、API、数据库的方法。

难度设置:

低难度(5天):

  • 上传视频文件或解析视频链接,通过ffmpeg二进制工具实现音视频分流,音频送ASR转文字和时间范围。
  • 转录文字稿送摘要生成摘要稿,并进行分段处理, 要求模型返回JSON格式解析对应时间范围指向原视频时间范围。

中难度(10天):

  • 视频时间范围内抽帧为多张图片,图片送embedding转向量,内存中根据向量相似度算法对比图片中的向量相似度,去除相似度高的重复图片。
  • 后续考虑对图片裁剪等功能。

    高难度(15天):

  • 对每段摘要文字并发处理上述中难度步骤,汇总后生成图文混排报告,并将结果生成本地PDF报告或写入腾讯文档在线文档内。
大白话解释 举个例子
ffmpeg 一个处理音视频的“瑞士军刀”命令行工具,可以分离音频、剪视频、抽帧等。 ffmpegvideo.mp4 的音频提取成 audio.wav
ASR(Automatic Speech Recognition) 自动语音识别,把说话声转换成文字(还能给出时间戳)。 给一段讲课视频,识别成文字稿
摘要(summarization) 从长文字里提炼重点。 把 1 分钟的转录内容总结成 2 句话
Embedding(向量化) 把文本或图片转成一组数字向量,便于计算相似度。 用 CLIP 模型把两张相似的菜品图片转成向量,比较它们相似度
相似度去重 找出重复或很像的图片,只保留一张。 抽帧得到很多几乎一样的图,删掉重复的
并发处理 同时做多个任务,提高速度。 一边识别文字,一边抽帧,而不是等一个做完再做另一个

当前任务

  1. 上传视频文件或解析视频链接,通过ffmpeg二进制工具实现音视频分流,音频送ASR转文字和时间范围。
  2. 转录文字稿送摘要生成摘要稿,并进行分段处理, 要求模型返回JSON格式解析对应时间范围指向原视频时间范围。

音视频分流

GPT指导

太好了,这个题目非常适合做成一个端到端的小型多模态流水线项目。下面给你一份“可直接落地”的路线图:分阶段目标(低/中/高难度对应 5/10/15 天),每一步要做什么、产出什么,以及推荐技术栈与数据格式约定。你直接照着清单干就能完成。


总体架构(建议用 Python,最快交付)

  • 流程:输入(视频/链接)→ 媒体解复用 → ASR 转录(带时间戳)→ 结构化分段 → 摘要(带时间范围)→ 抽帧与图像去重 →(可选裁剪)→ 片段级图文拼装 → 导出 PDF / 写入腾讯文档
  • 核心三类能力:音视频工程(ffmpeg/pyav)、文本(ASR/摘要/结构化)、图像(抽帧/向量化/去重/裁剪)
  • 推荐技术栈(你会 Go/C++ 也行,Python最快)
    • 媒体:ffmpeg CLI + ffprobe
    • ASR:whisperfaster-whisper(CPU/GPU 均可)
    • 文本摘要/分段:任意大模型(本地/云端),或 transformers 的 summarization
    • 抽帧:ffmpeg -ss/-to -ropencv-python
    • 图像向量:OpenAI CLIP / Sentence-Transformers (clip-ViT) / open_clip
    • 向量相似度:numpy/faiss-cpu(内存版即可)
    • PDF:reportlab / weasyprint(HTML→PDF)
    • 并发:asyncio/concurrent.futures
    • 腾讯文档:官方 API(HTTP 调用)

数据结构约定(先定下来,后续模块都围绕它开发)

  1. 项目元数据 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"
}
}
  1. ASR 转录 transcript.jsonl(一行一条,便于流式写入)
1
{"start": 12.34, "end": 16.78, "text": "欢迎大家..."}
  1. 分段与摘要 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}]
}
]
}
  1. 抽帧与去重结果 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"]
}
  1. 最终图文块(用于导出) 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_ofkept 列表)。

第 9 天:(可选)图片裁剪

  • 做什么:基于人脸/主体/字幕区域做自动裁剪建议:
    • 人脸:opencv/mediapipe 检测后裁到 4:3/1:1
    • 主体:torchvisionsaliency/简单阈值 + 最大连通域
    • 字幕:底部字幕区域检测,留白比控制
  • 产出:保存裁剪版本到 frames_cropped/,在 frames.json 里关联。

第 10 天:段级图文拼装(中期演示)

  • 做什么:为每段挑 1–3 张代表图;生成 doc_blocks.json
  • 验收:用简易 HTML 模板渲染一页(段标题+摘要+图片)。

高难度(第 11–15 天)——并发、汇总导出、在线文档

第 11 天:并发与健壮性

  • 做什么:将“每段摘要”与“抽帧→向量→去重”并发执行:
    • asyncio.gatherThreadPoolExecutor(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(封面/目录/段落、图片插入、时间链接)
    • 成功写入 腾讯文档 并返回文档链接

你现在可以立刻做的第一步

  1. 建项目目录 + requirements.txt(ffmpeg/faster-whisper/torch/opencv/open-clip-torch/reportlab 或 weasyprint/faiss-cpu)。
  2. ingestdemux 两个最小命令;能把音频抽出来即算开工成功。
  3. 跑一小段视频(1–2 分钟)走通 ASR→摘要→分段,生成一份最小 segments.json 作为金样本。

如果你愿意,我下一步可以直接给你:

  • requirements.txt可运行cli.py 雏形;
  • ASR→摘要→分段的示例实现(含一个最小可用的摘要 Prompt/模板);
  • 抽帧与去重的简明代码骨架。
搜索
匹配结果数:
未搜索到匹配的文章。