bili2txt-agent这个项目,一开始真的只是我自己的“偷懒工具”。每天要在B站刷十几个技术视频,看完就忘,忘了就得从头拖进度条,拖完又忘。后来我干脆把它做成了一条自动流水线:把B站链接丢进去,几分钟后拿到的不是一段干巴巴的字幕,而是一篇带了章节、核心观点、关键术语、金句和视频内时间戳的Markdown笔记。这个项目开源之后,陆续有人来问怎么部署、怎么调参数,以及那个“效率提升300倍”到底是不是噱头。这篇文章我一次性说清楚:设计逻辑、选型过程、实测数据,还有我踩过的坑。
1. 为什么需要它:视频学习的成本大头在“回头找”
1.1 看视频本身不耗时,复习和检索才是
我自己关注的方向比较杂,从系统架构、开源项目解读到某个算法原理,都是B站上的长视频或者系列课。一个20分钟的讲解,第一遍看的时候很爽,思路跟得上,弹幕氛围也好,但关上网页,让我复述核心结论,往往只能说出两三点。于是要么重新拉一遍进度条,好一点的情况是UP主做了章节标记,但章节只到“10:00 第二部分”,并不等于我想找的那个知识点在第几秒。这个“回头找”的过程,实际上比看视频本身更消耗意志力,刷着刷着你就不想找了,学习就断在那里。
这就是立项前最原始的痛点:视频学习链条上,成本大头不是“看”这一步,而是“看完之后怎么把信息再拿回来”。而拿不回来的那些信息,约等于没看。
1.2 已有方案为什么不够用
在选择自己写工具之前,我把当时可行的方案都试过一遍,各有各的难受:
- UP主简介或评论区文字稿:存在率极低。更常见的情况是UP主只放了PPT的链接,PPT和自己讲的内容并不完全对应。
- 视频网站的自动字幕:B站现在有不少视频有AI字幕,复制出来比较容易,但这份字幕没有分段、没有重点,语气词和识别错词非常多,很难把它当成一篇“笔记”来读。要在一堆“嗯”“然后”“这个这个”里找有效信息,一样费眼睛。
- 在线转写平台:有的效果确实不错,但对视频时长有限制,平台审核规则不透明,部分使用场景下用户还会担心数据去向。更关键的是,大部分在线工具只给你一段连续文本,不给你做结构化。
- 手动截图加文字笔记:我只坚持了两个视频就放弃了。截图虽然能精准记录某个画面,但检索还是靠人脑,时间一久照样找不到。
这些尝试让我确认了一件事:大家缺的不是“把视频变成字”的工具,而是“把视频变成一篇能读、能搜、能放进知识库的笔记”的工具。转写只是第一步,结构化才是真正拉开差距的地方。这也是bili2txt-agent在命名里带上agent的原因——它不是一次性转换,而是一条带着判断和整理能力的流水线。
2. 技术选型:音频下载、语音转写、结构化加工,三条线分别怎么定
2.1 为什么选择“音频+转写”而不是“抽帧+OCR”
做这个项目之前,有朋友建议走视频抽帧加OCR的路线,把每一帧里的字幕和PPT文字都识别出来。这个思路对画面信息占比高的视频(操作演示、游戏实况)确实有价值,但对大部分技术和知识类视频来说,信息密度最高的是人声,而不是画面。音频方案的体积优势也非常明显:一个60分钟的视频,文件可能几百MB,但提取出来的音频只有几十MB,后续转写输入更稳定。画面里经常出现的弹幕遮挡、动态水印、UI抖动,都会让OCR结果非常糟糕,而音频转写几乎不受这些干扰。
所以主链路以音频为主,不依赖画面;如果确实需要PPT截图做上下文补充,可以在结构化阶段按章节把视频切成关键帧,作为辅助信息而不是主输入。
2.2 语音转写选本地模型还是云端API
这是整个项目里最需要权衡的部分。两类我都用过,用一张表说清楚:
| 对比项 | 本地开源模型 | 云端API |
|---|---|---|
| 中文口语准确率 | 良好,接近可用 | 更高,多人对话和背景音更稳 |
| 成本 | 免费,只要有算力 | 按时长计费,长视频累加不便宜 |
| 隐私 | 数据不出机器 | 数据出本机,需了解平台规则 |
| 速度 | 有GPU很快,无GPU很慢 | 快 |
| 部署难度 | 中,需要装环境和模型权重 | 低,申请接口即可 |
我的建议是分层处理:个人低频使用,本地模型完全够用,挑一个7B左右规模的中文优化版本就能获得不错效果;如果要做批量或时效性要求高的场景,再考虑API,但请求层一定要加缓存,同一视频不要重复付费。
2.3 为什么结构化必须用Agent而不是固定脚本
转写出来的文本是什么状态,用过ASR的人都有体会:没有标点或标点乱、口语重复、语气词连篇、突然出现完全跑题的一段。如果只写一个脚本,把这段文本塞给大模型让它“帮我整理一下”,结果通常会遇到两个问题:一是上下文长度不够,二是输出不稳定——模型开始自由发挥,把UP主的一句玩笑润色成严肃结论,或者把识别错的技术名词沿着错误方向解释了一大段。
Agent化的做法是把这个过程拆成有状态的小任务串:先按时间戳切段,每一段独立做一个“清洗+要点提取”,拿到每段要点后再做全局章节归纳。每个小任务都有明确的输入输出格式,模型发挥空间被压缩在字段里;上一段提取失败不会导致全文中断;被识别为低置信度的片段还可以优先标记,让人工复查。这个思路很像把一个冗长文档拆开分给多个协作者,每个人只负责一小块,最后再由一个人汇总——可控性比单次大模型调用好太多。
3. 把链接丢进去之后,流水线内部到底做了什么
3.1 输入与任务状态机
用户只需要提供一个B站视频链接,或者一个批量链接列表文件。程序启动后,每个链接进入任务队列,状态依次为:待处理、解析中、下载中、转写中、结构化中、已完成;任一步失败,进入失败状态并可重试。这里有个我特别坚持的设计:每一步的产物都要落盘。音频、分段文本、每段JSON、最终Markdown,全部独立保存。这样即使跑到一半断电,下次重跑也会从断点继续,而不是把几十个视频从头再来过。
3.2 下载音频:音轨和采样率不能随便
解析链接后,程序调用社区常用的开源下载工具,提取音频流并转为WAV格式。B站有些视频存在多音轨情况,如果不指定音轨,可能拿到没有讲解的伴奏轨,转写结果就是一堆音乐和现场声。所以下载阶段强制指定含语音的轨道,下载后统一检查采样率,重采样到16kHz。这个16kHz不是随便定的,语音识别模型大多按16kHz训练,喂入更高采样率不会提高准确率,反而增加计算量。
另一个容易踩的坑:B站部分视频需要登录凭证才能下载到高质量音轨,未登录只能拿低码率,背景一吵转写错误率直线上升。项目里预留了凭证配置入口,使用时要留意请求频率控制,不要高频调用,避免触发平台风控。
3.3 转写策略:切分、并行、拼接
长音频直接喂给模型,一是容易在30分钟以后出现句尾丢失,二是显存压力大。我的做法是先用静音检测把音频切成30到60秒的片段,片段之间保留1秒重叠,避免在音节中间切断导致语义丢失。切好的片段走并发转写队列,GPU资源紧张时自动降低并发。转写完成后按原时间戳顺序拼接,并记录每句话对应的起始时间。
这里有个细节可以分享:切分时不要直接均匀按秒切,最好用静音检测来切。均匀切一刀可能正好把一句话从中间劈开,模型根本没法猜后半句在说什么;静音检测能基本保证切点落在停顿处,转写质量明显更稳。
3.4 清洗与结构化生成
清洗阶段会做几件事:删除明显的语气词和重复词、合并过短的句子、对常见技术术语做纠错替换。我维护了一份术语纠正表,比如某些模型经常把某个框架名识别成常见普通词汇,这种表可以在配置里自定义,不同领域的用户能往里面加自己的词。
结构化阶段采用两级聚合。
第一级,对每一段转写文本单独调用大模型,输出片段级字段:段落小标题、核心观点、出现的关键术语、值得摘录的句子。
第二级,把所有片段的结果汇总,再次调用大模型,生成全文章节结构与总览摘要。
这里放一个参考提示词骨架,实际项目里可以按需调整:
你是一名擅长整理技术视频内容纪要的助手。 输入是某视频片段转写文本,请输出JSON: { "segment_summary": "不超过50字的片段概述", "key_points": ["要点1", "要点2"], "terms": [{"term": "术语", "explanation": "一句话解释"}], "quotes": ["金句原文,必须来自转写文本,不得改写"] } 注意:不得补充转写中不存在的技术事实; 如发现疑似识别错误,在terms中额外标注"需人工确认"。这个提示词的关键在于“不得补充事实”和“金句必须来自原文”两条约束,能大幅减少模型幻觉。
3.5 输出长什么样
最终输出的是一个Markdown文件,结构大致如下:
# 视频标题 > 视频链接、总时长、转录耗时 ## 一、核心结论 ## 二、章节结构与时间索引 - 01:23 第一章:背景与动机 - 12:40 第二章:核心方案 - 25:16 第三章:实现细节 ## 三、关键术语表 ## 四、金句摘录 ## 五、行动项带时间戳索引是非常有用的设计,想回看原视频某段时,直接按时间点跳转,不用整片重播。
4. “300倍”是怎么测出来的:实测数据、计算口径与边界
4.1 人工基线怎么测
为了这个数字不被吐槽是拍脑袋,我拉着几位同事做了一次小范围实测。选了三个不同类型的中长视频:一个58分钟的技术分享、一个32分钟的软件教程、一个45分钟的行业讲座。每人用自己习惯的方式,边看边记笔记,整理成一份结构化笔记。结果是:
| 视频时长 | 人工整理耗时 |
|---|---|
| 58分钟技术分享 | 约75-90分钟 |
| 32分钟软件教程 | 约40-50分钟 |
| 45分钟行业讲座 | 约55-70分钟 |
可以看到“看视频20分钟,整理笔记翻倍”其实是相当常见的比例。
4.2 自动流水线耗时
还是这三条视频,走本地模型加两级结构化的完整流水线,环境是普通工作站配一块中高端消费级GPU,单条结果:
| 阶段 | 耗时 |
|---|---|
| 下载音频 | 4-6秒 |
| 语音转写(58分钟视频) | 约3-4分钟 |
| 清洗+结构化 | 约10-20秒 |
单条端到端大约3.5到4.5分钟,相比人工的60到90分钟,已经是20倍以上的提升。
4.3 为什么批量场景能到300倍
单条只有20倍,为什么宣传口径是300倍?因为实际使用中几乎不会一次只处理一个视频。当我一次性丢进10条视频时,转写队列把GPU占满,下载和转写、清洗和结构化在不同任务之间形成流水线重叠,10条视频的总耗时从单条累加的40分钟压到约6分钟。另一边,人工处理10条视频需要600分钟起步。600比6,正好是100倍;如果再把“后续检索回看”的时间算进去——有了结构化笔记,找某句话从平均10分钟降到10秒以内——综合效率拉到300倍并不夸张。
所以在项目文档里我特意写明:300倍是批量场景加检索复用的综合口径,单条视频通常只有20到50倍。不写清楚边界,宣传数字反而会伤害项目可信度。
5. 开发和实测里踩过的五个坑,以及对应的处理方案
5.1 音轨选错,转写出“无声讲解”
第一个版本上线后,有次批量任务转写完发现大量文本是音乐描述和环境音。排查下来发现那个视频是多音轨,下载工具默认选了“完整音轨”,里面其实是伴奏。解决方式是在下载参数里强制指定含语音的轨道,同时下载后做一次能量检测,对长时间无语音的音频段直接标记告警。
5.2 长音频不切分:显存和准确率双重崩溃
早期调试时直接拿60分钟音频喂模型,运行到约第40分钟时程序崩溃,重试后虽然跑完,但后半段文本错误明显增多,这就是“句尾丢失”现象。后来切成片段并加重叠后,后半段质量恢复正常,内存占用也稳定在一个可控范围。这个经历让我确认了切分策略不是优化项,而是必选项。
5.3 大模型会把识别错的名词“圆”回去
转写阶段把某个框架名识别错了,结构化阶段大模型没发现,还顺着错误名词给出了一个合理的解释。这种幻觉很隐蔽,不仔细核对根本发现不了。处理办法是在提示词里加“不得补充转写文本中不存在的技术事实”,并单独增加一个“术语验证”环节:把抽取出的术语列表和原始转写文本逐一对齐,不一致的标为需人工确认。
5.4 长文上下文的token限制
结构化第一版实现是直接全文塞给模型,很快就碰到上下文超限,错误信息一波接一波,重试后整个任务陷入死循环。后来改成两级聚合,每一段的上下文都很短,最后汇总时也只处理片段级摘要,问题就消失了。这里要特别提醒:不要迷信“模型上下文窗口大”就随手塞全文,窗口大只是上限,不是质量保证;小任务小上下文,输出质量通常更稳定。
5.5 没有断点续传,批量任务一崩全废
一次处理20个视频,跑到第18个崩溃,又因为没有落盘,全部重来。这个教训让我把“每一步产物都落盘”写成了项目铁律。现在每个任务都有独立的中间目录,重新运行时自动跳过已完成步骤。对任何处理长耗时任务的工具来说,这个设计都值得在一开始就做好,而不是出问题后再补。
6. 可以往哪些方向扩展:从个人笔记到团队知识流水线
6.1 定时增量处理订阅列表
很多人其实有稳定的关注UP主列表。可以配置一个订阅清单,定时检查新更新的视频,自动把新内容转成结构化笔记。这样一个月下来,你不需要打开B站,也能持续积累一批可检索的笔记内容。对做技术追踪、行业调研的人来说,这个用法比手动逐条跑更有长期价值。
6.2 接入本地知识库
生成的Markdown本身是结构化数据,非常适合接入本地文档检索和向量化索引。笔记里的章节、术语、金句都带语义边界,向量化效果比纯文本好。接入后可以做到用自然语言问一个问题,返回对应的视频片段和时间点,直接把被动记录升级为主动问答。
6.3 双语对照与字幕增强
有些视频我会需要双语对照文稿。流水线的中间产物,也就是带时间戳的分段文本,其实已经具备生成双语字幕的条件,接一个翻译步骤就能输出带时间轴的双语文稿。同样可以生成标准字幕文件,给本地播放器或剪辑工具用。这个扩展几乎没有额外成本,因为转录的结构化中间产物都还在。
最后聊一点个人体会。做这个项目最大的收获,不是省了多少时间,而是让我重新理解了“处理信息”和“消化信息”的边界。机器可以把一个小时的视频压缩成几百行字,但它替你省下的不是“思考”这一步,而是“找”和“翻”这些纯体力劳动。真正的学习还是得自己去读那份笔记,去追问那些术语。我建议所有想用这类工具的人,把它当成信息预处理,而不是学习外包。批量跑完笔记之后,抽半小时把关键章节读一遍,效率才是真的高。