我怎么从一个小红书视频里提取字幕

Jul 3 · 12min · 沈佳棋

背景

今天遇到一个很具体的小问题。

我在聊 AI 内容生成这件事时,看到一个观点很贴近:张咋啦 Zara 说,做内容快,是因为功夫在诗外。这个视频先是微信视频号链接,后来又找到了同一条小红书笔记。

我想做的事情很简单:把视频里的字幕提取出来,结合前面聊的观点,把文章写得更扎实一点。

听起来不难。

实际做下来,绕了几圈。也挺好,顺手把这条链路拆清楚了。

有哪些方案

如果目标是“从一个小红书视频链接里拿到字幕”,大概有几条路。

第一条路是直接拿平台接口里的字幕。

这是最舒服的情况。打开链接,页面接口返回 note 信息、视频地址、字幕文本,直接解析就行。很多视频平台内部确实有字幕、语音识别结果或结构化片段,只是前端不一定展示。

但这条路不稳定。不同平台、不同页面、不同登录态,接口返回差异很大。公开页能看到的视频,不代表接口会把所有东西都吐给你。

第二条路是音频转写。

拿到视频文件后,用 ffmpeg 抽音频,再交给 Whisper 或云端 ASR。这个方案适用面广,不依赖视频是否有字幕。缺点也明显:要么本地装模型,要么调用 API;遇到背景音乐、口音、多人说话,转写质量会飘。中文短视频里还有很多语气词,后处理也不能省。

第三条路是 OCR。

很多小红书视频本来就把字幕烧在画面里。既然用户看到的是字幕,那机器也可以“看字幕”。具体做法是抽帧,再对字幕区域做 OCR,最后把相邻重复文本合并。

这个方案有点土,但很有效。它不关心视频有没有独立字幕轨,也不关心音频质量。只要画面上的字清楚,就能拿到。

第四条路是人工看。

别笑。三分钟视频,人工看一遍也能整理出来。但这不适合做产品,也不适合批量处理。它适合兜底,不适合作为主流程。

我踩了什么坑

一开始我走的是微信视频号链接。

页面能打开,但 PC 预览页只给了标题、作者、日期和互动数。DOM 里没有 video 标签,也没有字幕。

我继续用 Chrome DevTools Protocol 抓网络请求,终于拿到了真实接口:

POST /finder-preview/api/feed/get_feed_info
{"baseReq":{"generalToken":""},"shortUri":"AICkJU7gY6"}

响应里有作者、标题、封面和一个 dynamicExportId,但没有视频文件,也没有字幕。再用 dynamicExportId 去打开 feed 页面,结果被重定向到“微信版本较低”的页面。到这里,视频号这条路就不值得继续耗了。

后来换成小红书链接,事情顺多了。

短链跳转到了标准笔记页:

https://www.xiaohongshu.com/explore/6a47083200000000210236a2...

页面正文能直接读到标题和文案:标题是“为什么我做内容特别快?因为功夫在诗外”,文案里有“内核 > 外表”。

但字幕还是不在正文里。

页面里有一个 video 标签,可它的 src 是 blob URL:

blob:https://www.xiaohongshu.com/...

blob URL 不能直接拿去 curl 下载。它只是浏览器内存里的一个对象地址。真正的视频文件要从网络请求里找。

最后在 performance resource 里找到了真实 mp4:

sns-video-v3.xhscdn.com/stream/...mp4

下载下来后,ffprobe 显示视频长度是 190.59 秒,分辨率 1080x1440,有音频轨。

接着我准备走音频转写,结果机器上没有本地 Whisper,也没有可用的 OpenAI API key。换 tesseract OCR,发现没有 tesseract 可执行文件,只有 Python 包壳。

这就是实际自动化里常见的尴尬:方案都懂,环境不一定配好。

还好 macOS 自带 Vision OCR,Python 里也能通过 PyObjC 调到。于是我换成 OCR。

最终怎么做

最终链路是这样的:

小红书短链
  -> Chrome/CDP 打开页面
  -> 读取 DOM 和 performance resources
  -> 找到真实 mp4 地址
  -> curl 下载视频
  -> ffmpeg 按 1 秒 1 帧抽图
  -> macOS Vision OCR 识别底部字幕
  -> 合并相邻重复字幕

抽帧命令大概是:

ffmpeg -y -i input.mp4 -vf "fps=1,scale=720:-1" frames/frame_%04d.jpg

这个视频 190 秒,抽出来 191 张图。

然后用 Vision OCR 识别每一帧。这里有个小技巧:不需要识别整张图。字幕基本在画面底部,所以只保留低位区域的识别结果,能少很多噪音。

我当时过滤的是 Vision bounding box 里 y 值比较低的文本。识别出来后,再用相似度合并相邻帧。因为同一句字幕通常会停留两三秒,如果不合并,会得到一堆重复行。

最后得到的是一组带时间段的字幕片段。比如开头能还原出这样的意思:

很多人问我是怎么有时间做这么多内容的。
我没有在做内容上花很多时间。
做这样一个视频可能不到 30 分钟。
内容是日常工作、思考和爱好的自然溢出。
坐在手机前录视频,不是内容创作的开始,而是最后一步。

这已经足够用来理解视频观点了。后面我没有把完整口播逐字搬进文章,只提炼了几个核心点:内容快来自平时积累,内容分内核和外表,很多 AI 内容的问题是外表大于内核。

如果做成产品

如果要做一个“输入小红书视频链接,自动提取字幕”的产品,我不会只做单一路径。

最好的方案应该是混合管线。

第一步,用真实浏览器解析链接。

小红书短链、登录态、跳转参数、风控脚本都不太适合只用普通 HTTP 请求硬抓。真实浏览器能复用用户登录态,也能拿到前端真正加载过的资源。这里可以用 CDP 或 Playwright。产品化时要把每次网络请求、最终 URL、note id、视频 URL 都记录下来,方便排查。

第二步,先找结构化字幕。

如果接口里有字幕、语音识别结果或字幕轨,那就直接用。这是成本最低、质量最高的情况。只是不能假设它一定存在。

第三步,判断视频有没有烧录字幕。

可以抽几张关键帧,用 OCR 看底部是否稳定出现文字。如果有,就走 OCR。对于小红书这类口播视频,这条路很实用。速度快,成本低,也不怕背景音乐。

第四步,OCR 不行再走 ASR。

没有字幕、字幕太小、字幕被遮挡,或者视频是纯口播无字幕,就抽音频转写。ASR 可以用本地 Whisper,也可以用云端模型。这里要把成本、速度、隐私和准确率放在一起看。

第五步,用 LLM 做清洗,不让 LLM 做原始识别。

LLM 适合整理断句、去重、合并口语、输出摘要和章节。它不适合凭空“猜字幕”。原始文本必须来自 OCR 或 ASR,LLM 只能做后处理。

第六步,给每条结果留证据。

产品不能只吐一段干净文本。它应该告诉用户:这段字幕来自 OCR 还是 ASR,覆盖了哪些时间段,置信度大概如何,原始视频地址是什么,失败时卡在哪一步。

这个产品真正有用的地方,不是“我能提取字幕”。单次提取字幕只是功能。更大的价值是把视频变成可检索、可引用、可复盘的素材。

比如对内容创作者来说,一个视频被解析后,应该能继续生成:

完整字幕
要点摘要
金句候选
选题标签
观点结构
可引用片段
和自己账号定位的关联

这样它就不是一个下载器,而是素材库的入口。

总结

这次最有意思的地方,是最后选中的方案并不“高级”。

我没有用上复杂模型。没有语音转写。也没有拿到平台隐藏字幕。

真正跑通的是一条朴素链路:浏览器拿视频,ffmpeg 抽帧,Vision OCR 读字幕,再做去重。

但它好用。

这也提醒我,做这类工具时不要迷信单个模型。很多问题不是模型能力不够,而是管线没有拆对。链接解析、媒体定位、字幕来源判断、OCR、ASR、后处理、证据记录,每一步都很小,但连起来就能变成一个可用产品。

如果以后真的做“小红书视频字幕提取器”,我会把它做成一个素材入口,而不是只做一个文本框。

输入一个链接,输出的不只是字幕,而是一份可以继续被创作者使用的素材卡。

Powered By antfu.me 2026-PRESENT © OppenHeimor