关于 bilibili-render-pdf
bilibili-render-pdf 是将 Bilibili 视频整理为中文讲义并生成 PDF 的工作流技能,适合需要结构化学习笔记的读者。它结合字幕或语音转写、画面关键帧与封面,并生成可编译的完整 LaTeX 文档。
主要功能
- 01检查视频元数据与分P
- 02字幕、Whisper 转写或纯画面回退
- 03提取封面与教学关键帧
- 04按教学逻辑组织中文讲义
- 05生成并编译 LaTeX 与 PDF
适用场景
- 01把 Bilibili 教学视频整理成讲义
- 02处理缺少字幕的视频内容
- 03为长视频分段整理并合并笔记
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ wdkns/ wdkns-skills --skill bilibili-render-pdf安装后在 Claude Code 中输入/bilibili-render-pdf确认已加载。
附带文件agents/openai.yamlassets/notes-template.tex
详细介绍
Bilibili 渲染 PDF
使用此技能将 Bilibili 视频转换为完整、可编译的 .tex 笔记和渲染后的 PDF。
此技能扩展了 youtube-render-pdf 工作流,针对 Bilibili 的字幕稀缺、高清画质需要登录、多分 P 视频以及平台特有的非教学内容进行了适配。
Bilibili 与 YouTube:主要差异
| 方面 | 处理方式 |
|---|---|
| 字幕稀缺 | 优先尝试 CC 字幕 → 回退到 Whisper 语音转文字 → 仅使用画面模式 |
| 登录限制高清画质 | 1080P+ 需要 cookies;提示用户使用 yt-dlp --cookies-from-browser chrome |
| 多分 P 视频 | 检测分 P 视频,并询问用户要处理哪些分 P |
| URL 格式 | 支持 bilibili.com/video/BVxxxxxxx 和 b23.tv 短链接 |
| 弹幕 | 不要将弹幕用作教学内容来源(噪声太多);仅使用 CC 字幕或 Whisper 输出 |
目标
根据 Bilibili URL 制作一份专业的中文讲义。
输出必须:
- 使用视频中的实际教学内容,而非仅依赖字幕转录
- 在有原始封面图的情况下,将其放在
.tex和渲染后的 PDF 首页 - 将所有必要且有价值的关键帧作为图片插入,不添加多余的截图
- 以最终总结部分收尾,其中包含讲者实质性的结尾讨论和提炼后的要点
- 使用
\section{...}和\subsection{...}进行结构化组织 - 是一份从
\documentclass到\end{document}的完整.tex文档 - 在最终交付时成功编译为 PDF
教学标准
笔记应读起来像一位出色的人类教师正在引导读者学习材料。
- 组织每个主要章节,让读者先理解动机,再理解主要思想、机制、示例或证据,最后掌握要点
- 耐心且明确地说明逻辑过渡;让读者清楚讲者为何引入某个概念、它解决什么问题,以及下一个观点如何承接
- 力求深入但易于理解:保留技术深度,但先用通俗语言介绍直觉,再引入形式化表达
- 如果某个章节内容密集,应拆分为较小的子章节,逐步构建理解,而不是将所有内容压缩成一段冗长的推导
- 不要按时间顺序堆砌字幕内容;应将其改写为意图明确、对比清晰、层层递进的教学顺序
获取源材料
检查元数据
-
首先检查视频元数据。 撰写前优先查看标题、章节、时长、缩略图是否可用以及字幕是否可用。
-
检测多分 P 视频。 列出所有分 P,并在下载前询问用户要处理哪些分 P。
获取字幕(三级回退)
优先级 1:CC 字幕(平台内嵌)
如果手动字幕和自动生成字幕都可用,优先使用手动字幕。
优先选择 zh-Hans、zh-CN、zh 或 ai-zh 字幕轨道。
保留字幕时间戳;如果仍需定位图片,不要过早将字幕展平为纯文本。
yt-dlp --write-subs --sub-langs "zh-Hans,zh-CN,zh,ai-zh" --convert-subs srt \
--skip-download -o "%(title)s.%(ext)s" "<URL>"
优先级 2:Whisper 语音转文字(没有可用 CC 字幕时)
先提取音频,然后使用 Whisper 转录,生成带时间戳的 SRT 文件。
yt-dlp -x --audio-format wav -o "audio.%(ext)s" "<URL>"
whisper audio.wav --model medium --language zh --output_format srt --output_dir .
优先级 3:仅使用画面模式(音频质量太差时)
完全跳过字幕,依靠密集采样视频帧,仅从画面中提取教学内容。
视频和封面下载
-
编写
.tex前,先获取视频的原始封面图片。 优先选择平台元数据提供的最高分辨率缩略图。 将选定的封面保存在本地,并在首页引用该本地资源。 -
优先选择最适合提取插图的视频源。 探测可用格式,并选择当前环境中实际可下载的最高分辨率。 请注意,Bilibili 的 1080P 及以上画质通常需要登录 Cookie。
-
在可行的情况下,将所有源文件保存在本地。 常见的工作文件包括元数据、下载的封面图片、带时间戳的字幕文件(CC 或 Whisper 生成)、可选的清理后转录文本、本地视频文件和提取的帧。
长视频策略
对于较长的视频,不要依赖一次性处理完整视频。
- 如果视频时长超过 20 分钟,或字幕文件包含超过 300 条字幕,请将内容拆分为较小的片段。
- 优先按章节边界或分 P 边界拆分。如果没有这些边界,或边界分布过于不均匀,则按连贯的时间段或字幕范围拆分。
- 如果可以使用子 Agent,请并行启动多个子 Agent,分别处理不同片段,以确保覆盖充分、不遗漏细节。
- 为每个子 Agent 指定明确的片段边界,并要求其返回:该片段的教学目标、核心论点、重要公式或代码、带时间依据的必需插图,以及需要在整合时解决的歧义。
- 如果讲解跨越相邻片段边界,请保留少量重叠内容,并在整合时去重。
- 主 Agent 必须将各片段的输出整合为统一的大纲和连贯的最终叙述。最终 PDF 应读起来像一份完整的讲义,而不是各片段摘要的拼接。
教学内容规则
在以下内容可用时,均应据此编写讲义:
- 视频标题和章节结构
- 视频原始封面图片和关键元数据
- 屏幕上展示的图示、公式、表格、图表和架构幻灯片
- 字幕中的讲解、示例和口头强调
- 访谈、圆桌讨论、播客或对话类视频中简短且信息密度高的原话片段,前提是精确措辞能增强现场感、幽默感、直觉理解,或以异常精炼的方式传达信息
- 演讲中展示或描述的代码片段
跳过无助于实际教学的内容:
- 问候
- 闲聊
- 不增加信息、张力、幽默感、直觉理解或教学价值的例行对话
- 赞助内容
- 频道运营内容(一键三连、关注投币等)
- 结束寒暄
如果演讲者在结束时的讨论具有实际教学价值,例如总结、局限性、未来工作、权衡、建议或开放问题,则应保留。
写作规则
-
除非用户明确要求使用其他语言,否则用中文撰写讲义。
-
使用
\section{...}和\subsection{...}组织文档。 必要时重构教学脉络;不要盲目照搬字幕顺序。 在适用时,每个章节应依次回答:要解决什么问题、更简单的视角为何不够、核心思路是什么、如何实现,以及读者应记住什么。避免过度使用“不是……而是……”句式。 仅当视频本身确立了真实对比,且该对比能显著阐明机制时,才使用这一句式。
避免含糊或过于抽象的措辞。 尽可能依据具体机制、示例、变量、步骤、观察到的现象、时间戳、图示或演讲者提供的证据来阐述论点。
-
从
assets/notes-template.tex开始。 填写元数据块,包括本地封面图片路径,并将正文内容块替换为生成的讲义。 -
如果有视频的原始封面图,首页必须包含该图片。 将其放在首页,而不是埋在文档后面。 使其在视觉上区别于正文中的教学插图。
-
在图示能显著改善讲解效果时,务必使用图示。 为确保讲解清晰,应包含所需的所有图示,即使这意味着文档中会有很多图示。 不要刻意减少图示数量;应优先保证讲解全面、易于阅读。 适合使用图示的内容包括关键公式、示意图、表格、绘图、视觉对比、流水线调度、架构视图,以及分阶段展示的过程。
-
不要将图片放入自定义消息框中。
-
出现数学公式时: 先用通俗的中文解释公式试图表达什么,以及它为何会出现 使用
$$...$$将公式单独成行展示 然后紧接着用扁平列表解释每个符号 -
出现代码示例时: 在代码清单前解释代码的作用,并在有帮助时总结代码清单之后的预期行为 使用
lstlisting包裹代码 添加描述性caption -
在内容有需要时,有意识地反复突出教学要点: 对读者必须牢记的核心概念,使用
importantbox,包括形式化定义、核心论点、关键机制总结、类似定理的陈述、关键算法步骤,以及对复杂讲解中主要思想的简明重述 对有助于理解但不是主线的背景和旁支知识,使用knowledgebox,包括前置知识提醒、历史沿革、工程背景、设计权衡、术语对比,以及帮助建立直觉的类比 对常见误解和容易出错之处,使用warningbox,包括符号过多、隐藏假设、容易误导的经验法则、常见实现错误、因果混淆、差一错误式的推理错误,以及讲者对比错误直觉与正确理解之处 仅在对话较多的视频中使用dialoguebox:当一小段原始对话信息量大、幽默生动或特别直观,且保留讲者原话能让读者更有身临其境之感时使用dialoguebox可以包含一轮对话,也可以包含几轮紧密相关的对话,例如提问、追问、反驳、澄清和回答dialoguebox片段应简短:保留说话者标签和具体时间戳或时间区间;只有在确信无误时,才轻微修正明显的 ASR 错误;并在消息框后用正文解释这段对话为何重要 不要将dialoguebox用于问候、填充语、冗长的逐字稿摘录,或用普通的概述性讲解会更清楚的对话 每个章节中的消息框数量不设上限;如果材料中包含多个不同的教学要点,可添加多个消息框 每个消息框都应承载具体的教学内容,而非泛泛强调 优先将消息框紧接在促使其出现的段落、推导或示例之后 常规讲解应保持普通正文形式;消息框用于突出重要要点,而非装饰
图示必须放在 importantbox、knowledgebox、warningbox 和 dialoguebox 之外。
-
每个主要章节末尾都添加
\subsection{本章小结}。 有一两个值得推荐的外部链接时,添加\subsection{拓展阅读}。 -
文档应以最终顶级章节结尾,例如
\section{总结与延伸}。 该最终章节必须包括:- 演讲者实质性的收尾讨论,不包括常规告别语
- 你对核心论点、机制和实际意义的结构化提炼
- 你的扩展性综合,包括概念压缩、各章节之间的关联,以及任何忠实于视频内容的谨慎概括
- 材料支持的具体要点、开放问题或后续步骤
-
不得在 LaTeX 中输出任何
[cite]类占位符。
图像处理
选择图像时,应以必要性和教学价值为依据,而非遵循任意配额或偏向让文档在视觉上保持稀疏。
定位候选帧时,应优先确保召回率,而非精确率。 与其漏掉幻灯片、公式、表格或图表最终完整呈现且清晰可读的那一帧,不如先检查更多相邻候选帧。
必须通过直接目视检查来理解画面。
- 使用
view image工具检查候选帧和裁剪图,再判断画面内容、应如何描述,以及是否足够完整,适合纳入文档。 - 不得使用
tesseract等 OCR 工具代替对画面的目视理解。 - 不得只根据相邻字幕、文件名或时间戳推断画面的语义内容;必须先检查图像本身。
- 联系表、蒙太奇和拼接条带有助于提高召回率,但最终的保留或剔除决定,以及语义命名,都必须基于通过
view image对图像的实际检查。
帧选择检查清单
插入任何视频帧之前,先检查同一字幕对齐区间内的多个相邻候选帧,并按照此清单逐项评估。若有任何一项不符合,就应剔除该帧并继续在附近寻找,而非勉强使用近似帧。
- 相关性:画面必须直接支持周围段落或小节讨论的具体概念,而不仅仅是主题大致相同。
- 所需内容可见:文中提及的每个视觉元素都必须已在画面中呈现。
- 完整呈现状态:若幻灯片、白板、动画或仪表板是逐步呈现的,应使用内容已完整显示且清晰可读的最终状态,而非中间状态。
- 附近候选帧中的最佳选择:比较多个相邻候选帧,优先选择内容最完整、可读性也最佳的一帧。
- 可读性:文字、公式、标签和图表结构必须足够清晰,值得纳入文档。
帧命名
-
为原始候选帧使用基于时间戳的中性名称。在检查实际帧内容之前,不要赋予语义名称。
-
只有在视觉确认图像中完整可见的内容后,才对帧进行语义重命名。
-
语义文件名必须描述帧中实际可见的内容,而不是根据字幕、附近的讲解内容或预期段落主题进行猜测。
-
如果帧只显示了部分内容、处于过渡状态或含义不明确,请继续搜索,暂时不要确定语义名称。
-
使用带时间戳的字幕文件(CC 或 Whisper 生成的 SRT)作为搜索关键帧的主要定位依据。
-
首先找出与所讨论的概念、示例、公式或视觉讲解相对应的字幕时间段。
-
然后在与字幕对齐的时间区间内搜索,必要时也搜索其边界附近的时间,找到最清晰易读的帧。
-
不要从某个猜测的时间戳直接跳到提取一帧。 先在相关时间区间内密集生成候选帧,再检查并筛选。
-
优先使用能够一次检查多个相邻候选帧的工具,例如
magick montage、联系表、平铺帧条或同类工作流。 使用这些工具尽可能提高召回率,避免错过视觉内容完整呈现的帧。 -
如果画面是逐步揭示的 PPT、动画构建、白板内容累积或仪表盘状态变化,请明确搜索内容完整呈现的最终状态。 不要停留在第一帧看似大致正确的画面。
-
如果多个相邻候选帧仅在逐步揭示状态上有所不同,请继续检查,直到找到信息最完整且清晰易读的帧。
-
如果同一讲解时间段内的较稀疏早期帧和较密集后期帧难以取舍,且后期帧的内容明显更完整、仍然清晰易读,请优先选择后期帧。
-
纳入所有有助于充分解释内容的图。
-
在一个章节或小节中纳入多张图是可以的,而且当视频分阶段展开某个想法时,通常更理想。
-
省略重复或信息量低的帧。
-
如果存在章节,请在章节边界和讲解重点处提取帧,但仍须根据字幕时间进行验证。
-
如果首次提取的帧恰好捕捉到动画过渡,请搜索附近的时间戳。
-
如果完整画面范围太大,请裁剪、放大或单独截取相关区域。
-
如果幻灯片逐步揭示内容,请截取最终清晰易读的状态;只有在中间帧展示了真正不同的步骤时,才添加中间帧。
-
对于视觉内容密集的部分,可以先过度采样,再进行删选。 不要过早控制候选帧数量,以免从未检查关键视觉状态。
-
优先使用一组必要的图,而不是用一张标签难以辨认、内容过载的图。
-
确保公式和标签清晰易读。
图的时间来源
每当 .tex 或 PDF 引用特定视频帧或从视频帧裁剪的图像时,都要在同一页添加页脚注,记录其来源时间区间。
- 页脚注必须注明具体时间区间,例如
00:12:31--00:12:46。 - 时间区间应来自用于定位图片的、与字幕对齐的片段,而不是模糊的章节级估算。
- 如果图是裁剪图,页脚注仍须注明源帧或字幕片段在原视频中的时间区间。
- 如果同一张图中的多个相邻帧都来自同一字幕区间,添加一个清晰的页脚注即可。
- 确保图和时间页脚注固定在同一页;优先使用
[H]、非浮动块或其他稳定的布局方式,避免普通浮动体将二者分开。
可视化
对于仅用屏幕截图和文字难以解释清楚的概念,请添加准确的可视化内容。
有两种可接受的方式:
- 使用 TikZ 或 PGFPlots 生成 LaTeX 原生可视化内容
- 预先使用脚本生成图,并将其作为图像插入
对于使用脚本生成的插图,如果 matplotlib 和 seaborn 等 Python 工具能以最清晰的方式生成准确的教学图,请优先使用。
如果可视化内容是在 LaTeX 之外生成,而不是在 LaTeX 中原生绘制的:
- 将图导出为
pdf,以便插入.tex时不损失光栅化质量 - 绘图表、图表和示意图时优先使用矢量输出
- 除非内容本质上属于光栅图,否则不要将
png或jpg用于脚本生成的教学图
如果源材料中的关系、结果或公式重新绘制后会比截图更清晰,请优先使用 LaTeX 原生工具或 matplotlib / seaborn 重建。
以下内容适合使用可视化:
- 流程、管线和架构概览
- 曲线和图表,例如缩放定律、训练曲线、基准测试结果和消融对比
- 用于解释数据关系的分布、相关性、热力图和其他图表
- 复杂函数、曲面、等高线图和几何直觉图
- 重新绘制成图表后更清晰的表格或对比
- 能将某一部分的核心机制或要点浓缩为一张图的总结图
不要添加没有教学价值的装饰性图形。
最终检查清单
交付前,请确认以下所有事项:
- 没有遗漏重要的教学内容,也没有在压缩、重组或总结过程中丢失具体但关键的细节
- 文字与图示相互对应:每个插入的画面都能支撑周围的说明,已裁剪掉不必要的部分,选用的画面呈现了最完整的相关信息,而非过渡或不完整的状态
- 文档的视觉内容足以支持教学:检查是否应添加更多信息量高的关键帧,以及添加 LaTeX 原生插图或 Python 脚本生成的插图是否能提高清晰度
交付内容
请交付以下所有内容:
- 如果使用了语音转文本,请提供 Whisper 生成的 SRT 字幕文件
- 首页引用的已下载封面图
- 文档引用的所有提取或生成的图示素材
- 最终
.tex文件和编译后的.pdf文件(须使用合理的中文文件名,例如[中文视频标题]_notes.tex和[中文视频标题]_notes.pdf)
素材
assets/notes-template.tex:默认 LaTeX 模板,请复制并填写