summarize 项目 Slides 幻灯片模式完全指南:关键帧提取、模型摘要与侧边栏渲染
summarize 项目 Slides 幻灯片模式完全指南关键帧提取、模型摘要与侧边栏渲染【免费下载链接】summarizePoint at any URL/YouTube/Podcast or file. Get the gist. CLI and Chrome Extension.项目地址: https://gitcode.com/GitHub_Trending/summarize/summarize导读Slides 模式是 summarize 项目一款指向任意 URL/YouTube/播客/文件即可获取要点的 CLI 与 Chrome 扩展中专门面向视频类内容的一种工作模式它把视频关键帧keyframes与带时间戳的文本配对实现边看画面、边读字幕、边看要点的阅读体验。本指南以 docs/slides.md 为主线结合 slides 命令文档、渲染流程文档 与src/slides/目录下的核心实现完整讲解其提取原理、CLI 命令行用法、浏览器侧边栏渲染行为与内部架构。读完本文你将掌握如何用--slides生成带内嵌截图的图文摘要、如何用summarize slides独立提取幻灯片、如何调优场景检测参数以及摘要回退文本、OCR 与 Gemini Nano 本地摘要的工作机制。一、Slides 模式概述关键帧 × 时间戳文本Slides 模式的核心思想是将视频关键帧slide与带时间戳的文字transcript配对从而把看视频变成按章节翻页。需要特别注意的是提取extraction本身不依赖任何模型它完全是基于 FFmpeg 等媒体工具的确定性流程而**摘要summary**才使用模型既可以使用配置的 provider也可以使用端侧on-device的 Gemini Nano。支持的输入源有三类见 src/slides/types.ts 中的SlideSourceKind输入源说明YouTube URL需要yt-dlp下载媒体直接视频 URLdirect如https://example.com/lecture.mp4本地视频文件如./lecture.mp4从源码结构看Slides 模式在 CLI 侧由src/run/flows/url/下的slides-output.ts、slides-output-state.ts、slides-output-render.ts、slides-output-stream.ts四个文件协作完成构造、状态、渲染、流解析四个环节在浏览器侧则由扩展 sidepanel 的 stream-controller 系列负责。下文将分 CLI 与浏览器两条路径展开。二、CLI 使用三种命令形态2.1summarize source --slides图文叙事流在普通摘要命令上追加--slides标志即可让输出变成一段简短的引言段落 一段连续叙事并在叙事中按[slide:N]标记位置插入幻灯片图片summarize https://youtu.be/... --slides关键行为docs/slides.md 定义模型负责按顺序插入所有[slide:N]标记不是提取器决定图片位置而是模型在生成叙事时主动引用每一张幻灯片文字长度仍然由--length参数控制。内嵌图片不受支持时的降级若终端不支持内嵌图片CLI 会输出纯文本并提示如何把幻灯片导出到磁盘。时间戳链接使用 OSC-8 超链接在 YouTube/Vimeo/Loom/Dropbox 等场景下时间戳会渲染为可点击跳转的 OSC-8 超链接。进度行报告提取步骤进度行会展示幻灯片提取过程可用时附带幻灯片数量。2.2summarize source --slides --extract带图时间轴在--slides基础上再加--extract会打印完整的带时间戳字幕并在匹配的时间戳处内嵌幻灯片图片summarize https://youtu.be/... --slides --extract这适合需要逐句对齐画面的审阅场景。2.3summarize slides source仅提取不摘要独立命令形态只提取幻灯片不调用任何模型可用--render auto|kitty|iterm在终端内渲染缩略图summarize slides https://youtu.be/... --render auto三种形态的图片默认都写入./slides/sourceId/目录可用--slides-dir或--output覆盖。三、summarize slides命令详解3.1 基本用法与 Synopsissummarize slides source [flags]该命令使用FFmpeg 场景检测scene detection从 YouTube URL、直接视频 URL 或本地视频文件中提取幻灯片形状的关键帧输出为一个 PNG 目录可选附带 OCR 文本。它是主命令上--slides标志的独立形态——当你只需要幻灯片而不需要摘要时非常有用。完整参数见 docs/commands/slides.md。summarize slides https://youtu.be/... summarize slides https://youtu.be/... --render auto summarize slides https://youtu.be/... --slides-ocr -o ./out summarize slides https://example.com/lecture.mp4 --slides-max 12 summarize slides ./lecture.mp4 --slides-max 123.2 运行前提Requirements依赖用途缺失时的行为原生ffmpeg/ffprobe推荐更快的提取与更广的编解码器支持回退到捆绑的 FFmpeg WebAssembly捆绑 FFmpeg WebAssembly原生不可用时的兜底提取无需额外安装yt-dlp下载 YouTube URL 视频打印明确警告并以非零码退出tesseract--slides-ocr的 OCR 识别同上从源码看工具解析逻辑位于 src/slides/runtime.ts 的resolveRunnableTool优先使用环境变量显式指定的二进制其次在 PATH 中查找最后才回退到捆绑的 WebAssembly 版本。如果必需工具缺失summarize 会打印清晰警告并以非零码退出。3.3 全部 Flags 参数表以下参数在 src/slides/settings.ts 的resolveSlideSettings中被解析默认值与取值范围与文档完全一致Flag说明默认值取值范围/备注--slides-ocr对每张提取的幻灯片运行 OCR把ocrText与ocrConfidence存入slides.json与 JSON 响应关需要tesseract--slides-dir dir输出基础目录内部会再创建按视频区分的子目录./slides—-o, --output dir--slides-dir的别名——--slides-scene-threshold value场景检测阈值越低检测到越多场景幻灯片更多0.30.1–1.0--slides-max count提取幻灯片的数量上限6正整数--slides-min-duration seconds幻灯片之间的最小时间间隔20–86400--render mode终端内渲染缩略图auto/kitty/iterm/nonenone只打印路径—--theme name选择 CLI 主题——--timeout duration单操作超时不是整体墙钟时限2myt-dlp 下载与 FFmpeg 场景检测至少给5m--no-cache强制重新下载与重新提取关绕过两种缓存--jsonstdout 输出 JSON 信封并禁用内嵌渲染关—--verbose/--debug在 stderr 输出详细进度关—-V, --version打印版本并退出——源码层面的解析细节值得一提resolveSlideSettings使用parseBoolean接受1/true/yes/on与0/false/no/off、parsePositiveInt与parseNumberInRange对参数做严格校验非法值会直接抛错当--slides-scene-threshold未被显式指定时autoTuneThreshold为true意味着系统会对阈值做自动校准详见下文场景检测一节。3.4 输出目录结构与 JSON 信封每次运行写入的目录形如slides/source-id/ slide_0001_18.60s.png slide_0002_42.20s.png ... slides.json文件名包含幻灯片序号与时间戳如slide_0001_18.60s.png对应 src/slides/frame-extraction.ts 中slide_${String(index 1).padStart(4, 0)}.png的命名逻辑slides.json记录清单含 OCR 结果若请求OCR 不会生成独立文本文件ocrConfidence采用 0–1 刻度其估算实现在 src/slides/ocr.ts即字母数字字符占全部字符的比例并 clamp 到 1。--json模式下的 stdout 信封示例文档原文附加提取元数据已省略{ ok: true, slides: { sourceUrl: https://example.com/lecture.mp4, slidesDir: /absolute/path/slides/id, slides: [ { index: 1, timestamp: 18.6, imagePath: /absolute/path/slides/id/slide_0001_18.60s.png, ocrText: Recognized slide text, ocrConfidence: 0.92 } ] } }3.5 终端内嵌渲染Inline rendering--render auto会探测终端能力docs/commands/slides.md 说明它通过 Kitty 的KITTY_WINDOW_ID与 iTerm 的TERM_PROGRAMiTerm.app识别终端并使用对应的图片协议Kitty graphics protocol / iTerm inline images。在不支持的终端上幻灯片只按路径列出。3.6 实战示例# 在 iTerm/Kitty 中快速预览。 summarize slides https://youtu.be/... --render auto # 大型讲座更细粒度的切分。 summarize slides https://youtu.be/... \ --slides-max 24 --slides-scene-threshold 0.2 # 面向自动化的管道友好 JSON。 summarize slides https://youtu.be/... --json | jq .slides.slides[].imagePath # 编辑源视频后强制重新提取。 summarize slides ./talk.mp4 --no-cache -o ./out四、底层实现场景检测与帧提取管线4.1 场景检测原理场景检测在 src/slides/scene-detection.ts 的detectSceneTimestamps中实现对每个视频分段运行 FFmpeg滤镜为selectgt(scene,threshold),showinfo即选出场景得分高于阈值的帧随后从 stderr 的showinfo输出中解析pts_time得到时间戳parseShowinfoTimestamp并按分段并行执行runWithConcurrency最后合并、排序。视频会按 worker 数量切分为多个分段buildSegments最多 16 个 worker见 src/slides/scene-detection.ts从而利用多核加速。关键细节src/slides/frame-extraction.ts零检测重试如果某个阈值下检测不到任何时间戳会以原阈值的一半下限 0.05重试一次并在 warnings 中记录自动校准auto-tune当用户未显式指定阈值时系统先做可选帧采样与基于哈希的阈值校准scene-calibration.ts校准结果写入SlideAutoTunestrategy: hash | none见 src/slides/types.ts间隔兜底buildIntervalTimestamps会按duration/180秒的节奏每 3 分钟左右生成等间隔时间戳候选与场景时间戳合并后取minDuration*0.5的最小间隔去重mergeTimestamps保证长视频中不至于某段完全无幻灯片。4.2 帧提取与时间戳修正帧提取在 src/slides/frame-extraction.ts 的extractFramesAtTimestamps中完成其实现包含多个值得注意的工程细节seek 前垫片每条提取命令先-ss seekBase时间戳前 8 秒再trimstartoffset同时用signalstats,showinfo,metadataprint采集亮度/对比度统计时间戳校正resolveExtractedTimestampsrc/slides/scene-detection.ts根据 showinfo 的真实 PTS 与 seek 基准在相对时间与绝对时间两个候选之间选择更接近请求值的一个防止预 seek 帧把后续幻灯片的时间戳拽回或让尾部时长过滤误删它画质自动调整若帧的亮度低于 0.24 或对比度低于 0.16FRAME_MIN_BRIGHTNESS/FRAME_MIN_CONTRAST会在 ±10 秒、步进 2 秒的范围内尝试候选帧以brightness*0.55 contrast*0.45打分择优替换第一张且时间 8s 的幻灯片还有更严格的亮度偏好整个过程以Slides: improving thumbnails 90%–96%的进度呈现最小间隔过滤applyMinDurationFilter会删除与上一张间隔不足--slides-min-duration的幻灯片并清理其文件applyMaxSlidesFilter则裁剪超出--slides-max的部分均在 src/slides/scene-detection.ts 与 src/slides/scene-detection.ts。4.3 缓存与提取器版本完成的幻灯片结果会在内存与slides.json中携带提取器版本号SLIDE_EXTRACTION_VERSION 1见 src/slides/types.ts。缓存校验会拒绝旧版本/无版本的提取结果包括 SQLite 中的副本从而在时序修正后让过期帧重新生成同时不牵连无关的字幕与摘要缓存见 docs/slides-rendering-flow.md。4.4 媒体下载与临时文件所有权src/slides/download.ts拥有临时下载目录的完整生命周期docs/slides-rendering-flow.md失败时清理部分输出且不覆盖原始错误信息成功时把清理权交还给调用方yt-dlp 的结构化进度在 stdout/stderr 上共享同一解析器而普通的百分比/速度/ETA 行仅在 stderr直接视频 URL 的下载使用 Node 流管道backpressure、文件关闭、流拆除均由管道负责下载所有者还会取消被拒绝的 HTTP body 并中止已完成的 fetchsrc/slides/ingest.ts负责在缓存交接成功前清理下载文件交接成功后清理责任转移给提取流程——这一所有权转移约定保证了任何失败路径都不会残留临时文件。另外 src/slides/runtime.ts 暴露了若干环境变量以微调行为SUMMARIZE_SLIDES_WORKERS并发 worker默认 8上限 16、SUMMARIZE_SLIDES_SAMPLES校准采样数默认 8、SUMMARIZE_SLIDES_YTDLP_FORMAT_EXTRACTyt-dlp 下载格式默认优先 720p H.264/MP4 以获得更广的 ffmpeg 解码兼容性、以及SLIDES_EXTRACT_STREAM1允许下载失败后在低精度流式回退见 docs/slides.md。五、浏览器侧边栏Browser Side Panel在 Chrome 扩展的侧边栏中Slides 模式不再显示大块摘要而是展示纵向的图片/时间戳/文字卡片流文字可以在提取完成前就出现卡片在没有描述时也保持可见点击卡片即可让视频 seek 到对应时间点不会打开模态框生成的幻灯片摘要优先于字幕回退transcript fallbacks。5.1 摘要生成Gemini Nano 与其他模型Gemini Nano端侧可以利用字幕上下文与可用图片在本地生成幻灯片摘要当上下文过大时自动回退为纯文本或更小的请求docs/slides.md。其他模型使用配置的摘要运行时configured summary runtime。5.2 描述回退与 OCR当模型摘要不可用时按如下优先级补齐描述docs/slides.md幻灯片摘要若有字幕时间窗为每张幻灯片截取对应时间段的字幕窗口充当缺失描述OCR在没有字幕可用时启用 OCR 作为最后兜底。选择 OCR 模式时会优先展示识别出的文字且只有当 OCR 产生了足够多有意义的文字时该开关才会出现。字幕窗口的选取细节可在 src/engine/web-prompt.ts 中看到每张幻灯片的时间窗取上一张与当前张的中点到当前张与下一张的中点首尾各扩展 30 秒默认边缘 10 秒余量窗口内的字幕段被截断拼接进提示词。5.3 回退文本预算Fallback Text Budgets回退描述的长度预算随--length伸缩docs/slides.md--length回退文本预算字符short≈120medium≈200long≈320xl≈480xxl≈700自定义字符目标会在最多 10 张幻灯片之间分配并 clamp 到每张 80–900 字符。字幕窗口从 30 秒增长到 180 秒到下一张幻灯片为止并包含一段简短的前导lead-in。注意文档明确指出这些是回退文本的预算不是模型生成摘要的硬性限制。与预算配套的还有每张幻灯片可携带的最大字幕字符上限见 src/engine/web-prompt.ts 的MAX_SLIDE_TRANSCRIPT_CHARS_BY_PRESETshort 2500、medium 5000、long 9000、xl 15000、xxl 24000 字符超出部分会在词边界处截断并追加省略号。5.4 浏览器提取与守护进程提取路径手段适用浏览器提取MediaBunny/WebCodecs可 fetch 的视频 可见标签页捕获fallback页面内视频守护进程Daemon提取下载媒体后使用 FFmpeg可选 Tesseract OCR走 daemon 的离线/重活场景运行时选择方式见 浏览器设置文档。从 docs/slides-rendering-flow.md 看扩展侧的background/content-script-bridge.ts在提取、seek 与帧准备之间共享重试/重注入处理而 sidepanel 的stream-controller.ts负责传输生命周期、stream-controller-policy.ts负责块/状态终止规则、extension-logs.ts只做存储队列与 flush。六、职责划分Ownership与实现入口docs/slides.md 明确定义了各模块的边界模块职责Core字幕解析transcript parsing、回退预算、幻灯片摘要强制转换slide-summary coercion侧边栏描述选择与渲染状态Browser AI端侧模型会话on-device model sessionsCLI 输出终端渲染与图片支持Daemon/CLI 提取媒体只下载一次检测帧提取复用优先复用缓存媒体更多实现入口可参考 渲染流程文档CLI 输出src/run/flows/url/slides-output.ts构造与编排、slides-output-state.ts时间线状态/等待器/收尾、slides-output-render.ts终端渲染与内嵌图片策略、slides-output-stream.ts摘要流解析粘合层该文档还立下一条规则终端 I/O 留在渲染 helper 中状态变更留在 state store 中进程管理src/slides/process.ts 负责媒体工具的 spawn、deadline、退出错误与输出收集忽略的 stdout 会被排空以防子进程因管道满而阻塞OCR 使用二进制捕获以避免把识别文本打进日志运行时解析src/slides/runtime.ts 负责工具解析、worker/采样设置与进度/日志适配器缓存路径输出目录准备与按目录串行化位于 src/slides/store.ts与缓存路径耦合让提取编排专注于管线本身。调试时遵循三条经验法则见 docs/slides-rendering-flow.md先检查状态转换state transitions再怀疑 DOM 问题先检查流策略stream policy再排查传输重试逻辑先检查缓存/水合 helper再归咎于渲染。七、总结Slides 模式把视频关键帧提取这一确定性媒体任务与模型摘要这一生成式任务做了干净解耦提取零模型依赖基于 FFmpeg 场景检测、并行分段、时间戳校正与画质择优摘要按需降级从模型生成 → 字幕时间窗 → OCR 逐级兜底并用随--length伸缩的字符预算控制回退文本规模渲染双端并行CLI 支持 Kitty/iTerm 内嵌图片与 OSC-8 时间戳链接扩展侧边栏支持点击 seek 与 Gemini Nano 端侧摘要。无论你是想在终端快速切分一场讲座、把幻灯片导出为 JSON 喂给自动化流程还是想理解扩展中图片 字幕 描述卡片流的完整数据链路本文涉及的文档与源码docs/commands/slides.md、docs/slides-rendering-flow.md、src/slides/、src/engine/web-prompt.ts都是可靠的入手点。【免费下载链接】summarizePoint at any URL/YouTube/Podcast or file. Get the gist. CLI and Chrome Extension.项目地址: https://gitcode.com/GitHub_Trending/summarize/summarize创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考