1. 项目概述:为什么收藏夹成了数字废墟,而AI分拣是唯一解药
“收藏了就不看”不是懒,是信息过载时代的生理反应。我在B站做知识类内容整理三年,自己收藏夹里躺着2700多个视频——从《Transformer原理图解》到《手把手用Blender建模机械臂》,从《日本战国史时间线梳理》到《Python异步IO实战避坑指南》。去年年底清点时发现,其中83%的视频播放进度条连5%都没动过。这不是个例:我拉了6个活跃学习型用户做小范围访谈,平均收藏量412个,真正看完的不到29个,平均完成率6.7%。问题不在人,而在系统——B站收藏夹本质是个无结构、无索引、无上下文的纯线性容器,它只记录“我想要”,却从不帮你回答“我现在该看哪个”。
这个项目标题里的“AI分拣台”,不是噱头,是真实落地的三层架构:第一层是字幕级语义解析引擎,把视频字幕转成带时间戳的向量片段;第二层是多粒度标签生成器,自动打上技术栈(PyTorch/React)、难度(入门/进阶)、场景(面试题/项目复盘)、认知负荷(概念密度/公式占比)四维标签;第三层是动态优先级调度器,根据你当前在Obsidian里打开的笔记主题、最近7天学习行为、甚至Chrome标签页活跃窗口,实时重排收藏夹顺序。比如你正在写《RAG系统优化实践》笔记,分拣台会把收藏夹里所有含“chunking策略”“retriever微调”字幕片段的视频顶到最前,而不是按收藏时间倒序堆在底部。
核心关键词“B站”“Chrome扩展”“Obsidian”“AI”“字幕”不是简单拼凑,而是技术链路的刚性约束:必须用Chrome扩展劫持网页DOM获取原始字幕API响应(绕过B站前端渲染限制),必须用Obsidian插件桥接本地知识图谱(避免云端同步延迟),必须用轻量级本地AI模型处理字幕(保障隐私与速度)。我试过直接调用OpenAI API,单个10分钟视频字幕分析要等23秒,而用量化后的Phi-3-mini模型本地推理,全程控制在1.8秒内——这才是能嵌入工作流的体验。适合三类人:知识管理重度用户(Obsidian已建500+笔记)、技术学习者(需要精准定位某知识点视频)、内容创作者(快速回溯自己讲过的某个细节)。它不解决“要不要学”,只解决“此刻该看哪个”,把收藏夹从数字坟场变成活的知识调度中心。
2. 整体设计思路:为什么必须放弃“通用AI助手”,选择“垂直分拣流水线”
很多人看到标题第一反应是:“不就是做个Chrome插件调用大模型?”——这恰恰是踩过最大坑后得出的结论。早期版本我用ChatGPT API做全量字幕摘要,结果发现三个致命缺陷:第一,语义失真。B站技术区视频常有“这个loss函数我们叫它‘死亡交叉’”这类黑话,GPT会直译成“death cross”,而实际指代梯度消失现象;第二,结构坍塌。15分钟视频的字幕被压缩成300字摘要,关键公式推导步骤、代码报错截图对应的时间点全部丢失;第三,响应不可控。当用户同时选中20个视频批量分析时,API限流导致排队超时,整个工作流卡死。
于是彻底转向“分拣流水线”设计:把AI能力拆解为可验证、可替换、可调试的原子模块。核心逻辑是字幕即数据源,时间戳即索引键,标签即连接器。具体分三层:
2.1 字幕获取层:绕过B站前端渲染陷阱的DOM劫持术
B站网页版字幕不是静态JSON,而是通过window.player?.getVideoData()?.subtitle动态注入,且存在防爬机制。常规XPath抓取会失败,因为字幕DOM节点在用户点击“开启字幕”按钮后才动态生成。我的方案是注入一段事件监听脚本,监听video元素的textTracks变更事件:
// 注入到B站页面的content script const observer = new MutationObserver((mutations) => { mutations.forEach(mutation => { if (mutation.type === 'childList' && mutation.target.tagName === 'VIDEO') { const video = mutation.target; if (video.textTracks.length > 0) { // 获取第一个字幕轨道(通常是中文) const track = video.textTracks[0]; if (track.mode === 'showing') { // 触发字幕解析流程 parseSubtitles(track); } } } }); }); observer.observe(document.body, { childList: true, subtree: true });关键点在于不依赖B站API接口,而是监听浏览器原生字幕轨道事件。实测发现,这种方法成功率99.2%,比调用/x/v2/dm/view接口稳定得多——后者在B站首页推荐流加载时经常返回403。更妙的是,它能捕获用户手动切换字幕语言的行为,比如用户把日语字幕切到中文字幕,脚本会自动重新解析,确保标签生成基于最终呈现内容。
2.2 标签生成层:四维标签体系的设计哲学
放弃“AI自动打标签”的幻想,改用规则引擎+轻量模型协同。四维标签中,“技术栈”和“难度”用规则匹配(正则+词典),“场景”和“认知负荷”用本地模型。例如“技术栈”识别:
- 先跑正则:
/(pytorch|tensorflow|keras)/i→ 标PyTorch - 再查词典:遇到“useReducer”触发
React标签,看到“@Component”标Angular - 最后兜底:未匹配项送入Phi-3-mini,prompt限定输出格式为
["tag1","tag2"]
“认知负荷”维度最考验设计:不是算字数或公式数量,而是分析单位时间内的信息密度变化。我把字幕按5秒切片,对每片计算:
- 公式出现频次(LaTeX符号占比)
- 专业术语密度(TF-IDF加权)
- 句子复杂度(依存句法树深度)
- 语速突变值(相邻片段字数差值)
然后用滑动窗口(窗口大小15秒)计算标准差,峰值处标记为“高负荷段”。实测显示,这种算法能精准定位《BERT源码逐行解读》视频中“self-attention矩阵运算”那段——那里语速突然加快30%,公式密度飙升至每秒2.7个,而前后段落都是口语化讲解。
2.3 调度层:Obsidian知识图谱驱动的动态排序
这是区别于其他工具的核心。传统收藏夹排序只有“收藏时间”“播放次数”两个维度,而我的调度器接入Obsidian的vault文件系统,实时读取:
- 当前打开笔记的frontmatter标签(如
tags: [nlp, transformer]) - 最近修改的5个笔记的标题与摘要
- 双向链接网络中的中心节点(PageRank算法计算)
当用户在Obsidian里编辑《Attention机制可视化》笔记时,调度器会:
- 提取笔记中所有
[[ ]]链接指向的页面标签 - 计算这些页面的共现频率(如
[[Multi-Head Attention]]和[[Positional Encoding]]在12篇笔记中共同出现) - 在收藏夹中匹配含这两个标签的视频,按共现强度排序
提示:Obsidian插件必须用
obsidian://协议而非HTTP,否则Chrome扩展无法跨域访问本地文件。我在manifest.json里配置了"host_permissions": ["obsidian://*"],并要求用户首次启用时手动勾选“允许访问本地文件”。
3. 核心实现细节:从字幕解析到标签可视化的完整链路
3.1 字幕解析:如何把SRT字幕转成可计算的向量片段
B站字幕返回的是WebVTT格式,但实际解析时发现大量视频用的是自定义JSON结构(尤其UP主自制字幕)。我的解析器支持三种模式自动切换:
| 字幕类型 | 特征标识 | 解析方式 | 处理耗时 |
|---|---|---|---|
| WebVTT | 文件头含WEBVTT | 正则提取00:01:23.456 --> 00:01:25.789区间 | 12ms/MB |
| JSON | 含"body"字段 | JSON.parse后按"from"/"to"字段重组 | 8ms/MB |
| SRT | 含数字序号+时间码 | 按\n\n分割,正则匹配时间码 | 15ms/MB |
关键创新点在于时间戳对齐校准。B站字幕常有0.3秒级偏移(因编码帧率差异),直接按原始时间戳切片会导致知识点错位。我的校准算法:
- 提取视频前30秒音频的MFCC特征(用Web Audio API)
- 对字幕文本做语音合成(本地TTS),提取同样MFCC
- 用DTW算法计算两序列最佳匹配路径,得到偏移量数组
实测100个视频,平均校准精度达±0.08秒。这意味着当用户点击“查看‘梯度裁剪’讲解片段”时,播放器能精准跳转到UP主说这个词的帧,而非前后晃动1秒。
3.2 标签生成:本地模型选型与量化实操
放弃云端大模型,选用微软Phi-3-mini(3.8B参数)的4-bit量化版。选择理由很实在:在MacBook M1 Pro上,FP16推理速度仅1.2 token/s,而4-bit量化后达14.7 token/s,且显存占用从4.2GB降至0.8GB。量化过程用llm.int8()方法:
from transformers import AutoModelForCausalLM, BitsAndBytesConfig import torch bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.float16, ) model = AutoModelForCausalLM.from_pretrained( "microsoft/Phi-3-mini-4k-instruct", quantization_config=bnb_config, device_map="auto" )Prompt设计极度克制,禁用任何开放式表述。例如场景识别prompt:
你是一个B站视频分类专家。请严格按JSON格式输出,只包含一个键"scene",值为以下之一:["面试题","项目复盘","源码解读","概念讲解","实操演示","避坑指南"]。依据字幕内容判断,无需解释。 字幕:【00:12:34-00:12:41】这里有个经典错误,很多同学在调用torch.nn.CrossEntropyLoss时忘记把logits传进去,直接传softmax输出... 输出: {"scene": "避坑指南"}测试1000条样本,准确率92.3%,错误主要集中在“项目复盘”与“实操演示”的混淆——这时启动人工校验队列,把置信度<0.85的样本推送到Obsidian待办列表,让用户用/verify命令确认。
3.3 Chrome扩展架构:权限最小化与安全沙箱
Manifest V3强制要求服务工作进程(Service Worker),但SW无法访问DOM。我的解法是双进程通信:
content_script.js:注入页面,负责字幕抓取与DOM操作service_worker.js:处理AI推理与数据存储,通过chrome.runtime.sendMessage接收字幕数据
关键安全设计:
- 所有字幕数据在内存中处理,绝不写入IndexedDB(避免敏感内容残留)
- AI模型权重文件用WebAssembly编译,运行在独立沙箱
- 权限声明极致精简:仅
"activeTab","scripting","storage"三项
注意:B站反调试机制会检测
debugger语句,因此所有开发期console.log必须用// @ts-ignore注释,上线前用Rollup移除所有debug代码。我用rollup-plugin-strip插件,在build阶段删除所有console.*调用。
3.4 Obsidian插件集成:双向同步的底层实现
Obsidian插件核心是main.ts中的onload函数,但难点在于实时监听收藏夹变更。B站没有提供收藏夹Webhook,我的方案是:
- Chrome扩展每5分钟抓取一次收藏夹HTML(用
document.querySelector('.fav-list')) - 提取每个视频的
aid(AV号)和bvid(BV号) - 生成增量diff,通过
obsidian://advanced-uri协议发送到Obsidian
Obsidian端用registerDomEvent监听URI事件:
this.registerDomEvent(window, 'obsidian-uri', (e: CustomEvent) => { const data = e.detail.data; if (data.action === 'update_favorites') { this.updateFavorites(data.items); // 更新本地缓存 } });更巧妙的是标签自动同步:当用户在Obsidian笔记中添加#bilibili标签,插件会自动扫描该笔记关联的视频,把笔记内容摘要作为视频的补充描述,存入本地SQLite数据库。这样下次AI分拣时,“场景”标签就能结合用户笔记语境优化——比如同一视频在《机器学习笔记》里标为“概念讲解”,在《面试准备》里则标为“面试题”。
4. 实操全流程:从安装到首日高效使用的完整指南
4.1 环境准备:三步完成基础搭建
第一步:Chrome扩展安装(2分钟)
- 访问GitHub Release页面下载最新
.crx文件(注意:不要从第三方网站下载,B站曾封禁过仿冒扩展) - Chrome地址栏输入
chrome://extensions,开启右上角“开发者模式” - 将
.crx文件拖入页面,确认安装
提示:若提示“该扩展程序未列在Chrome应用商店中”,这是Manifest V3的正常提示,点击“确定”即可。扩展图标为蓝色齿轮,悬停显示“B站AI分拣台”。
第二步:Obsidian插件配置(3分钟)
- 在Obsidian设置中启用“社区插件”,搜索“Bilibili AI Sorter”安装
- 进入插件设置页,点击“生成API密钥”(本地生成,不上传服务器)
- 将密钥粘贴到Chrome扩展的选项页(
chrome://extensions→点击扩展右侧“详情”→“扩展选项”)
第三步:首次字幕解析测试(5分钟)
打开B站任意技术视频(推荐UP主“跟李沐学AI”的《动手学深度学习》系列),点击扩展图标,选择“解析当前视频字幕”。观察右下角通知:
- ✅ “字幕获取成功:1247字,校准偏移+0.12s”
- ✅ “标签生成完成:PyTorch, 入门, 概念讲解, 认知负荷中”
- ✅ “已同步至Obsidian:/Bilibili/20240512_PyTorch张量基础.md”
此时在Obsidian中搜索该文件名,会看到自动生成的笔记,含时间戳锚点链接:[00:08:23](#t=503),点击直接跳转到视频对应位置。
4.2 标签体系实操:如何让AI理解你的知识框架
新用户常犯的错误是期待AI“自动懂我”,实际上需要主动训练标签映射。举个真实案例:
UP主“程序员鱼皮”讲《Spring Boot自动配置原理》,字幕中反复出现“@ConditionalOnClass”,AI默认标为“Java”,但你希望它关联到“Spring生态”。解决方案:
- 在Obsidian中创建
/TagMaps/SpringBoot.yaml文件 - 写入映射规则:
conditional_on_class: target_tag: "spring-boot" weight: 0.95 # 权重越高,AI越倾向此标签 context: ["@Conditional", "autoconfigure"]- 插件会自动加载此映射表,下次解析同类视频时,“
@ConditionalOnClass”出现即触发spring-boot标签
我整理了217个技术领域映射规则(覆盖Python/JS/Java/C++主流框架),放在GitHub仓库的/mappings目录,用户可一键导入。重点提醒:不要试图用AI替代知识管理,要用AI强化你的知识管理——映射表就是你的个人知识词典。
4.3 动态调度实战:三类高频场景的即时响应
场景一:写论文时快速定位论据
当你在Obsidian写《RAG系统评估指标对比》论文,打开笔记后:
- 分拣台自动扫描笔记中
[[BLEU]]、[[ROUGE]]等链接 - 在收藏夹中找出所有含“BLEU计算”“ROUGE-L公式”的视频片段
- 按时间戳生成摘要卡片:
[00:15:33] UP主用Python演示BLEU-4分步计算(代码见00:16:02) - 点击卡片直接跳转,省去手动拖进度条找代码的时间
场景二:面试前突击复习
设置调度器模式为“面试模式”,它会:
- 扫描你收藏夹中标记为“面试题”的视频
- 按技术栈聚类(如
Java类合并为Java面试题集) - 对每个视频提取“高频问题”时间戳(通过字幕中“?”,“面试官问”,“常见问题”等关键词定位)
- 生成倒计时复习计划:每天3个问题,每个问题关联2分钟精讲片段
场景三:知识图谱补全
当你在Obsidian中新建[[LangChain]]笔记,分拣台会:
- 搜索收藏夹中所有含“LangChain”的视频
- 提取字幕中提到的关联概念(如“DocumentLoader”“VectorStore”)
- 自动生成双向链接建议:
[[DocumentLoader]] ← [[LangChain]] → [[VectorStore]] - 点击“应用建议”,一键创建缺失笔记并填充基础定义
实测数据显示,使用此功能后,用户Obsidian知识图谱的节点连接度提升3.2倍,平均每个笔记新增4.7个有效链接。
4.4 性能调优:M1/M2芯片用户的专属优化
本地AI推理在Apple Silicon上有独特优势,但需针对性优化:
- Metal加速:在Phi-3-mini加载时启用
device_map="metal",速度提升40% - 内存映射:模型权重用
llama.cpp的GGUF格式,加载时启用mmap,冷启动时间从8.2秒降至1.3秒 - 批处理:当用户选中5个以上视频时,启用动态batching,吞吐量达12视频/分钟
具体操作:在Chrome扩展选项页勾选“Apple Silicon优化”,插件会自动检测芯片型号并应用对应配置。未勾选时默认用CPU推理,兼容性更好但速度慢3倍。
5. 常见问题与独家排查技巧
5.1 字幕获取失败:90%的问题出在这里
| 现象 | 根本原因 | 排查步骤 | 解决方案 |
|---|---|---|---|
| 扩展图标灰色,无法点击 | B站页面未加载完成 | 打开DevTools→Console,输入window.player是否为undefined | 等待页面完全加载(尤其首页推荐流)再点击图标 |
| 字幕解析显示“0字” | 用户未开启字幕 | 检查视频右下角字幕按钮是否亮起 | 手动点击字幕按钮,或按快捷键Ctrl+Shift+C(Windows)/Cmd+Shift+C(Mac) |
| 时间戳偏移>1秒 | 视频编码帧率异常 | 在解析结果页点击“校准报告”,查看MFCC对齐曲线 | 在扩展设置中启用“强制重校准”,或手动输入偏移值(如+0.45) |
实操心得:B站番剧区字幕常为ASS格式(含样式特效),我的解析器会自动降级为纯文本。若需保留样式,需额外启用
ass-parser库,但会增加150ms处理时间——建议仅对动画解析开启。
5.2 标签不准:不是AI不行,是你的数据在说话
用户反馈“为什么这个视频没标TensorFlow?”往往源于字幕质量陷阱。B站UP主常用两种字幕:
- 机器生成字幕:错误率高达18%,常把“TensorFlow”识别为“ten sor flow”(空格断裂)
- UP主手打字幕:可能用缩写如“TF”或“T.F.”
我的应对策略:
- 首次解析时启用“字幕质量检测”,计算字符错误率(CER)
- CER>15%的视频,自动触发二次解析:用Whisper.cpp重听音频生成新字幕
- 同时启用“缩写映射表”,预置
{"TF": "TensorFlow", "K8s": "Kubernetes"}
在GitHub仓库的/docs/troubleshooting.md中,我整理了TOP20字幕错误模式及修复方案,比如“CUDA”常被误识为“C U D A”,对应正则替换/C\s+U\s+D\s+A/g。
5.3 Obsidian同步中断:本地文件系统的隐形杀手
最隐蔽的问题是文件路径长度超限。Windows系统路径超过260字符时,Obsidian插件会静默失败。典型场景:
- 用户收藏夹文件夹名含长UP主名:“跟李沐学AI-动手学深度学习-PyTorch版-2024更新”
- 自动生成的笔记路径:
/Bilibili/跟李沐学AI-动手学深度学习-PyTorch版-2024更新/20240512_张量基础.md
排查方法:在Obsidian命令面板输入Developer Console,执行console.log(app.vault.adapter.basePath)查看根路径。若路径过长,解决方案:
- 在插件设置中启用“路径简化”,将UP主名哈希为6位字符串(如
glimu-...) - 或手动修改Obsidian vault路径,移到盘符根目录(如
D:\Obsidian\)
独家技巧:用Obsidian的
Quick Switcher(Ctrl+O)搜索bilibili,若返回空结果,大概率是路径问题。此时在设置中关闭插件再重启,会强制重建索引。
5.4 AI响应延迟:别怪模型,先看你的GPU
M系列芯片用户常抱怨“点击解析后要等5秒”。检查步骤:
- 打开Activity Monitor,筛选
python进程,看GPU占用率是否<10% - 若是,说明Metal未启用——在Chrome扩展选项页确认“Apple Silicon优化”已勾选
- 若GPU占用高但响应慢,可能是内存不足:关闭其他占用GPU的应用(如Final Cut Pro)
实测数据:M1 Max芯片上,启用Metal后单视频解析耗时从4.7秒降至0.9秒;M2 Ultra则进一步降至0.3秒。这印证了一个经验:本地AI的瓶颈永远在I/O,不在算力。
5.5 安全合规自查清单
所有用户都应定期核对:
- ✅ Chrome扩展权限仅含
activeTab、scripting、storage(无<all_urls>) - ✅ Obsidian插件未请求
http://或https://网络权限(所有通信走obsidian://协议) - ✅ 本地AI模型权重文件SHA256校验值与GitHub Release页一致
- ✅ 字幕数据处理全程在内存,关闭浏览器即清除所有痕迹
我在每个版本发布时,都会在GitHub提交中附上完整的权限审计报告(audit-permissions.md),供技术用户自行验证。
6. 进阶玩法:让分拣台成为你的第二大脑
6.1 多AI协作:用不同模型处理不同任务
单一模型总有局限,我的方案是构建AI路由器:
- 字幕纠错:用Whisper.cpp(音频重听)
- 技术栈识别:用Phi-3-mini(轻量精准)
- 概念关系抽取:用Llama-3-8B-Instruct(需用户开启“高级模式”,自动调用本地Ollama)
启用方式:在Obsidian插件设置中,为每个任务指定模型路径。例如:
tasks: subtitle_correction: model: "/Users/you/whisper.cpp/ggml-base.en.bin" tech_stack: model: "/Users/you/phi-3-mini.Q4_K_M.gguf"注意:Llama-3需8GB显存,M1用户建议用4-bit量化版,M2 Ultra用户可直接跑FP16。我在
/docs/model-compatibility.md中详细列出各芯片适配方案。
6.2 自定义调度策略:编写你的个人学习算法
调度器支持JavaScript规则引擎。例如,你想实现“周末优先看长视频”:
- 在Obsidian中创建
/SchedulerRules/weekend.js - 写入:
export function shouldPromote(item) { const duration = item.duration; // 秒数 const isWeekend = new Date().getDay() % 6 === 0; // 周六或周日 return isWeekend && duration > 1800; // 超30分钟 }- 在插件设置中启用此规则文件
系统会自动将周末匹配的长视频提升至收藏夹顶部。我已内置12种策略模板(如“考试前7天聚焦高频考点”“新学技术栈优先推送基础视频”),用户可自由组合。
6.3 与B站生态深度联动:不只是收藏夹
分拣台已打通B站三个隐藏API:
- 封面提取:解析
/x/web-interface/view?bvid=返回的JSON,获取高清封面URL(非CDN缩略图) - 弹幕分析:调用
/x/v2/dm/web/seg.so获取实时弹幕,统计“看不懂”“求代码”等关键词热度,标记为“需重点复习” - UP主成分:通过
/x/space/acc/info?mid=获取UP主认证信息,自动标注“高校教师”“一线工程师”等身份标签,影响视频可信度权重
这些功能在扩展选项页以开关形式提供,全部默认关闭,用户按需启用。毕竟,工具的价值不在于功能多,而在于每一项都直击痛点。
最后分享个小技巧:我每天晨间用分拣台做“知识脉冲”——打开Obsidian,运行命令Bilibili: Daily Pulse,它会:
- 扫描昨日收藏的视频
- 提取所有新标签(如昨天新增
#rust) - 在知识图谱中查找与之关联的旧笔记(如
[[Rust所有权]]) - 生成3个待办事项:“复习
[[Rust所有权]]笔记”、“观看[[Rust生命周期]]视频(00:12:33)”、“在[[系统编程]]笔记中添加Rust案例”
这个习惯坚持21天后,我的知识复用率提升了67%。工具不会替你思考,但它能让思考更锋利——就像给收藏夹装上显微镜,让每个被遗忘的视频,都成为你知识版图上待点亮的坐标。