← 主页 bgent B站批量「下载→转写→润色→检索」流水线 · 一页看懂

第二部分 · 对「选题」这一步的优化

bgent 主图:B站视频批量变成可检索的本地语料
B站视频 → 本地可检索语料:选题调研的弹药库 · 点击放大 · 滚轮缩放 · 拖动平移

我的工作流里,选题这一步被它优化了:别人的视频批量变成本地语料,新选题先查库——竞品讲过的直接检索对齐、避免自撞车;单条视频给个 BV 号就能总结成结构化笔记。后面照旧讲技术管线,但记住它服务的是选题与竞品调研

红色为第 05 章「BM25 检索」,全系统的能力底座;前三站为它供料,后三节是它长出来的玩法。

01

bgent 是什么

四段管线
一句话:把 B站视频批量变成可检索的本地语料库——抓取 → 转写 → 润色 → 索引。

bgent 是 Bilibili 批量「下载 → 转写 → 润色」工作流,把合集、系列、UP 主视频批量转成可读口播稿,再落成可检索语料。已在两批生产数据上验证:睡前消息 852 条(约 280 小时音频)与峰哥亡命天涯直播回放。

四段管线:列表抓取 → 下载+转写驱动 → 润色子代理 → RAG 语料问答。值得注意的设计:润色稿即语料——转写流水线的最终产物,直接就是检索系统的输入,中间没有任何格式转换成本。

bgent 管线配图:抓取 → ASR转写 → 润色 → 语料化 → BM25检索,服务于选题与竞品调研
配图 · bgent 主流程一页(可编辑源文件:素材源文件/agentdraw/board.agentdraw.json点击放大
整体管线
┌────────────┐   ┌──────────────────────────────┐   ┌─────────────────┐
│ fetch_list │ → │ run_driver(下载+转写流水线) │ → │ 润色子代理       │
│ 列表抓取    │   │ 官方API下载∥faster-whisper   │   │ ASR稿润色技能     │
└────────────┘   └──────────────────────────────┘   └─────────────────┘
                          │                                    │
                          ▼                                    ▼
              ┌───────────────────────────┐        ┌──────────────────────┐
              │ rag 语料库                 │ ←───── │ 润色稿即语料          │
              │ 分块 → jieba → BM25Plus   │        └──────────────────────┘
              └───────────────────────────┘
                     │  query 返回 top-k 片段(带来源文件)
                     ▼
              合订本问答 / 赛博克隆扮演 / 选题 · 竞品调研
02

第一站 · 抓取

官方 API · WBI 签名
一句话:yt-dlp 被风控到 412,就绕开它——直接调官方 API 拿 DASH 音频流

踩坑起点:住宅 IP 下 yt-dlp 的 Bilibili extractor 请求指纹被风控,下载 formats 一律 HTTP 412,Chrome UA、Referer、指纹 cookie 全无效。解法:绕开 yt-dlp,直接调官方 API——view → wbi 签名 playurl → DASH 音频流。只下音频不下视频,流量和速度都划算。

签名细节:playurl 的 WBI 签名参数名是 wbi_sign;但 arc/search 必须用 w_rid——同名不同接口,用错直接 -403。合集列表端点被网关路径级拦截(返回 404 反爬页,与参数无关),改用 arc/search 全量投稿 + 标题过滤。

多 P 与风控:直播回放常分 P 上传,逐 P 下载后 ffmpeg concat 拼接——concat 列表必须写绝对路径,否则「找不到文件」;流拷贝失败自动回退重编码。登录 cookie 每小时重读,两次下载间隔 --pace 节流,温和防风控。

抓取链路配图:合集页/系列页/UP空间 → arc/search → view 视频信息 → playurl 音频流 → 拼接落地
配图 · 抓取链路(可编辑源文件:素材源文件/agentdraw/board-fetch.agentdraw.json点击放大
抓取链路
合集页 / 系列页 / UP 空间
  → arc/search(w_rid 签名)或 seasons_series_list 预览(前 ~6 条)
  → view 接口取视频信息(标题 / 分 P / 时长)
  → playurl(wbi_sign 签名)拿 DASH 音频流
  → 逐 P 下载 m4a → ffmpeg concat(绝对路径)
  → .b2t/downloads/{bvid}.m4a
03

第二站 · ASR 转写

faster-whisper
一句话:faster-whisper small 批量转写,单 worker 约15—19 倍实时,产出带时间戳的原文稿。

模型与速度:faster-whisper small(float16, beam=2),比 openai-whisper 快约 2 倍。权重从 ModelScope 拉本地副本——HF 直连被墙,hf-mirror 对新 xethub CAS 存储返回 401,ModelScope snapshot_download 是实测可用的路径。

性能调优反直觉:GPU 上保持 1 个 worker。3 个 whisper worker 在单进程里争 torch 线程池 + 显存,GPU 利用率只有 ~36%;实测 1 worker × 8 线程最快,多 worker 吞吐反而下降。

工程细节:驱动断点续跑——重复执行同一命令即可继续(driver_state.json)。收尾必须在队列排空后再发 stop 哨兵、worker 只在哨兵处退出;若在循环条件里检查 stop,最后一条 2—4 小时的长视频转一半就被杀。

转写产物配图:转写引擎产出原文稿、字幕、元数据、断点四类落盘
配图 · 转写产物(可编辑源文件:素材源文件/agentdraw/board-transcribe.agentdraw.json点击放大
转写产物
faster-whisper small(float16, beam=2),1 worker × 8 线程
  → .b2t/transcripts/original/{标题}-{时间戳}.txt   转写原文稿
  → 同名 .srt                                     带时间戳字幕
  → .b2t/metadata/{标题}.json                     元数据
  → runs/<run名>/driver_state.json                 断点(可续跑)
04

第三站 · 语料化

润色 · 分块 · jieba
一句话:ASR 稿先润色成可读口播稿,再按 1000 字切块、jieba 分词,落成索引语料。

润色:ASR 原文稿没标点、同音错字多,交给润色子代理(prompt 模板 + ASR 润色技能):分段、补中文标点、修明显同音错字;直播口语保留口语风格,不确定的专有名词和数字保留原文、不联网考证——转写稿能读,才有资格当语料。

分块chunk_text(size=1000, overlap=100),块界优先落在段落边界(\n\n),其次句子边界(。!?;)——保证召回的是完整语义单元,overlap 让跨块内容不丢。

分词与指纹:jieba 分词 + 可加载用户词典(人名、栏目黑话),分词质量直接决定 BM25 命中率。文件指纹(名称|大小|mtime 的 sha1)判定索引过期,query 时自动重建——语料目录加个新文件就能搜,不需要手动 rebuild。

分块 + 分词(raglib.py 核心)
# 分块:1000 字/块,块间重叠 100,优先段落边界、其次句子边界
for offset, seg in chunk_text(text, size=1000, overlap=100):
    ...

# 分词:jieba Tokenizer(每库独立实例,可加载用户词典)
tok = jieba.Tokenizer()
if user_dict:
    tok.load_userdict(user_dict)          # 如 dicts/睡前消息.txt
tokens = [w for w in tok.lcut(seg) if w.strip()]

# 指纹:文件列表的 sha1,变了就自动重建索引
fp = sha1(f"{name}|{size}|{mtime_ns}\n" for f in files)
05

第四站 · BM25 检索

核心
一句话:分词后跑 BM25Plus 本地检索,top-k 召回片段——无向量模型、无 GPU、毫秒级。

原理:rank_bm25 库的 BM25Plus。每个语料块分词进 corpus,查询词分词后 get_scores,取 score>0 的 top-k。经典 TF-IDF 词面匹配;中文场景下,分词质量比检索模型选择更影响效果

为什么不用 embedding:语料是目标博主的全部文字稿,查询是 2—4 个核心名词——词面命中就够用,语义检索没有边际收益,还省掉向量模型与 GPU。索引 pickle 持久化,查询毫秒级。

用法rag list 看库,rag query <库名> "关键词1 关键词2" -k 5 检索;结果不佳就换同义/近义词(房地产 → 房价 楼市 法拍房)多组各检索一次再合并。

BM25 检索(raglib.py)
from rank_bm25 import BM25Plus

bm25 = BM25Plus(corpus)               # corpus: 每个语料块的分词列表
scores = bm25.get_scores(tokenize(query))
ranked = sorted((i for i, s in enumerate(scores) if s > 0),
                key=lambda i: scores[i], reverse=True)[:k]
# 返回 top-k 块:{doc: 来源文件名, score, offset, text}
06

选题 · 竞品调研

单条总结 / 全量检索
一句话:把别人的视频变成可检索的结构化笔记——给一个 BV 号能总结内容,给一个博主能检索观点

单条视频 · 内容总结:给一个 BV 号(或合集链接),bgent 自动走完「解析视频信息 → 检查本地语料库是否已覆盖 → 未覆盖则下载转写 → 通读全文做结构化总结」,输出核心主题、研究脉络、分节要点和结论——选题前花一分钟知道「这条视频到底讲了什么」。示例:BV1viun6rExU《【酷温】跌了22年的日本房价 凭什么回来了?!》,点开看完整总结。

全量竞品 · 观点检索:把目标博主的语料全部抓取索引后,选题雷达就位——新选题先查库:博主是否讲过、讲过几遍、当时的观点是什么,避免自撞车;重复出现的观点簇 = 高置信度的「该博主核心立场」,竞品同质化的选题一眼看穿。

边界:检索能帮「找」、帮「对齐」,不能替「想」;车轱辘话 = 同一观点高频复现,召回时天然高分,反而好找;搬运与版权边界自己把握,工具只负责让内容可检索。

例 · BV1viun6rExU 单视频总结(真实产物)点开查看完整总结页

bgent 单视频总结输出 · 下载转写后通读全文的结构化摘要,下方还有用「彩蛋」提示词生成的真实产物页(9 章拆解 + SVG 图解 + 真实截帧)

视频:《【酷温】跌了22年的日本房价 凭什么回来了?!》

核心主题:用日本房价 22 年下跌史作为「先行参照系」,回答当下中国楼市「是否见底」的问题。

1 · 引子:楼市唱多信号:近期市场出现成交量降幅收窄、日光盘重现、部分城市连续同比上涨、开发商抢地等现象,博主被问「楼市调整是否结束了」,决定用日本经验做参照。

2 · 研究方法:用 AI 研究助手(深度调研模式)做三步研究——梳理日本房价史与国民经济状况、与当下中国对标、构建楼市情绪监控「温度计」。

3 · 日本房价的完整轨迹

  1. 1985 年广场协议:日元被迫升值,日本央行降息(贴现率 5%→2.5% 并趴了 27 个月),便宜钱涌入股市和楼市——广场协议不是衰退起点,反而是房价暴涨的起点。
  2. 泡沫顶峰:5 年内土地资产膨胀到 2389 万亿日元(GDP 的 3 倍);1991 年全国平均地价见顶(约 59.1 万日元/㎡)。
  3. 刺破泡沫:1989–1990 年连续加息(贴现率加回 6%),鹰派总裁三重野康主动刺破泡沫(「长痛不如短痛」);叠加限制房地产贷款增速、1991 年地价税立法(3% 国税)——日本版「三道红线」。
  4. 崩塌:1992 年六大城市地价指数跌 76%;到 2005 年全国地价连续 14 年下跌,住宅用地较 1991 年累计跌 46%。
  5. 两次反弹都被打断:1996–97 年短暂平台期,因亚洲金融危机 + 消费税 3%→5% 再度下跌 60 个月;2002 年首都圈见底后又遭遇 2008 年金融危机。

4 · 中国对标结论

  1. 从时间跨度看,当下中国最像日本 1995–1997 年前后的平台期(第一轮大跌后的企稳窗口),而日本该平台期只维持了不到两年。
  2. 但中日有重要不同:中国没有经历过暴力加息刺破泡沫;泡沫程度没那么极端;政府管控力更强——这些是利好因素。

5 · 楼市温度计(个人决策工具):8 个维度打分(基本面:销售、拍地、房价,取 15 年数据;宏观:房企估值、基金持仓、ETF、研报、政策);历史分位法打分(1–5 分)换算温度,并做通胀调整。当前结果:11 度(初春微凉)——全国仍在冬天,一线城市和政策面已吹起春风,买方议价权仍占优但窗口期在收窄。

6 · 最终结论(三件事)

  1. 泡沫破裂后不是一路跌到底,有阶段性企稳和反弹,但企稳≠走出下跌逻辑
  2. 见底过程不同步,核心区抗跌属性远大于三四线。
  3. 能否扛住外部冲击、能否恢复内需,是房价变化的最大变量。

给个体的建议:与其等「大底」确认,不如关注议价权变化——当前温度 11 度,买房窗口还在,可自行用类似工具持续跟踪。

完整总结页(真实产物 · 9 章拆解 + SVG 图解 + 截帧,可滚动查看):

彩蛋 · 把这段提示词复制给 agent,它就能复刻「视频总结」能力点开查看 · 一键复制

不带 bgent、不带语料库也能用:复制后粘贴给任意 agent,喂一个视频链接或本地视频文件,即可得到一份「抓取 → 转写 → 拆章 → SVG 图解 → 真实截帧 → 离线单页」的完整视频总结。

流程:用 yt-dlp 结合 cookies 抓完整元数据,B 站尽量保留标题、UP、分 P、简介、标签、封面、时长等信息;下载最佳音频转 mp3,用 ffprobe 校验时长,和元数据差异超过 5% 就重下或标记异常。用 Whisper 转写,中文用 turbo zh,英文用 small.en 并翻成中文;校验最后一个 segment 的结束时间和音频时长是否接近。

内容上,按视频自然结构拆章。每章要提炼问题、陷阱、步骤、结论,写成白话短句;带可回跳视频的时间戳、要点、关键引用、视觉锚点。不要机械套固定模板,按内容组织页面。

SVG 必须随章节内容动态生成:流程就画步骤/路径,概念就画关系/分层,时间变化就画时间线,对比就画矩阵,风险误区就画检查表/决策树,数据就画简图,因果就画链路。每张图都要来自本章真实内容,包含关键词、关系、箭头或标签,不能做装饰图或重复套壳。

界面或操作演示类视频(画布、控制台、剪辑器、文档),每章在 SVG 之外再配一张视频里抽的真实帧:从该章时间段挑信息量最大、界面最清晰的一帧,用 ffmpeg 精确抽帧(-ss 定位、-q:v 1 最高质量),文件名带阶段名和秒数;长视频先分片并行抽帧拿候选再定时间戳导出。页面里每章按「正文 → SVG 图解 → 真实截图」排,图解讲关系、截图给实证;图片走相对路径和 HTML 放一起,离线也能看,SVG 说明标「图解」、截图说明标「视频时间戳」一眼分开。

最后生成可离线打开的单页 HTML,内联 CSS 和 SVG、真实截图走相对路径引用;用 Chrome headless 截整页 PNG,读取图片检查渲染、重叠和空白,确认每段 SVG 和截图都正常显示,再用 ffmpeg crop 切图,切片保留约 100px 重叠,避免切断标题。
07

合订本 · 睡前消息

852 条 · 280 小时
一句话:852 条、约 280 小时音频 → 700+ 期可检索文字稿;「马督工对房地产怎么看」从翻视频变成一条命令

把睡前消息合集全部抓取、转写、润色,落成合订本语料库——【睡前消息1000】身后是一千,小目标是一万.txt 式命名,期号即来源锚点。语料库可随时注册新库(rag add),新 run 的润色稿合并进既有库即可被检索。

问答协议是简报式:结论先行 1—2 句 → 按观点/主题分点 → 每点标注来源期号;只引用检索到的内容,不得编造,覆盖不足就明说、建议换关键词。合订本的意义:从「记得哪期讲过但找不到」变成「检索一句话」。

例 · 马督工怎么看中国的房地产政策?点开查看完整回答

结论:马督工对中国房地产政策的立场是一贯的——现行以「卖地财政」为核心的体系不可持续,放松限购、托底救市都是治标不治本的后视镜操作;唯一的根本解药是全面开征房产税,用「按房收税、按人补助」替代土地财政。他对房价本身不抱幻想,认为人口才是决定房价的终极指标。

核心观点分述

  1. 土地财政是「贪吃蛇」,必然走向崩盘:卖地财政体制下,政府土地经营「就像一条贪吃蛇,总是由新增的头部带动越来越长的尾巴,每块新卖出的土地价格都要比上一块高,否则土地财政就要崩盘」——而保证新地值钱的前提是全市房价都涨,这不可持续(【睡前消息415】业主众筹20亿修地铁)。房价一停止上涨,地方就暴露原形:发消费券、放松限购、奖励购房(【睡前消息370】烟草销售"止跌回升")。
  2. 房产税是唯一解药,且要全面征收:他的主张非常具体——「要收房产税,全面收房产税,不设任何的免征起点,用来承担地方政府的公共服务成本」;交税吃不上饭的人政府给低保,「税是针对房子收的,低保是对人发的,完全是两条线」(【睡前消息876】从村到省,都在保交楼)。他反对一切税收豁免——豁免就是给逃税开漏洞;韩国的教训是房产税必须有足够力度、不能滥用免税(【睡前消息305】韩国发现金属活字)。「我希望房产税早点来,尽早结束这种政府和业主都急于变现的地产经营模式」(415)。
  3. 房产税对房价必然是负面影响,但它本来就不是为保房价设计的:100 万的房子按 1% 税率每年交 1 万,利率 4% 时房主必须降价对冲;短期会刺破泡沫、造成动荡,「但是高房价本来就让社会付出了更大的代价」(【睡前消息118】《后浪》过后)。从政策定位看,房产税是共同富裕框架的一部分:不能给企业加税、又不想让普通公民多承担,只能在公民内部调整税收压力——「财产差异最高可达上亿倍,消费差异只有几千倍」(【睡前消息345】一周前的权威文件,预告了房产税定位)。
  4. 托底救市都是「孤注一掷」,且他不看好:郑州房价腰斩时政府「孤注一掷,只能把所有刺激政策一次性甩出来」——但根本变量是常住人口:城市化率接近三分之二后,城市只能互相抢人(【睡前消息429】第二次打败"鬼城")。青岛打折房他表态「策略上我不支持,但既然已经做了,我很乐意观察这场社会实验」(【睡前消息564】对小银行放手,对房价也放手)。
  5. 保交楼问题上政府已失职:城中村自己出钱保交楼「已经是政府失职了」,再向城中村借钱会引发不可控混乱;而且全省一盘棋保交楼必然互相冲击销售周期,先完工的楼盘冲击后完工的(【睡前消息876】)。对万科式自救,他的态度是认可按市场规律处置——万科一年半处置 2800 亿资产、「不会虚构故事像恒大那样拉人下水」,是相对体面的自救(【睡前消息984】深圳救不救万科)。
  6. 警惕一线城市空心化风险:深圳房价逆势上涨、租售比全国倒数第二,「香港化还很遥远,但也必须提高警惕」——香港当年也是工业城市,一代人以后就完全空心化了(【睡前消息111】深圳房价这样涨下去)。
08

赛博克隆 · 扮演模式

召回 + 模仿
一句话:召回本人的原话片段,提炼语气与观点后用本人口气作答——像活人,不像 AI 客服。

五步流程:检索(人物名 + 话题词,必要时多组同义词各检索一次)→ 区分「本人的话」与「他人的话」(弹幕、观众提问、嘉宾、引用的新闻都不得算作本人观点)→ 提炼立场倾向 + 语气特征(口头禅、句式、说话节奏、常用比喻、金句风格)→ 用本人口气直接作答——口语化、松散、有反问、有自我调侃,不编号分点、不总结陈词、不中途标来源 → 作答后与原始语料并排比对自检,不像就重写。

红线:立场必须来自语料,语气可自然延展——严禁让克隆说出语料支撑不了的观点;借用语料里的原句、金句、比喻往往最像本人。

示例:「峰哥,你怎么看25岁结婚」→ 召回峰哥直播片段(「离婚,不用争论了,直接离婚吧」「年轻人,你一定要有主见」)→ 用他的反问连击、口语金句、损人式关心作答。酷温(财经类)等 run 也已跑过,同一套流程可以对任意目标博主做克隆。

例 · 峰哥,我考研3年了,还没考上,你说我应该去找个班上吗?点开查看完整回答 · 点击段落播放峰哥语音

扮演模式输出 · 检索峰哥语料后以本人口气直接作答:不编号分点、不总结陈词、不中途标来源|悬停段落可试听 TTS 语音

考了三年▶ 播放?那我先问你,你考研是为了啥?为了找个好工作呗?我跟你说实话,现在考研更不好找工作,研究生出来该失业还是失业。你随便看看,本科的白领,四五千的工作都不好找,全被 AI 替代了,你研究生能强到哪儿去?强不了多少,能不能找个工作都两说。

你说你三年没考上▶ 播放,我反倒觉得这是老天爷在帮你——你在这棵树上吊了三年,它愣是没让你吊死,说明啥?说明这路跟你没缘分,它在撵你去干点别的。

你听我的▶ 播放,别考了,去找班上,去学门手艺。现在啥最值钱?技能。焊个接、修个电路板、开个叉车,出来八千九千的工作,比你念完研究生坐办公室强多了。现在蓝领比白领好混,这是大势所趋,国外都这样,国内也躲不过。你与其再考一年赌一个「万一」,不如先挣着钱,边干边想。

再说了,你想想▶ 播放你为啥想考上——是你自己想上,还是你爹妈想让你上?你爹妈砸锅卖铁供你三年,那是他们的谈资,是他们下半辈子跟人吹的资本,不是你的日子。你今年25了,你还打算考到30?你考上了又咋样?研究生出来也是打工,打工哪有容易的?上班本来就是打工,大家都一样,谁也别笑话谁。

实在不行,你还年轻▶ 播放,做做自媒体,学点东西,搞点副业。我十年前就预言了,以后人人都是自媒体,你看现在是不是?路多了去了,别拿考研当人生唯一的门。

三年了,该换条路了▶ 播放。去挣点钱,把钱挣到手里,你腰杆子就硬了——到那时候你再看,考不考研,屁大点事儿。