Summarize:万物摘要工具(CLI + Chrome 侧边栏)
> 来源: https://github.com/steipete/summarize
> 作者: Peter Steinberger (@steipete),同时也是 PinchBench 的推广者
> 许可: MIT
> 安装: npm i -g @steipete/summarize 或 brew install steipete/tap/summarize
📌 核心理念
> "Point at any URL/YouTube/Podcast or file. Get the gist."
Summarize 是一个"万物摘要"工具——给它任何 URL、文件、YouTube 视频、播客、PDF、图片、音视频,它返回一个结构化的摘要。同时提供 CLI 和 Chrome/Firefox 浏览器扩展。
🏗️ 双形态架构
形态 1:命令行工具
# 网页
summarize "https://example.com"
# PDF(本地或远程)
summarize "/path/to/file.pdf" --model google/gemini-3-flash
# YouTube(自动提取字幕 + 截取关键帧)
summarize "https://youtu.be/dQw4w9WgXcQ" --youtube auto
# 播客 RSS
summarize "https://feeds.npr.org/500005/podcast.xml"
# Apple Podcasts / Spotify
summarize "https://podcasts.apple.com/us/podcast/..."
# 音视频文件
summarize "/path/to/audio.mp3"
# 管道输入
pbpaste | summarize -
cat report.pdf | summarize -
形态 2:Chrome 侧边栏 / Firefox 侧边栏
安装浏览器扩展后,在 Chrome 侧边栏直接看到当前页面的摘要。
工作方式:扩展本身不跑模型,而是通过 localhost 与本地 daemon 通信:
# 安装 daemon(自动开机启动)
summarize daemon install --token <从扩展复制的 token>
Daemon 处理重活:yt-dlp 下载、ffmpeg 转码、OCR、转录——浏览器扩展只负责展示。
🎯 支持的内容类型
| 类型 | 示例 | 说明 |
|---|---|---|
| 网页 | 任意 URL | HTML → Markdown → 摘要 |
| 本地/远程 | 直接发给模型(Google 最稳) | |
| 图片 | jpg/png/webp/gif | 多模态理解 |
| YouTube | youtube.com/youtu.be | 字幕提取 + 关键帧截图 + OCR |
| 播客 | RSS/Apple/Spotify | 自动转录最新一期 |
| 音频 | mp3/wav/m4a/ogg/flac | 本地转录 |
| 视频 | mp4/mov/webm | 转录 + 可选关键帧提取 |
| 文本 | txt/md/json/yaml/xml | 直接内联到 prompt |
| stdin | 管道输入 | 支持文本和二进制(≤50MB) |
🎬 YouTube Slides 功能(亮点)
这是最有特色的功能:
1. 从 YouTube 视频中自动截取关键帧(幻灯片切换检测)
2. 对每帧运行 OCR(需要 tesseract)
3. 生成带时间戳的卡片
4. 点击卡片跳转到视频对应位置
5. 可切换 OCR 文本 / 原始字幕
summarize "https://youtu.be/..." --slides --slides-ocr
这对看技术演讲特别有用——不用看完整个视频,直接看关键帧 + 摘要。
🔬 关键帧识别算法(源码分析)
通过阅读 src/slides/scene-detection.ts 源码,关键帧识别分三步,不依赖任何 ML 模型,纯信号处理:
Step 1:自动校准阈值(calibrateSceneThreshold)
先从视频中均匀采样 3-12 帧(覆盖 5%-95% 的时间线),对每帧:
ffmpeg -ss {时间} -i {视频} -frames:v 1 -vf "scale=32:32,format=gray" -f rawvideo -
把每帧缩到 32×32 灰度图(1024 字节),然后算 Average Hash(平均哈希):
对每个像素:值 ≥ 全图平均值 → 1,否则 → 0
得到一个 1024 位的二进制指纹
比较相邻采样帧的汉明距离(不同位数 / 总位数),得到一组 diff 值。根据统计分布(中位数、P75、P90)自动计算最佳场景检测阈值:
threshold = max(median * 0.15, p75 * 0.2, p90 * 0.25)
// 然后 clamp 到 [0.05, 0.3] 范围
为什么这样做:不同类型的视频(幻灯片演讲 vs 自然风景 vs 动画)的帧间差异分布完全不同。预采样 + 统计分析可以自适应地找到最佳阈值,避免一刀切。
Step 2:场景变化检测(detectSceneTimestamps)
用 ffmpeg 内置的 scene 滤镜跑整个视频:
ffmpeg -i {视频} -vf "select='gt(scene,{阈值})',showinfo" -f null -
ffmpeg 的 scene 滤镜对每帧计算一个场景变化分数(0-1),当分数 > 阈值时判定为场景切换。原理是比较当前帧与上一帧的像素差异。
并行加速:视频被分成多段(最多 16 个 worker),每段独立检测,最后合并时间戳。
Step 3:过滤 + 提取
所有场景变化时间戳
↓ 按 minDurationSeconds 过滤太密集的(两帧间隔 ≥ N 秒)
↓ 按 maxSlides 截断(默认最多 6 帧)
↓ ffmpeg 提取对应时间点的截图
↓ [可选] tesseract OCR 识别截图中的文字
↓ 生成带时间戳的卡片
算法评价
| 优点 | 说明 |
|---|---|
| **零 ML 依赖** | 不需要 GPU、不需要模型下载,纯 ffmpeg 信号处理 |
| **自适应阈值** | 预采样校准,不同类型视频都能工作 |
| **并行处理** | 分段检测 + 多 worker,长视频也快 |
| **两级过滤** | 先检测再过滤,保证关键帧之间有足够间隔 |
这个设计非常工程化——用简单可靠的方法(感知哈希 + ffmpeg scene 滤镜)解决了从视频中提取关键帧的问题,不追求学术上的最优,而是追求在任何机器上都能稳定运行。
🤖 模型支持
支持几乎所有主流模型,使用 provider/model 格式:
summarize "..." --model openai/gpt-5-mini
summarize "..." --model anthropic/claude-sonnet-4-5
summarize "..." --model google/gemini-3-flash
summarize "..." --model xai/grok-4-fast-non-reasoning
还支持本地编码 CLI 作为后端:
summarize "..." --cli codex # 用 Codex CLI
summarize "..." --cli claude # 用 Claude Code
summarize "..." --cli gemini # 用 Gemini CLI
免费使用
# 配置 OpenRouter 免费模型
summarize refresh-free --set-default
# 之后默认用免费模型
📏 长度控制
summarize "..." --length short # ~900 字符
summarize "..." --length medium # ~1,800 字符
summarize "..." --length long # ~4,200 字符
summarize "..." --length xl # ~9,000 字符
summarize "..." --length xxl # ~17,000 字符
summarize "..." --length 20k # 自定义字符数
智能短内容检测:如果原文比请求的摘要还短,直接返回原文(可用 --force-summary 强制摘要)。
📊 输出模式
| 模式 | 说明 |
|---|---|
| 默认 | 流式 Markdown 渲染 + 指标 |
| `--plain` | 原始文本,无 ANSI 渲染 |
| `--json` | 机器可读,含诊断/prompt/指标 |
| `--extract` | 只提取内容不摘要 |
| `--metrics detailed` | 详细的 token/成本/耗时统计 |
💡 分析与评价
为什么值得关注
1. 同一个作者:Peter Steinberger 也是 PinchBench 的推广者,在 OpenClaw 社区非常活跃
2. 真正的全能选手:不只是"网页摘要"工具,YouTube slides 提取、播客转录、本地音视频处理都做了
3. CLI + 浏览器双形态:开发者用 CLI,普通用户用 Chrome 侧边栏
4. Daemon 架构精妙:浏览器扩展 → localhost daemon → 本地工具链,避免了浏览器的沙箱限制
转录 Fallback 链
已发布字幕 → Groq → ONNX → whisper.cpp → AssemblyAI → Gemini → OpenAI → FAL
这个 fallback 链设计得很务实——优先用免费的(已有字幕),然后是快速便宜的(Groq),最后才是贵的(OpenAI)。
与类似工具对比
| 工具 | CLI | 浏览器 | YouTube | 播客 | 音视频 | 多模型 | |
|---|---|---|---|---|---|---|---|
| **Summarize** | ✅ | ✅ 侧边栏 | ✅ Slides+OCR | ✅ | ✅ | ✅ | ✅ |
| Kagi | ❌ | ✅ | 部分 | ❌ | ❌ | ❌ | ❌ |
| tldr-pages | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| ChatGPT | ❌ | ✅ | 部分 | ❌ | ❌ | ✅ | ❌ |
评分
| 维度 | 评分(/10) |
|---|---|
| 功能覆盖 | 9.5 |
| CLI 设计 | 9 |
| 浏览器扩展 | 8.5 |
| 模型兼容性 | 9 |
| 实用价值 | 9 |
| **综合** | **9.0** |
🔗 与我们的关联
1. 深度研究工具链:可以集成到我们的研究流程中——把 YouTube 演讲自动摘要成报告素材
2. 与 OpenClaw 集成:支持 --cli codex/claude 作为后端,可以在 OpenClaw 的 Codex 频道中使用
3. 播客/视频研究:之前我们只处理文章和推文,有了 Summarize 可以扩展到播客和视频
4. 同一生态圈:作者 steipete 同时做 PinchBench 和 Summarize,都是 OpenClaw 社区核心工具
报告由深度研究助手自动生成 | 2026-03-08