首页 / 资讯中心 / 文章详情

Day 08 · AI 视频摘要:10 分钟视频 30 秒看完

Day 08 · AI 视频摘要:10 分钟视频 30 秒看完 ★ FEATURED ARTICLE
作者梅雅达编程笔记收藏了一个 1 小时的 Python 教学视频想着周末好好看。结果周末到了打开视频看了 5 分钟觉得太慢拖了一下进度条又觉得跳太多了怕漏掉关键内容……反反复复折腾了 20 分钟啥也没学到。最后安慰自己收藏了就是学了然后继续刷短视频。这个视频其实就讲了 3 个知识点。如果有个 30 秒就能看完的图文摘要就好了。今天这篇就写这么一套工具给它一个视频文件它自动帮你截取画面变化的关键帧、把语音全部转成文字、让 AI看关键帧理解画面里展示了什么最后综合文字和画面生成一份带时间戳的图文笔记。全程自动你只需要一行命令。视频为什么这么难啃文字有摘要图片有缩略图但视频没有。传统方案无非两种方案 A人工看完全片手写笔记。1 小时视频至少花 1.5 小时还得暂停记笔记。慢、累、不可持续。方案 B自动截取等间隔截图 字幕。很多播放器有这个功能——每隔 N 秒截一张图。但你仔细看就知道大多数截图是废话画面讲师在喝水、PPT 停在同一页、画面没有变化。问题的核心是视频的信息密度不均匀。一个 1 小时的教学视频真正有新信息的内容可能只占 20%——剩下的全是过渡、重复、闲聊。你需要的不是均匀截图而是智能抓重点。AI 视频摘要的思路就是四件事关键帧提取不是等间隔截而是在画面发生变化的时候才截——切 PPT 了、换场景了、出现新代码了这些才是重点时刻语音转文字把讲师说的每句话都记下来Day05 学的 Whisper今天直接复用视觉模型看关键帧光有文字不够视频里很多信息是写在画面上的——代码截图、图表、公式、板书。视觉模型能看懂这些LLM 综合整理把文字 画面信息合在一起生成结构化的摘要笔记原理三步拼出一个视频摘要整个流程画成一张图视频文件 │ ├──→ FFmpeg 提取音轨 ──→ Whisper 语音转文字 ──→ 带时间戳的全文 │ ├──→ FFmpeg 场景检测 ──→ 关键帧图片序列 │ │ │ GLM-4V-Flash 视觉分析 │ │ │ 每帧的文字描述 │ └──────────────┬──────────────────┘ │ glm-4.5-air 综合总结 │ 结构化图文摘要FFmpeg 场景检测Scene DetectionFFmpeg 内置了一个select滤镜配合scene检测器可以自动识别画面什么时候发生了显著变化。原理很简单计算相邻两帧的像素差异直方图差值差异超过阈值就认为场景切换了把这一帧截下来。ffmpeg-ivideo.mp4-vfselectgt(scene,0.3)-fps_modevfr frame_%04d.jpg这一行命令就能把视频里所有画面变化的瞬间截取出来。阈值 0.3 是个经验值——越小越敏感截的帧越多越大越迟钝只截大变化。Whisper 语音转文字Day05 详细讲过这里直接复用。核心就一句话fromfaster_whisperimportWhisperModel modelWhisperModel(small,devicecpu,compute_typeint8)segments,infomodel.transcribe(audio.wav,languagezh)GLM-4V-Flash 视觉分析 glm-4.5-air 总结关键帧截下来之后用 GLM-4V-Flash永久免费的视觉模型逐张分析画面里有什么然后把画面描述 语音转文字的结果一起交给 glm-4.5-air让它生成结构化摘要。为什么需要视觉模型因为视频里很多东西是写在画面上的——PPT 标题、代码片段、图表数据。纯靠语音转文字这些信息会丢失。动手实战完整 Pipeline环境准备# Python 依赖pipinstallfaster-whisper requests# FFmpeg系统级工具# Windows: 去 https://ffmpeg.org/download.html 下载加入 PATH# macOS:brewinstallffmpeg# Ubuntu:sudoaptinstallffmpeg验证安装ffmpeg-version# 能看到版本号就行ffprobe-version# ffprobe 用来获取视频信息第一步提取音轨视频文件里的音频不是独立文件而是和视频流封装在一起的。我们先用 FFmpeg 把音频抽出来importsubprocessdefextract_audio(video_path,output_dir):audio_pathf{output_dir}/audio_track.wavcmd[ffmpeg,-y,-i,video_path,-vn,# 不要视频只要音频-acodec,pcm_s16le,# 16bit PCM 编码-ar,16000,# 16kHz 采样率Whisper 推荐-ac,1,# 单声道audio_path]subprocess.run(cmd,capture_outputTrue,textTrue,checkTrue)returnaudio_path16kHz 单声道 WAV 是 Whisper 的标准输入格式这个采样率对人声足够用了。第二步关键帧提取这是整个 Pipeline 最有意思的一步。defextract_keyframes(video_path,output_dir,threshold0.3,max_frames30):frames_dirf{output_dir}/keyframesos.makedirs(frames_dir,exist_okTrue)cmd[ffmpeg,-y,-i,video_path,-vf,fselectgt(scene\\,{threshold}),scale1280:-1,-fps_mode,vfr,# 可变帧率只输出选中的帧ffmpeg 9 已移除 -vsync vfr-pix_fmt,yuvj420p,# 关键帧 JPEG 输出避免 mjpeg 编码器 limited-range YUV 报错-q:v,2,# JPEG 高质量-frames:v,str(max_frames),# 最多截 max_frames 帧f{frames_dir}/frame_%04d.jpg]subprocess.run(cmd,capture_outputTrue,textTrue,checkTrue)# 收集截到的帧frame_filessorted([f{frames_dir}/{f}forfinos.listdir(frames_dir)iff.endswith(.jpg)])returnframe_files几个参数解释selectgt(scene,0.3)场景差异 0.3 才截取。0.3 是个不错的起点scale1280:-1截出来的帧缩放到宽度 1280px高度自动。这样发给视觉模型不会太大-fps_mode vfr只输出被选中的帧不输出空白帧ffmpeg 9 起-vsync vfr已移除用这个替代-frames:v 30最多 30 帧防止长视频截几百张图如果场景检测没截到帧怎么办比如视频全程画面几乎没变纯音频播客配一张静态图这时候需要退化为等间隔截取defextract_frames_interval(video_path,frames_dir,max_frames30):退化方案等间隔截取# 用 ffprobe 获取视频时长resultsubprocess.run([ffprobe,-v,error,-show_entries,formatduration,-of,defaultnoprint_wrappers1:nokey1,video_path],capture_outputTrue,textTrue)durationfloat(result.stdout.strip())intervalduration/(max_frames1)frame_files[]foriinrange(max_frames):timestampinterval*(i1)outputf{frames_dir}/frame_{i1:04d}.jpgsubprocess.run([ffmpeg,-y,-ss,str(timestamp),-i,video_path,-vframes,1,-q:v,2,-vf,scale1280:-1,-pix_fmt,yuvj420p,# 兼容 mjpeg 编码器output],capture_outputTrue)ifos.path.exists(output):frame_files.append(output)returnframe_files第三步语音转文字直接复用 Day05 的代码fromfaster_whisperimportWhisperModeldeftranscribe_audio(audio_path):modelWhisperModel(small,devicecpu,compute_typeint8)segments,infomodel.transcribe(audio_path,languagezh,vad_filterTrue,# 自动跳过静音段)full_texttranscript_segments[]forseginsegments:textseg.text.strip()iftext:transcript_segments.append({start:round(seg.start,1),end:round(seg.end,1),text:text,})full_texttextreturn{full_text:full_text,segments:transcript_segments}第四步视觉模型分析关键帧把每张关键帧发给 GLM-4V-Flash让它描述画面内容importbase64importrequestsdefanalyze_keyframes(frame_files,frame_timestamps):逐帧调用 GLM-4V-Flash返回 [{time_str, description}, ...]descriptions[]forframe_path,timestampinzip(frame_files,frame_timestamps):withopen(frame_path,rb)asf:img_b64base64.b64encode(f.read()).decode()mm,ssint(timestamp//60),int(timestamp%60)time_strf{mm:02d}:{ss:02d}resprequests.post(https://open.bigmodel.cn/api/paas/v4/chat/completions,headers{Authorization:fBearer{os.environ[GLM_API_KEY]}},json{model:glm-4v-flash,messages:[{role:user,content:[{type:image_url,image_url:{url:fdata:image/jpeg;base64,{img_b64}}},{type:text,text:f这是视频在{time_str}时刻的画面用一句话描述画面内容。}]}],max_tokens:100},timeout30,)descresp.json()[choices][0][message][content].strip()descriptions.append({time_str:time_str,description:desc})returndescriptionsGLM-4V-Flash 是永久免费的视觉模型支持图片理解。这里我们只让它一句话描述控制 token 消耗。第五步LLM 生成结构化摘要最后把语音转文字 关键帧描述一起交给 glm-4.5-air让它生成结构化摘要defgenerate_summary(transcript,frame_descriptions):语音转文字 关键帧描述 → glm-4.5-air 生成结构化摘要frame_text\n.join(f[{fd[time_str]}]{fd[description]}forfdinframe_descriptions)promptf根据以下视频的语音转文字内容和关键帧画面描述生成结构化图文摘要笔记。 ## 语音转文字内容 ---{transcript[full_text][:8000]}--- ## 关键帧画面描述 ---{frame_text}--- 请输出 JSON 格式{{title: 标题(15字内), one_line_summary: 一句话总结, timeline: [{{time: 00:00, topic: 主题, detail: 要点}}], key_points: [要点1,要点2], conclusion: 核心结论, tags: [标签1]}}resprequests.post(https://open.bigmodel.cn/api/paas/v4/chat/completions,headers{Authorization:fBearer{os.environ[GLM_API_KEY]}},json{model:glm-4.5-air,messages:[{role:user,content:prompt}],temperature:0.3,max_tokens:2000},timeout60,)contentresp.json()[choices][0][message][content]ifjsonincontent:contentcontent.split(json)[1].split()[0]returnjson.loads(content.strip())把 Pipeline 串起来把所有步骤串成一行命令可调用的 Pipelinedefvideo_summary_pipeline(video_path,output_dirNone):一行命令跑完视频 → 图文摘要video_pathos.path.abspath(video_path)ifoutput_dirisNone:video_namePath(video_path).stem output_dirf{os.path.dirname(video_path)}/{video_name}_summaryos.makedirs(output_dir,exist_okTrue)# Step 1: 提取音轨audio_pathextract_audio(video_path,output_dir)# Step 2: 关键帧提取frame_filesextract_keyframes(video_path,output_dir)ifnotframe_files:frame_filesextract_frames_interval(video_path,f{output_dir}/keyframes)# Step 3: 语音转文字transcripttranscribe_audio(audio_path)# Step 4: 视觉模型分析关键帧frame_descriptionsanalyze_keyframes(frame_files,frame_timestamps)# Step 5: LLM 生成摘要summarygenerate_summary(transcript,frame_descriptions)# Step 6: 导出 Markdownexport_markdown(summary,transcript,frame_descriptions,frame_files,output_dir)returnsummary运行python day08_video_summary.py lecture.mp4输出目录结构lecture_summary/ ├── video_summary.md ← 图文笔记直接能看 ├── summary_result.json ← 结构化数据程序能用 ├── audio_track.wav ← 提取的音轨 └── keyframes/ ← 关键帧图片 ├── frame_0001.jpg ├── frame_0002.jpg └── ...完整的可运行代码见配套文件day08_video_summary.py。实测运行结果用一段 15 秒的测试视频sample_lecture.mp4testsrc 画面 正弦音轨跑完整条流水线控制台输出如下这次是真实调用智谱 API音轨提取 ✓ → 场景检测未检出硬切测试视频画面连续变化自动退化为等间隔截取 30 帧 ✓ → Whisper 转录运行正常该测试音轨是正弦波、无人声所以转录 0 字换成真人语音视频就能出完整字幕→ glm-4v-flash 逐帧分析 30 个关键帧 ✓ → glm-4.5-air 生成结构化摘要 ✓ → 导出video_summary.md。总耗时 75 秒。环境提示FFmpeg 需要 5.1 以上版本。ffmpeg 9 起-vsync vfr已移除代码里已改用-fps_mode vfr关键帧 JPEG 输出加-pix_fmt yuvj420p避免 mjpeg 编码器对 limited-range YUV 报错。文本模型用.env里的GLM_REPORTER_MODELglm-4.5-air视觉模型用免费的 glm-4v-flash。这套流水线花多少钱项目方案成本关键帧提取FFmpeg 场景检测开源¥0语音转文字faster-whisper 本地运行¥0关键帧视觉分析GLM-4V-Flash永久免费¥0结构化摘要生成glm-4.5-air永久免费¥0图片去重可选Pillow imagehash开源¥0本篇总计¥0整条 Pipeline 跑一个 1 小时视频的成本是零。API 消耗估算约 30 次视觉模型调用每次约 100 token 1 次文本模型调用约 2000-3000 token全在免费额度内。时间成本1 小时视频CPU 环境下大约需要 3-5 分钟主要耗时在 Whisper 转录有 GPU 的话 1-2 分钟。从能用到好用关键帧智能去重场景检测有时候会截到非常相似的两帧比如 PPT 上只改了一个字。加一步视觉去重defdeduplicate_frames(frame_files,similarity_threshold0.9):用图片哈希去重删除相似的关键帧fromPILimportImageimportimagehash unique_frames[]last_hashNoneforfpinframe_files:imgImage.open(fp)himagehash.phash(img)iflast_hashisNoneorh-last_hash5:# 汉明距离 5 算不同unique_frames.append(fp)last_hashhreturnunique_frames长视频分段处理1 小时以上的视频Whisper 处理会比较慢。可以先切分再并行处理defsplit_audio(audio_path,output_dir,chunk_seconds600):把长音频切成 10 分钟一段os.makedirs(output_dir,exist_okTrue)cmd[ffmpeg,-y,-i,audio_path,-f,segment,-segment_time,str(chunk_seconds),-c,copy,f{output_dir}/chunk_%03d.wav]subprocess.run(cmd,capture_outputTrue)chunkssorted([f{output_dir}/{f}forfinos.listdir(output_dir)iff.endswith(.wav)])returnchunks批量处理视频文件夹工作室场景甲方发来 20 个教学视频要全部生成摘要。defbatch_video_summary(video_dir,output_base_dir):批量处理文件夹中的所有视频video_exts{.mp4,.avi,.mkv,.mov,.flv,.wmv}videos[fforfinos.listdir(video_dir)ifos.path.splitext(f)[1].lower()invideo_exts]print(f找到{len(videos)}个视频文件)fori,videoinenumerate(videos,1):print(f\n{*60})print(f[{i}/{len(videos)}]{video})print(f{*60})video_pathos.path.join(video_dir,video)output_diros.path.join(output_base_dir,os.path.splitext(video)[0])try:video_summary_pipeline(video_path,output_dir)exceptExceptionase:print(f❌ 处理失败{e})顺带看看2026 的 AI 视频生成这篇做的是视频→摘要理解视频反过来文字/图片→视频生成视频在 2026 年也在爆发式增长简单聊几个Runway Gen-3 / Gen-4.5目前专业级 AI 视频生成的标杆。Gen-3 Alpha 的核心优势是导演级控制——Motion Brush 2.0 可以精确控制画面中每个区域的运动方向和速度Act One 能做面部表情捕捉和迁移摄像机控制支持推拉摇移等专业术语。2025 年底推出的 Gen-4.5 进一步支持原生 4K 输出。在影视广告领域Runway 已经是很多工作室的标配工具。可灵 AIKling快手旗下的 AI 视频生成平台2026 年用户突破 6000 万年化收入超过 3 亿美元。最新的 Kling VIDEO 3.0 Omni 实现了文本图片音频统一生成——一段视频自带同步对话和环境音效支持 5 种语言的精准口型同步。AI Director 功能可以自动把一段长 prompt 拆分成多机位镜头直接生成完整场景而不是单个片段。$6.99/月起步性价比很高。行业趋势Netflix 2026 年二季度财报披露今年已有约 300 部作品在制作中使用了生成式 AI主要集中在后期制作环节。国内爱奇艺也上线了首部获发行许可证的 AIGC 网络故事片。AI 视频生成正在从好玩的玩具变成真正的生产力工具。不过这两件事方向是互补的——理解视频和生成视频迟早会合流。下一篇Day09就把图文生成和视频摘要的能力结合起来做一套完整的小红书内容生产流水线。想练手可以改这些按难度分三档入门级调整场景检测阈值0.1 / 0.3 / 0.5对比同一个视频截出来的关键帧数量和质量把摘要的 Markdown 输出改成 HTML 格式加上图片预览做得更漂亮进阶级给 Pipeline 加一个精华片段剪辑功能根据摘要中的 key_points 时间戳用 FFmpeg 自动剪出每段要点的前后 10 秒实现多视频对比摘要喂进去同一主题的 3 个视频生成一份综合笔记挑战级把关键帧分析改成多图批量发送GLM-4V-Flash 支持单条消息多张图片减少 API 调用次数搭一个本地 Web 界面上传视频 → 预览关键帧 → 编辑摘要 → 导出 PDF参考链接FFmpeg 场景检测文档FFmpeg 官方文档select 滤镜faster-whisperGitHub 仓库 SYSTRAN/faster-whisper智谱 BigModelGLM-4V-Flash 免费智谱开放平台GLM-4V-Flash 视觉模型文档智谱开放平台Runway Gen-3Runway 官网可灵 AIKling可灵 AI 官网本篇配套代码day08_video_summary.py把这套代码里的视频路径换成你自己的文件跑一遍10 分钟的视频 30 秒就能看完。遇到问题评论区见。
阅读完成 · 觉得有帮助?
咨询建站