开发者 · 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。