mcpField
B
bilibili-render-pdf

bilibili-render-pdf

github.com/wdkns文档处理820371 次安装6 天前更新
代码仓库

关于 bilibili-render-pdf

bilibili-render-pdf 是将 Bilibili 视频整理为中文讲义并生成 PDF 的工作流技能,适合需要结构化学习笔记的读者。它结合字幕或语音转写、画面关键帧与封面,并生成可编译的完整 LaTeX 文档。

主要功能

  1. 01检查视频元数据与分P
  2. 02字幕、Whisper 转写或纯画面回退
  3. 03提取封面与教学关键帧
  4. 04按教学逻辑组织中文讲义
  5. 05生成并编译 LaTeX 与 PDF

适用场景

  1. 01把 Bilibili 教学视频整理成讲义
  2. 02处理缺少字幕的视频内容
  3. 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

教学标准

笔记应读起来像一位出色的人类教师正在引导读者学习材料。

  • 组织每个主要章节,让读者先理解动机,再理解主要思想、机制、示例或证据,最后掌握要点
  • 耐心且明确地说明逻辑过渡;让读者清楚讲者为何引入某个概念、它解决什么问题,以及下一个观点如何承接
  • 力求深入但易于理解:保留技术深度,但先用通俗语言介绍直觉,再引入形式化表达
  • 如果某个章节内容密集,应拆分为较小的子章节,逐步构建理解,而不是将所有内容压缩成一段冗长的推导
  • 不要按时间顺序堆砌字幕内容;应将其改写为意图明确、对比清晰、层层递进的教学顺序

获取源材料

检查元数据
  1. 首先检查视频元数据。 撰写前优先查看标题、章节、时长、缩略图是否可用以及字幕是否可用。

  2. 检测多分 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:仅使用画面模式(音频质量太差时)

完全跳过字幕,依靠密集采样视频帧,仅从画面中提取教学内容。

视频和封面下载
  1. 编写 .tex 前,先获取视频的原始封面图片。 优先选择平台元数据提供的最高分辨率缩略图。 将选定的封面保存在本地,并在首页引用该本地资源。

  2. 优先选择最适合提取插图的视频源。 探测可用格式,并选择当前环境中实际可下载的最高分辨率。 请注意,Bilibili 的 1080P 及以上画质通常需要登录 Cookie。

  3. 在可行的情况下,将所有源文件保存在本地。 常见的工作文件包括元数据、下载的封面图片、带时间戳的字幕文件(CC 或 Whisper 生成)、可选的清理后转录文本、本地视频文件和提取的帧。

长视频策略

对于较长的视频,不要依赖一次性处理完整视频。

  • 如果视频时长超过 20 分钟,或字幕文件包含超过 300 条字幕,请将内容拆分为较小的片段。
  • 优先按章节边界或分 P 边界拆分。如果没有这些边界,或边界分布过于不均匀,则按连贯的时间段或字幕范围拆分。
  • 如果可以使用子 Agent,请并行启动多个子 Agent,分别处理不同片段,以确保覆盖充分、不遗漏细节。
  • 为每个子 Agent 指定明确的片段边界,并要求其返回:该片段的教学目标、核心论点、重要公式或代码、带时间依据的必需插图,以及需要在整合时解决的歧义。
  • 如果讲解跨越相邻片段边界,请保留少量重叠内容,并在整合时去重。
  • 主 Agent 必须将各片段的输出整合为统一的大纲和连贯的最终叙述。最终 PDF 应读起来像一份完整的讲义,而不是各片段摘要的拼接。

教学内容规则

在以下内容可用时,均应据此编写讲义:

  • 视频标题和章节结构
  • 视频原始封面图片和关键元数据
  • 屏幕上展示的图示、公式、表格、图表和架构幻灯片
  • 字幕中的讲解、示例和口头强调
  • 访谈、圆桌讨论、播客或对话类视频中简短且信息密度高的原话片段,前提是精确措辞能增强现场感、幽默感、直觉理解,或以异常精炼的方式传达信息
  • 演讲中展示或描述的代码片段

跳过无助于实际教学的内容:

  • 问候
  • 闲聊
  • 不增加信息、张力、幽默感、直觉理解或教学价值的例行对话
  • 赞助内容
  • 频道运营内容(一键三连、关注投币等)
  • 结束寒暄

如果演讲者在结束时的讨论具有实际教学价值,例如总结、局限性、未来工作、权衡、建议或开放问题,则应保留。

写作规则

  1. 除非用户明确要求使用其他语言,否则用中文撰写讲义。

  2. 使用 \section{...} 和 \subsection{...} 组织文档。 必要时重构教学脉络;不要盲目照搬字幕顺序。 在适用时,每个章节应依次回答:要解决什么问题、更简单的视角为何不够、核心思路是什么、如何实现,以及读者应记住什么。

    避免过度使用“不是……而是……”句式。 仅当视频本身确立了真实对比,且该对比能显著阐明机制时,才使用这一句式。

    避免含糊或过于抽象的措辞。 尽可能依据具体机制、示例、变量、步骤、观察到的现象、时间戳、图示或演讲者提供的证据来阐述论点。

  3. 从 assets/notes-template.tex 开始。 填写元数据块,包括本地封面图片路径,并将正文内容块替换为生成的讲义。

  4. 如果有视频的原始封面图,首页必须包含该图片。 将其放在首页,而不是埋在文档后面。 使其在视觉上区别于正文中的教学插图。

  5. 在图示能显著改善讲解效果时,务必使用图示。 为确保讲解清晰,应包含所需的所有图示,即使这意味着文档中会有很多图示。 不要刻意减少图示数量;应优先保证讲解全面、易于阅读。 适合使用图示的内容包括关键公式、示意图、表格、绘图、视觉对比、流水线调度、架构视图,以及分阶段展示的过程。

  6. 不要将图片放入自定义消息框中。

  7. 出现数学公式时: 先用通俗的中文解释公式试图表达什么,以及它为何会出现 使用 $$...$$ 将公式单独成行展示 然后紧接着用扁平列表解释每个符号

  8. 出现代码示例时: 在代码清单前解释代码的作用,并在有帮助时总结代码清单之后的预期行为 使用 lstlisting 包裹代码 添加描述性 caption

  9. 在内容有需要时,有意识地反复突出教学要点: 对读者必须牢记的核心概念,使用 importantbox,包括形式化定义、核心论点、关键机制总结、类似定理的陈述、关键算法步骤,以及对复杂讲解中主要思想的简明重述 对有助于理解但不是主线的背景和旁支知识,使用 knowledgebox,包括前置知识提醒、历史沿革、工程背景、设计权衡、术语对比,以及帮助建立直觉的类比 对常见误解和容易出错之处,使用 warningbox,包括符号过多、隐藏假设、容易误导的经验法则、常见实现错误、因果混淆、差一错误式的推理错误,以及讲者对比错误直觉与正确理解之处 仅在对话较多的视频中使用 dialoguebox:当一小段原始对话信息量大、幽默生动或特别直观,且保留讲者原话能让读者更有身临其境之感时使用 dialoguebox 可以包含一轮对话,也可以包含几轮紧密相关的对话,例如提问、追问、反驳、澄清和回答 dialoguebox 片段应简短:保留说话者标签和具体时间戳或时间区间;只有在确信无误时,才轻微修正明显的 ASR 错误;并在消息框后用正文解释这段对话为何重要 不要将 dialoguebox 用于问候、填充语、冗长的逐字稿摘录,或用普通的概述性讲解会更清楚的对话 每个章节中的消息框数量不设上限;如果材料中包含多个不同的教学要点,可添加多个消息框 每个消息框都应承载具体的教学内容,而非泛泛强调 优先将消息框紧接在促使其出现的段落、推导或示例之后 常规讲解应保持普通正文形式;消息框用于突出重要要点,而非装饰

图示必须放在 importantbox、knowledgebox、warningbox 和 dialoguebox 之外。

  1. 每个主要章节末尾都添加 \subsection{本章小结}。 有一两个值得推荐的外部链接时,添加 \subsection{拓展阅读}。

  2. 文档应以最终顶级章节结尾,例如 \section{总结与延伸}。 该最终章节必须包括:

    • 演讲者实质性的收尾讨论,不包括常规告别语
    • 你对核心论点、机制和实际意义的结构化提炼
    • 你的扩展性综合,包括概念压缩、各章节之间的关联,以及任何忠实于视频内容的谨慎概括
    • 材料支持的具体要点、开放问题或后续步骤
  3. 不得在 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 模板,请复制并填写

评论

支持 Markdown