auto-summarize-everything
坚持手写前言
视频的总结很早就有,然而这套方法并不是直接用多模态模型去检测视频内容,这消耗承受不住。现在借助一个SKILL和MiniMax的token plan,我们自己就能本地搭建一个总结视频的workflow,我把他写成了一个SKILL进行了封装,目前在B站小红书抖音都能正常跑通流程。
感谢灵感来源,SKILL可以从media-analyze获取。
关键技术说明
OpenCLI
链接:https://github.com/jackwener/OpenCLI 或 https://opencli.co/
1. 它到底是什么
OpenCLI可以理解成两层东西:第一层是一套“浏览器遥控器”,第二层是基于这套遥控器写出来的“网站快捷命令”。
浏览器遥控器负责完成最基础的网页操作,例如打开网页、查看页面内容、点击按钮、往输入框里输入文字、等待页面变化、读取页面文字、抓取网页请求返回的数据、截图或下载文件。无论是B站、小红书、知乎还是其他网站,这些基础动作大体都是通用的。
网站快捷命令则是把某个平台的固定流程封装起来。例如:
1 | opencli bilibili hot --limit 5 |
这些命令看起来像普通CLI,但背后可能是在打开网页、复用登录态、调用页面里的接口、整理字段,然后把结果输出成表格或JSON。对人来说,它把网页操作变成了命令;对Agent来说,它把不稳定的网页点击变成了更可控的工具调用。
2. 为什么能复用登录态浏览器
OpenCLI不是自己重新模拟一个浏览器,而是在本机Chrome/Chromium里安装一个Browser Bridge扩展。执行浏览器相关命令时,大致流程是:
1 | opencli命令 |
所以网页请求是在你真实的Chrome里发出去的,会自然带上这个浏览器里已有的cookie、localStorage等登录信息。也就是说,只要你已经在Chrome里登录过目标网站,OpenCLI就可以在这个登录环境里执行操作,而不需要把账号密码或者cookie单独交给脚本。
这点很重要。很多网站的数据只有登录后才能看到,传统脚本往往要自己维护cookie,容易过期,也有安全风险。OpenCLI的思路是让凭证继续留在浏览器里,命令只负责“遥控”这个已经登录好的浏览器。
基本安装和检查流程如下:
1 | npm install -g @jackwener/opencli |
其中浏览器型命令还需要安装Browser Bridge扩展,并确保Chrome/Chromium正在运行、目标网站已经登录。
3. opencli browser提供了哪些基础操作
opencli browser可以理解成OpenCLI暴露出来的一组浏览器遥控按钮。比如:
1 | opencli browser demo open https://www.baidu.com |
这里的demo是一个会话名字,表示接下来这些命令尽量操作同一个浏览器页面。state的作用是让OpenCLI先“看一眼当前网页”,然后把页面上能点、能输入、能读取的地方整理成一个清单。比如它可能看到:
1 | [1] 搜索框 |
之后执行opencli browser demo click 2,意思就是点击刚才清单里的第2个东西;执行opencli browser demo type 1 "OpenCLI",意思就是往第1个输入框里输入文字。这样Agent不需要只靠截图猜页面,而是可以先拿到一份页面清单,再根据编号一步步操作。
除了点击和输入,OpenCLI还可以读取页面文字、查看当前标签页、监听网页请求、执行页面内的读取脚本、截屏、滚动页面等。它的重点不是替代所有浏览器自动化工具,而是把这些能力整理成Agent容易调用的命令形式。
4. 现成适配器和不同平台的差异
OpenCLI说“把任意网站变成CLI”,并不是说它天生知道所有网站怎么用。真正开箱即用的是那些已经写好适配器的网站,例如B站、小红书、知乎、Twitter/X、Reddit、HackerNews等。
这里需要区分“通用动作”和“具体流程”:
1 | 通用动作:打开、点击、输入、等待、读取、截图、抓请求 |
通用动作在不同平台上大体一致,但具体流程并不一致。B站热门可能是打开B站后调用热门视频接口,再整理标题、作者、播放量、bvid;小红书搜索可能是进入搜索页、输入关键词、等待结果加载,再从页面或接口里提取笔记标题、作者、链接。它们都使用OpenCLI的浏览器能力,但每个平台的适配器都需要单独写。
所以OpenCLI更准确的定位是:它提供一套通用的网页操作能力,并把常见平台的稳定流程封装成命令。有适配器的网站可以直接用;没有适配器的网站,就需要先探索页面,再把稳定下来的流程写成新的命令。
5. 如何把一个新网站变成OpenCLI命令
如果只是自己本机使用,最简单的方式是写一个私人adapter。OpenCLI会自动发现~/.opencli/clis/<site>/<command>.js下面的命令文件,因此所谓“注册新网站”,本质上不是去某个中心平台登记,而是把适配器文件放到约定目录里。
一个大致流程如下:
1 | # 1. 先检查浏览器桥接是否正常 |
写adapter时,通常不是从零硬写,而是找一个相似网站或相似功能的已有适配器复制过来,主要改三类东西:入口网址、数据来源、字段映射。一个极简的结构大概类似这样:
1 | import { cli, Strategy } from '@jackwener/opencli/registry'; |
这里的site和name决定最终命令是opencli example top,args定义命令参数,columns定义输出列,func定义具体执行逻辑。真实网站一般会比这个复杂:有些适合直接调用网页接口,有些需要从页面里读数据,有些需要先登录,有些还要处理反爬或字段缩写。因此更稳妥的做法是先用opencli browser state和opencli browser network看清楚页面数据从哪里来,再写adapter。
如果这个命令只是自己临时用,放在~/.opencli/clis/就够了;如果希望长期维护、用Git管理、给别人安装,推荐做成plugin:
1 | opencli plugin create my-site |
后续也可以发布到GitHub,让别人通过opencli plugin install github:user/repo安装。这样OpenCLI就不仅是一个“网页遥控器”,也逐渐变成一个可扩展的网站命令集合。
MiniMax的TokenPlan
MiniMax是最先推出TokenPlan而不是CodingPlan的,它的订阅不仅支持语言模型/编程模型,还支持不少多模态的模型,例如文生图、图片理解、语音生成,可以安装mmx工具在终端使用这些模型,并查看用量。
1 | > mmx |
yt-dlp和faster-whisper
链接:
- yt-dlp:https://github.com/yt-dlp/yt-dlp
- faster-whisper:https://github.com/SYSTRAN/faster-whisper
1. 它们在这个workflow里分别负责什么
如果说OpenCLI负责“找到网页上的内容入口”,MiniMax负责“后续总结和生成文本”,那么yt-dlp和faster-whisper负责的就是中间最关键的一步:把视频变成可以交给大模型处理的文本。
这两个工具的分工很清楚:
1 | yt-dlp:负责把视频、音频、字幕、元数据下载下来 |
所以整个视频总结流程大致是:
1 | 视频链接 |
这里的关键点是:我们并不是直接把整段视频丢给多模态模型理解。那样成本高、速度慢,也很难做批量任务。更合理的方式是先把视频压缩成文本信息,保留标题、作者、发布时间、分段时间戳、字幕或转写文本,再让大模型处理这份文本。
2. yt-dlp:视频下载和信息提取工具
yt-dlp可以理解成一个很强的视频站点下载器。它不只是支持YouTube,也支持大量视频、音频和内容平台。它的作用不是“理解视频”,而是尽可能稳定地把视频相关资源取出来,包括视频文件、音频文件、字幕、封面、标题、作者、发布时间、简介等。
在总结workflow里,我一般会优先尝试拿字幕,因为字幕已经是文本,处理成本最低。如果目标平台没有字幕,或者自动字幕质量很差,再下载音频并转写。
常用命令大概如下:
1 | # 查看视频元数据,不下载视频 |
如果遇到需要登录后才能访问的视频,可以让yt-dlp读取浏览器里的登录信息:
1 | yt-dlp --cookies-from-browser chrome "视频链接" |
这和OpenCLI复用登录态的思路有点像,区别是OpenCLI主要是遥控浏览器页面,yt-dlp则是把浏览器里的cookie拿来请求视频资源。实际使用时,有些平台可以直接用yt-dlp解决,有些平台则需要OpenCLI先帮忙打开页面、找到真实链接或提取页面信息,再交给yt-dlp下载。
另外,yt-dlp经常依赖ffmpeg处理音视频,例如合并音频和视频、从视频里抽取音频、转码成mp3等。因此本地最好先安装ffmpeg:
1 | brew install ffmpeg |
3. faster-whisper:把音频转成文字稿
faster-whisper是Whisper模型的一个高效实现。它的目标不是下载视频,而是接收一个音频文件,然后输出一段段文字,并且每段文字带有开始和结束时间。
一个最小示例如下:
1 | from faster_whisper import WhisperModel |
这里需要注意两点。第一,segments不是一次性返回的完整列表,而是一个可以逐段读取的结果,所以要通过for segment in segments真正触发转写。第二,模型大小和设备选择会明显影响速度和内存占用。
如果是CPU环境,可以先用:
1 | model = WhisperModel("large-v3", device="cpu", compute_type="int8") |
如果有NVIDIA GPU,可以用:
1 | model = WhisperModel("large-v3", device="cuda", compute_type="float16") |
对于视频总结这种任务,转写不一定必须追求最高精度。很多时候medium、large-v3、distil-large-v3之类模型都可以试,关键是看本机速度、显存和可接受的错字率。如果只是想快速跑通流程,可以先用小一点的模型;如果是正式归档,再用更大的模型重新转写。
安装方式也比较直接:
1 | python -m pip install -U faster-whisper |
4. 为什么需要把二者串起来
单独使用yt-dlp只能拿到视频资源,不能保证拿到可直接总结的文字。单独使用faster-whisper又要求你已经有音频文件。两者组合起来,才形成了比较完整的视频转文本流程。
我比较推荐的优先级是:
1 | 1. 先尝试下载人工字幕 |
这样做的好处是成本可控。字幕如果已经存在,就不需要跑语音识别;只有在没有字幕时,才使用本地模型转写。对于长视频,这个差别很明显,因为语音识别会消耗大量时间,而字幕解析几乎是瞬间完成。
整理文字稿时,最好保留时间戳:
1 | [00:00:03] 开场介绍 |
这样后续大模型总结时,不仅可以生成普通摘要,还可以生成“带时间轴的笔记”。如果某段总结有问题,也能根据时间戳回到原视频核对。
5. 一个最小可跑的处理流程
如果不考虑复杂的平台适配,一个最小流程可以拆成三步。
第一步,用yt-dlp下载音频:
1 | mkdir -p downloads |
第二步,用faster-whisper转写音频。可以写一个简单的transcribe.py:
1 | from pathlib import Path |
第三步,把transcript.md交给LLM总结。这里可以要求模型输出几类内容:
1 | 1. 一句话概括 |
在真正的自动化workflow里,这三步会被封装进SKILL中。用户只需要给一个链接,SKILL负责判断有没有字幕、是否需要下载音频、是否需要调用faster-whisper、如何切分长文本、最后如何调用LLM总结。yt-dlp和faster-whisper本身并不神秘,但它们把“视频”变成了“可被大模型稳定处理的文本”,这是整个流程里非常关键的一层。



