关于 generate-writeup
此技能将包含 `presentation.md` 的演示文稿文件夹整理为带注释的博客风格文章。分阶段流程会收集视频与幻灯片内容、缓存中间文件,并生成结构化 Markdown 文档。
主要功能
- 01解析并转换幻灯片来源
- 02提取转录文本与幻灯片文字
- 03生成视频章节与幻灯片大纲
- 04撰写带注释的 Markdown 文档
- 05缓存中间结果
适用场景
- 01根据演讲录像制作文章
- 02结合视频内容生成逐页讲稿
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ pamelafox/ presentation-skills --skill generate-writeup安装后在 Claude Code 中输入/generate-writeup确认已加载。
详细介绍
根据演示文稿生成带注释的文章
根据演示文稿生成博客风格的文章。用户会提供一个演示文稿文件夹路径(例如,presentations/my-talk)。该文件夹必须包含一个 presentation.md 文件。
presentation.md 格式
# Talk title
- **Date:** 2026-01-15
- **Video:** https://www.youtube.com/watch?v=VIDEO_ID
- **Slides:** slides.pdf
- **Transcript:** transcript.txt
## Notes
Extra notes here
必填字段:Video 和 Slides。其他字段均为可选。 Slides 可以是本地 PDF 路径、PDF URL、PPTX URL、OneDrive 链接或 RevealJS URL。 Video 可以是 YouTube URL 或本地 MP4 路径。
流程
按顺序执行以下步骤。将所有中间输出缓存到 <presentation_folder>/outputs/,以便后续运行跳过已完成的步骤。
步骤 1:解析幻灯片
- 如果 presentation.md 中的 Slides 是 URL,则获取并转换为 PDF:
这会生成uv run .agents/skills/fetch-slides/fetch_slides.py <url> <presentation_folder>/outputsslides.pdf(对于 RevealJS URL,还会生成slides_content.md)。 - 如果 slides 是本地文件路径(相对于演示文稿文件夹),则直接使用。
- 如果
<presentation_folder>/outputs/slides.pdf已存在,则跳过。
步骤 2:将幻灯片转换为图片
将 PDF 拆分为单张 PNG 图片:
uv run .agents/skills/convert-slides-to-images/convert_slides_to_images.py <pdf_path> <presentation_folder>/outputs/slide_images
如果 <presentation_folder>/outputs/slide_images/ 中已包含 slide_*.png 文件,则跳过。
步骤 3:提取转录文本
- 如果 presentation.md 中指定了 Transcript,则从该路径读取(相对于演示文稿文件夹)。
- 如果
<presentation_folder>/outputs/transcript.txt已存在,则使用缓存版本。 - 否则,从 YouTube 提取:
uv run .agents/skills/extract-transcript/extract_transcript.py <youtube_url> <presentation_folder>/outputs/transcript.txt
步骤 4:生成视频章节
如果 <presentation_folder>/outputs/chapters.txt 已存在,则使用缓存版本。否则:
- 阅读步骤 3 中的转录文本。
- 撰写一段简短摘要(2-3 句),介绍视频内容。
- 创建带时间戳的章节列表,格式为“MM:SS - 章节标题”,涵盖主要主题。
- 保存到
<presentation_folder>/outputs/chapters.txt。
步骤 5:提取幻灯片文本
提取 PDF 每一页的文本内容,作为每张幻灯片实际内容的依据。这样可以避免将嵌入的屏幕截图或演示录屏误认为幻灯片的实际内容。
uv run .agents/skills/extract-slide-text/extract_slide_text.py <pdf_path> <presentation_folder>/outputs/slide_ascii.md <presentation_folder>/outputs/slide_images
如果 <presentation_folder>/outputs/slide_ascii.md 已存在,则跳过。
步骤 6:整理幻灯片大纲
如果 <presentation_folder>/outputs/outline.txt 已存在,则使用缓存版本。否则:
- 查找
<presentation_folder>/outputs/slide_images/中所有slide_*.png文件,并按数字排序。 - 阅读
<presentation_folder>/outputs/slide_ascii.md(来自步骤 5),将其作为每张幻灯片文本内容的依据。 - 查看每张幻灯片图片并写一句话总结。总结应主要依据 slide_ascii.md 中提取的文本,图片仅用于补充视觉信息(图表、布局、屏幕截图)。
- 对于大型演示文稿(50+ 张幻灯片),每次处理 50 张。
- 保存到
<presentation_folder>/outputs/outline.txt。
步骤 7:生成带注释的文章
收集所有上下文,然后按照以下规则生成文章。
需要收集的上下文:
TRANSCRIPT— 完整的转录文本(步骤 3)VIDEO_CHAPTERS— 章节摘要(步骤 4)SLIDE_TEXT— 从slide_ascii.md中提取的每张幻灯片文本(步骤 5)。以此作为每张幻灯片内容的事实依据。SLIDE_OUTLINE— 编号的幻灯片大纲(步骤 6)VIDEO_SOURCE— 来自 presentation.md 的 YouTube URL 或 MP4 路径IS_LOCAL_VIDEO— 如果 VIDEO_SOURCE 是本地 MP4 文件,则为 trueSLIDES_HTML_CONTENT—slides_content.md的内容(如果存在,仅适用于 RevealJS)- 检查 SLIDES_HTML_CONTENT 是否包含“SECTION HEADING”标记 →
HAS_SECTION_HEADINGS
文章生成提示词:
撰写一篇带注释的博客文章,讲解每张幻灯片的内容。
结构要求:
- 以包含演讲标题的一级标题(#)开篇。
- 接着用一段概述介绍演讲内容。
- 不要添加目录 — 目录会自动生成。
如果 HAS_SECTION_HEADINGS 为 true(带有章节标记的 RevealJS 幻灯片):
- 将章节标题幻灯片设为二级标题(##)——这些是章节分隔页。
- 将每个章节中的普通幻灯片设为三级标题(###)。
如果 HAS_SECTION_HEADINGS 为 false:
- 为每张幻灯片的内容使用二级标题(##),并添加描述性标题。
每个幻灯片章节都应包含:
- 标题
- 紧跟标题之后的幻灯片图片引用:
 - 视频时间戳链接(本地 MP4 使用
[MM:SS]) - 说明文字
以 ## Q&A 章节结尾,其中包含问题和答案,每个问题均使用三级标题(###)。
标题大小写:首字母按普通句子规则大写。其他位置仅将专有名词和缩写大写。
- 正确:“Hybrid search combines keyword and vector retrieval”
- 错误:“Hybrid Search Combines Keyword And Vector Retrieval”(标题式大小写)
结构示例:
# Building intelligent agents with RAG
This talk introduces techniques for building AI agents...
## Hybrid search combines multiple retrieval methods

[Watch from 04:12](https://www.youtube.com/watch?v=VIDEO_ID&t=252s)
Hybrid search combines keyword search and vector search...
## Q&A
### How do I configure specific indexes as knowledge sources?
Answer text here...
写作指南:
- 使用演讲备注的写法:陈述实际信息并解释其运作方式。不要从外部描述或分析演讲。
- 不要叙述演讲者、幻灯片或演讲本身做了什么。禁止使用以下表达模式:“演讲者解释了……”“这张幻灯片展示了……”“演讲演示了……”“本节标志着……的转变”“这张图示说明了……”。直接陈述内容。
- 确保每句话信息密集,不重复。
- 每张幻灯片都提供足够的细节,让读者无需观看视频。
- 补充演讲中提到但幻灯片上没有显示的信息。
- 使用简短的词语,尽量精简。直奔主题。
- 避免多个示例,一个足矣。删去冗余的过渡语。
- 优先使用连贯的段落,而非项目符号。
- 使用简单的语言。不使用表情符号。除非例外情况至关重要,否则不要使用模棱两可的措辞。
- 适当加入幻灯片中的相关链接。
- 对于 YouTube 视频,创建带时间戳的链接:
[Watch from MM:SS](VIDEO_SOURCE&t=SECONDSs) - 对于本地 MP4 文件,只提供
[MM:SS]格式的时间戳。 - 按
slide_images/slide_1.png、slide_images/slide_2.png等格式引用幻灯片。
如果 SLIDES_HTML_CONTENT 存在,请用它查找文章中应包含的 URL。
步骤 8:插入目录
生成文章后:
- 找出生成的 Markdown 中所有以
##开头的标题。 - 为每个标题创建锚点链接:
- 转换为小写
- 删除特殊字符(保留字母、数字、空格和连字符)
- 将空格替换为连字符
- 合并多个连续连字符
- 构建目录:
## Table of contents - [Heading text](#anchor-link) - [Another heading](#another-heading) - 将目录插入到第一个
##标题之前(位于#标题和简介段落之后)。
步骤 9:保存输出
将最终文章保存到 <presentation_folder>/outputs/writeup.md。
输出结构
<presentation_folder>/
├── presentation.md
└── outputs/
├── writeup.md ← Final output
├── transcript.txt ← Cached transcript
├── chapters.txt ← Cached video chapters
├── slide_ascii.md ← Extracted text per slide
├── outline.txt ← Cached slide outline
├── slides_content.md ← RevealJS extracted content (if applicable)
└── slide_images/
├── slide_1.png
├── slide_2.png
└── ...