youtube-notetaker - SKILL
name: youtube-notetakerdescription: “Turn YouTube talks into local study notes with slides, transcripts, editable annotations, and a markdown-backed viewer.”category: “video”risk: “safe”source: “official”source_repo: “dair-ai/dair-academy-plugins”source_type: “official”date_added: “2026-06-19”author: “DAIR.AI”license: “MIT”license_source: “https://github.com/dair-ai/dair-academy-plugins/blob/main/README.md#license”tags:dair-academyaiworkflowtools:claude-codecodex-clicursorYouTube 笔记助手何时使用当此工作流与用户请求匹配时使用来源dair-ai/dair-academy-pluginsMIT。构建一个你研究学习的 YouTube 演讲的个人资料库。每个视频对应一个纯 markdown 文件带时间戳的幻灯片快照、完整的时间戳转录文本以及可编辑的笔记。一个小型内置服务器将该资料库渲染为浏览器中的交互式深度研读视图。无需数据库无需云服务。一切都是以文件形式存储在磁盘上完全归你所有。架构先读这个markdown 资料库是唯一的事实来源。工件artifact是一个薄薄的 HTML 外壳从服务器获取数据并把笔记写回。切勿将视频数据硬编码进 HTML。资料库一个普通文件夹由VIDEO_LIBRARY_DIR设置默认为~/video-deepdives/。每个视频一个 markdown 文件文件名 slug YouTube id例如RtywqDFBYnQ.md。Frontmatter 保存视频元数据 slides数组。正文保存完整的转录格式为[HH:MM:SS] text行。_media/保存幻灯片图片按视频命名空间隔离格式为youtube_id-slide-NN.jpg避免视频之间冲突。服务器scripts/serve.py一个仅依赖标准库 PyYAML 的文件。启动方式python3 scripts/serve.py --dir ~/video-deepdives --port 8000它在/提供工件服务并提供一个工件与其交互的小型 APIGET /api/video-deepdives首页获取此接口列出每个视频。GET /api/video-deepdives/id返回单个视频{meta, body}。GET /api/video-deepdives/_media/file提供幻灯片图片。PATCH /api/video-deepdives/id使用{fields:{slides:[...]}}写回笔记。只要 markdown 文件一存在它就会自动拾取新视频。添加视频只需编写 markdown 文件 媒体你几乎不需要碰 HTML。/api/video-deepdivesURL 命名空间仅限于内置服务器。工件reference/artifact.html由serve.py在/提供服务。这是一份干净的参考副本只有在用户想要 UI 变更时才重写它。对于新视频保持原样。要求PATH 上有yt-dlp和ffmpeg下载 帧/场景提取。安装了Pillow联系表和PyYAMLmarkdown 文件 服务器的 Python 3。pip install yt-dlp pillow pyyaml # ffmpeg 通过你的包管理器安装添加视频——流水线所有辅助脚本都在scripts/中。setup.sh创建一个私有的、不可预测的临时目录把打印出来的SCRATCH路径复制到 shell 变量中然后把最终资源复制到资料库中。如果你不想要默认值可在每个 shell 中设置一次VIDEO_LIBRARY_DIR。不要在笔记/标题中使用破折号—或箭头→。1. 解析 id 并检查可嵌入性bash scripts/setup.sh youtube_url_or_id打印 11 位YTID、临时目录、目标资料库路径以及 YouTube是否允许嵌入oembed 200或被阻止oembed 401例如某些大学演讲。如果被阻止内联播放将无法工作但工件会优雅地降级为在 YouTube 上的此时间点打开链接所以正常继续即可。继续之前把命令打印出的确切不可预测路径复制下来SCRATCH/path/printed/by/setup.sh2. 下载视频 字幕bash scripts/download.sh YTID $SCRATCH使用yt-dlp获取视频幻灯片帧 ≤720p 就足够了以及最佳可用字幕有手动的用手动否则用自动字幕格式为.vtt。同时获取标题/上传者。3. 检测候选幻灯片时间戳bash scripts/detect_slides.sh $SCRATCH/video.mp4 $SCRATCH运行 ffmpeg 场景检测selectgt(scene,0.3)并写入scene_times.txt秒。0.3 是不错的默认值对于细微的幻灯片组可降低0.2对于画面切换频繁的视频可提高0.4。4. 构建联系表并人工挑选python3 scripts/contact_sheet.py $SCRATCH/video.mp4 $SCRATCH/scene_times.txt $SCRATCH/contact.jpg查看contact.jpg标有索引 时间戳。这是人工判断步骤保留真正内容幻灯片的帧丢弃说话人特写镜头、转场、重复帧和动画中途的模糊帧。把保留的时间戳秒保存到$SCRATCH/keep.txt每行一个。典型的演讲会产生 15-25 张幻灯片。5. 以全质量提取精选幻灯片并安装到 _mediapython3 scripts/extract_slides.py YTID $SCRATCH/video.mp4 $SCRATCH/keep.txt $SCRATCH/slides.json以 1280px 宽、JPEG 格式提取每个保留的时间戳并复制到$VIDEO_LIBRARY_DIR/_media/命名为YTID-slide-01.jpg、-02.jpg、……按时间顺序编号。进度输出到 stderr一个干净的slides.json脚手架打印到stdout所以按所示重定向到文件然后填入title和note。提示演讲通常是幻灯片 演讲者摄像头合成的而且演讲者会来回翻页所以同一张幻灯片会在多个时间戳出现。保留每张最清晰的那一帧并把每张幻灯片的t重新锚定到转录中实际讨论该幻灯片的位置更好的从这里播放体验。6. 构建转录python3 scripts/vtt_to_transcript.py $SCRATCH/*.vtt $SCRATCH/transcript.txt把 VTT 解析成干净的、去重后的[HH:MM:SS] text行YouTube 自动字幕会重复滚动文本该脚本会将其合并。这就是 markdown 正文。7. 写笔记并组装 markdown 文件为每张保留的幻灯片写一段 1-3 句话的note以该时间戳附近的转录为依据不要编造论断。然后组装python3 scripts/write_library_item.py \ --id YTID \ --title Talk title \ --speaker Name, Role, Org \ --tags tag1,tag2,tag3 \ --slides $SCRATCH/slides.json \ --transcript $SCRATCH/transcript.txt写入带正确 frontmatter 正文的$VIDEO_LIBRARY_DIR/YTID.md。8. 启动服务并验证始终执行此步骤python3 scripts/serve.py --dir $VIDEO_LIBRARY_DIR --port 8000 scripts/verify.sh YTID # 默认为 http://127.0.0.1:8000verify.sh用 curl 请求合集列表、单个条目、第一张幻灯片图片和工件断言 HTTP 200 且新 id 出现在索引中。然后在浏览器中打开http://127.0.0.1:8000/#/YTID确认幻灯片 转录 笔记都能渲染。Markdown 文件结构参考--- id: RtywqDFBYnQ title: Memory and dreaming for self-learning agents youtube_id: RtywqDFBYnQ speaker: Mahesh, Product Manager, Platform team at Anthropic source_url: https://www.youtube.com/watch?vRtywqDFBYnQ slide_count: 19 created: 2026-05-25 tags: [anthropic, memory, agents] slides: - idx: 1 t: 55.7 # seconds (float ok), used for seeking mmss: 00:55 # display label title: Agent primitives have evolved note: One to three sentences grounded in the transcript at this timestamp. img: /api/video-deepdives/_media/RtywqDFBYnQ-slide-01.jpg # ... more slides --- ## Transcript [00:00:08] Hello, everyone... [00:00:11] ...注意事项idx可以是稀疏/非连续的工件按t对幻灯片排序所以顺序由时间戳决定而不是 idx。img始终是/api/video-deepdives/_media/fileURL由 serve.py 提供绝不使用 base64。幻灯片note是用户在 UI 中编辑的内容PATCH 会把整个slides数组写回。注意事项与陷阱嵌入被禁用oembed 401内联播放器被视频所有者屏蔽。这不是 bug工件会显示在 YouTube 上的此时间点打开链接代替。向用户提及这一点。图片冲突始终按命名空间隔离媒体YTID-slide-NN.jpg。切勿为新视频重用裸的slide-NN.jpg。自动字幕噪音YouTube 滚动字幕会在多个提示点重复文本使用提供的 VTT 解析器不要把原始 VTT 直接倒入正文。添加新视频时不要动现有视频。每个视频都是独立的文件。服务器没有拾取视频确认.md文件直接位于--dir内不是子文件夹且文件名为YTID.md。为什么可移植无编排器 / 无数据库。存储就是一个包含 markdown 图片的普通文件夹。一个环境变量VIDEO_LIBRARY_DIR控制资料库的位置。一个小的服务器文件serve.py标准库 PyYAML渲染一切并处理笔记写回。可以把它放到任何能运行 Python 的地方。markdown 文件可移植可在 Obsidian 或任何编辑器中阅读frontmatter 是标准 YAML。局限性当工作流指定了上游工具、账户、API 密钥或本地设置时需要提供这些。未经用户明确批准不执行破坏性、生产环境、付费或对外消息类操作。在把生成的工件或建议视为最终结果之前请对照用户的真实来源进行验证。