开发者 · B站
B站视频转文字 API:一个请求拿到带时间的逐字稿
简单说:POST 一条 B 站链接(bilibili.com/video/BV… 或 b23.tv 短链),返回 JSON:带开始秒数的口播逐字稿(语音识别,没有 CC 字幕也行)、 要点(每条附原文引用)、标题、UP 主、标签和点赞收藏数。只要文案每开始 2 分钟 1 积分,10 分钟视频 5 积分(约 ¥0.72); 一个系列用批量接口一次读完。不用下载视频,不用登录 B 站。
Python · 实测
一节 87 分钟的论文精读课
2026-11-09 对线上接口原样跑了下面这段代码。这条视频(跟李沐学AI「Transformer论文逐段精读」,87 分 05 秒)之前有人按逐字稿优先读过, 所以这次 0 积分、直接拿到那一份:语音全长 87 分 05 秒都转了,470 段、约 3 万字,每段带开始秒数;15 条要点里 13 条的原文引用在视频里逐字找到;另有 28 段截帧读出的画面文字(论文页面)。 第一次读这条,只要文案是 44 积分。
import os, time, requests
API = "https://linkdigest.dev/api/v1/digest"
H = {"Authorization": f"Bearer {os.environ['LINKDIGEST_API_KEY']}"} # 控制台 → API 密钥
def bilibili_to_text(url, depth="script"):
r = requests.post(API, headers=H, json={"url": url, "depth": depth}, timeout=60)
while r.status_code == 202: # 长视频先回 202 和 jobId,用同一个 jobId 取,不要重新提交
time.sleep(5)
r = requests.get(f"{API}/{r.json()['jobId']}?wait=20", headers=H, timeout=60)
r.raise_for_status() # 402 积分不够 · 422 读不了 · 503 平台拒绝:都不扣积分
return r.json()
d = bilibili_to_text("https://www.bilibili.com/video/BV1pu411o7BE")
print(d["title"], "·", d["duration_seconds"], "秒 ·", d["credits"], "积分 · cached =", d["cached"])
for seg in d["transcript"][:3]:
t = int(seg["t"])
print(f"[{t // 60:02d}:{t % 60:02d}] {seg['text'][:40]}")输出(原样)
Transformer论文逐段精读【论文精读】 · 5225 秒 · 0 积分 · cached = True [00:00] 大家好,今天是我们论文精读系列的第三篇文章,我们将讲的是Transformer这 [00:10] 这篇文章可以认为是最近三年以来深度学习里面最重要的文章之一。 [00:15] 它可以认为是开创了继MLP、CNN和RNN之后的第四大类模型。
分 P · 实测
一整套分 P:从 parts 拼出每一 P 的链接
读分 P 视频的任意一 P,返回里就带着整套的目录:parts.count 是总 P 数,parts.current 是这次读的哪一 P,parts.items 里每一 P 有 p、title、seconds(最多列 200 P)。 每一 P 按自己的时长计费,所以读之前就能算出一整套要多少积分。下面这段 2026-11-10 对线上接口原样跑过(李宏毅 2020 机器学习,119 P;读的是 101 秒的 P7,之前有人读过,所以这次 0 积分)。
import math
d = bilibili_to_text("https://www.bilibili.com/video/BV1JE411g7XF?p=7") # 上面的函数
parts = d["parts"] # 只有分 P 视频才有这个字段
print("共", parts["count"], "P · 这次读的是 P", parts["current"])
for it in parts["items"][:3]:
credits = max(1, math.ceil(it["seconds"] / 120)) # 只要文案:每开始 2 分钟 1 积分
print(f"P{it['p']} {it['title']} · {int(it['seconds'])} 秒 · {credits} 积分")
rest = [it["p"] for it in parts["items"] if it["p"] != parts["current"]][:10]
series = [f"https://www.bilibili.com/video/BV1JE411g7XF?p={p}" for p in rest] # 放进下面的批量接口
print("接下来要读", len(series), "条 ·", series[0], "…", series[-1])输出(原样)
共 119 P · 这次读的是 P 7 P1 机器学习 · 2228 秒 · 19 积分 P2 Rule of ML 2020 · 1324 秒 · 12 积分 P3 Regression - Case Study · 4715 秒 · 40 积分 接下来要读 10 条 · https://www.bilibili.com/video/BV1JE411g7XF?p=1 … https://www.bilibili.com/video/BV1JE411g7XF?p=11
一个系列
把一整套课的链接放进批量接口
免费账号一批 10 条,Dev 月付 50 条,Studio 200 条。这段代码 2026-11-09 也原样跑通(放的是两条已缓存的链接,0 积分)。 把每集存成带 [分:秒] 的笔记、整理成一份课程笔记,见博主系列视频转文字。
import os, time, requests
API = "https://linkdigest.dev/api/v1/digest/batch"
H = {"Authorization": f"Bearer {os.environ['LINKDIGEST_API_KEY']}"}
series = [ # 一个系列的每一集,各自「分享 → 复制链接」
"https://www.bilibili.com/video/BV1xxxxxxxx1/",
"https://www.bilibili.com/video/BV1xxxxxxxx2/",
]
batch = requests.post(API, headers=H, json={"urls": series, "depth": "script"}, timeout=120).json()
while batch["status"] != "done":
time.sleep(15)
batch = requests.get(f"{API}/{batch['batch_id']}", headers=H, timeout=60).json()
full = requests.get(f"{API}/{batch['batch_id']}?include=digests", headers=H, timeout=120).json()
print("这一批共", full["credits_total"], "积分")
for it in full["items"]:
d = (full.get("digests") or {}).get(it["url"]) or {}
print(it["url"], "·", d.get("title"), "·", len(d.get("transcript") or []), "段")价格
按时长计费,三档 depth
| 一条内容 | 积分 | 折合人民币 |
|---|---|---|
| 10 分钟视频 · 只要文案 | 5 | ¥0.72 |
| 30 分钟网课 · 只要文案 | 15 | ¥2.16 |
| 87 分钟讲座 · 只要文案(下面这条) | 44 | ¥6.336 |
| 87 分钟讲座 · 逐字稿优先 | 45 | ¥6.48 |
| 10 分钟视频 · 完整读取(带画面文字) | 11 | ¥1.584 |
按加量包折算:$5 = 250 积分,支付宝按人民币结算 ¥36,每积分 ¥0.144。注册送 10 积分(一次性)。 任何人读过的链接再读 0 积分;读不出内容不收费。
87 分钟的视频超过免费账号和积分包账号 60 分钟的单条上限,第一次读需要 Dev 月付(120 分钟);别人读过的再读不受这个限制,也不扣积分。
MCP
在 Claude Code、Cursor 里直接贴 B 站链接
claude mcp add --transport http linkdigest \ https://linkdigest.dev/mcp \ --header "Authorization: Bearer ld_live_..."
MCP 里是 digest_url 工具,同样可以传 depth: "script"。
API Key 在 https://linkdigest.dev/app/keys 创建(形如 ld_live_…)。 REST、MCP 各客户端的配置、轮询和返回字段见 中文 API / MCP 文档。
不写代码:贴一条链接
不注册也能免费读一条自己的链接;别人读过的示例秒出、不计费。
点下面的示例,或粘贴你自己的链接。
只要字幕见B站字幕提取,要总结见B站视频 AI 总结,整节网课见B站网课转文字,读取方式见数据来源与合规。
常见问题
- 没有 CC 字幕的视频也能转吗?
- 能。逐字稿来自视频的音轨(语音识别),不依赖 UP 主上传的 CC 字幕,transcript_source 写的是 asr;我们不下载 B 站自己的字幕文件。方言、多人抢话、背景音乐很响时会有错字,人名、术语请对照原视频。
- 分 P 视频怎么办?
- 带 ?p=N 的链接读第 N P:标题后面写明是哪一 P(例如「· P2 Rule of ML 2020」),duration_seconds 和积分都按这一 P 的时长算。要一整套分 P:分 P 视频的返回里有 parts(count 是总 P 数,current 是这次读的哪一 P,items 里每一 P 的 p、title、seconds),照它拼出 ?p=N 的链接放进批量接口,代码见上面「一整套分 P」;在网页上读的话,分 P 的视频读完一 P,登录状态下结果页会写「这个视频共 N P,你读的是 P k」,选一段范围(默认接下来的 10 P)就能一次读完,每一 P 按自己的时长计费,开始之前先显示要多少积分。P 号超出这个视频的分 P 数时,返回原因、不扣积分。合集里每一集是单独的视频,各自复制链接即可。
- 长视频有章节大纲吗?
- 有。逐字稿满 8 分钟的视频多一份带时间的大纲:5–20 节,每节有起止时间、标题和 1–3 条要点,排在逐字稿前面,复制和下载的 Markdown 里也有,不另收积分。2026-11-10 之后读的视频才有;UP 主自己分了章节的视频沿用原章节。返回里是 outline 数组,每节 start、end(秒)、title、summary,在这一节原文里逐字找得到的一句放在 quote;generated 是 model,模型没给出能用的大纲时按时间等分、标 fallback。
- 单条视频最长多少?
- 只要文案和逐字稿优先:免费账号和只买积分包的账号 60 分钟,Dev 月付和 Studio 120 分钟;完整读取(带画面文字)分别是 10 分钟和 30 分钟。超过上限返回 402(media_too_long),不扣积分。
- 为什么有时返回读不了?会扣费吗?
- B 站的风控对云服务器地址的请求统一回 412,所以我们打开 B 站嵌入播放器时先经住宅出口(详见数据来源与合规页)。出口也全被拒、或者视频私密、已删除、需要登录或付费才能看时,返回原因,不扣积分;被拒的可以过一会儿再试,或者把视频保存下来上传。
- depth 选哪个?
- "script" 只转口播,每开始 2 分钟 1 积分,最便宜;"transcript" 是逐字稿加少量截帧(画面上的 PPT、字幕条读一部分),1 积分起每开始 2 分钟 +1;不传 depth 是完整读取,按每开始 1 分钟 1 积分加基础 1 积分,画面文字最全。
- B站视频转文字 API 多少钱一次?
- 按 ¥36 / 250 积分折算,调用一次的价钱:10 分钟视频只要文案 ≈ ¥0.72/次,10 分钟视频完整读取 ≈ ¥1.584/次,45 分钟的网课只要文案 ≈ ¥3.312/次。任何人读过的链接再读 0 元,读不出来不扣。10 分钟视频:只要文案 5 积分(约 ¥0.72),完整读取 11 积分。任何人读过的同一条视频再读 0 积分;读不出来不扣。注册送 10 积分,之后支付宝 ¥9.9 买 50 积分或 ¥36 买 250 积分,一次性、不订阅、不过期。
不用注册先试一条;注册送 10 积分,不用绑卡。支持的平台上有链接读不出来,就是一个值得报告的 bug。