🚀 快速安装

复制以下命令并运行,立即安装此 Skill:

npx skills add https://skills.sh/jimliu/baoyu-skills/baoyu-youtube-transcript

💡 提示:需要 Node.js 和 NPM

YouTube 转录工具 (YouTube Transcript)

从 YouTube 视频下载转录稿(字幕/隐藏式字幕)。适用于手动创建和自动生成的转录稿。无需 API 密钥或浏览器——直接使用 YouTube 的 InnerTube API。

首次运行时获取视频元数据和封面图像,并缓存原始数据以便快速重新格式化。

脚本目录 (Script Directory)

脚本位于 scripts/ 子目录中。{baseDir} = 此 SKILL.md 文件的目录路径。解析 ${BUN_X} 运行时:如果安装了 bunbun;如果 npx 可用 → npx -y bun;否则建议安装 bun。将 {baseDir}${BUN_X} 替换为实际值。

脚本 (Script) 用途 (Purpose)
scripts/main.ts 转录稿下载命令行工具 (Transcript download CLI)

用法 (Usage)

# 默认:带时间戳的 Markdown(英语)(Default: markdown with timestamps - English)
${BUN_X} {baseDir}/scripts/main.ts <youtube-url-or-id>

# 指定语言(优先级顺序)(Specify languages - priority order)
${BUN_X} {baseDir}/scripts/main.ts <url> --languages zh,en,ja

# 无时间戳 (Without timestamps)
${BUN_X} {baseDir}/scripts/main.ts <url> --no-timestamps

# 带章节分割 (With chapter segmentation)
${BUN_X} {baseDir}/scripts/main.ts <url> --chapters

# 带说话人识别(需要 AI 后处理)(With speaker identification - requires AI post-processing)
${BUN_X} {baseDir}/scripts/main.ts <url> --speakers

# SRT 字幕文件 (SRT subtitle file)
${BUN_X} {baseDir}/scripts/main.ts <url> --format srt

# 翻译转录稿 (Translate transcript)
${BUN_X} {baseDir}/scripts/main.ts <url> --translate zh-Hans

# 列出可用转录稿 (List available transcripts)
${BUN_X} {baseDir}/scripts/main.ts <url> --list

# 强制重新获取(忽略缓存)(Force re-fetch - ignore cache)
${BUN_X} {baseDir}/scripts/main.ts <url> --refresh

选项 (Options)

选项 (Option) 描述 (Description) 默认值 (Default)
<url-or-id> YouTube URL 或视频 ID(允许多个)(YouTube URL or video ID – multiple allowed) 必需 (Required)
--languages <codes> 语言代码,逗号分隔,按优先级顺序 (Language codes, comma-separated, in priority order) en
--format <fmt> 输出格式:textsrt (Output format: text, srt) text
--translate <code> 翻译到指定语言代码 (Translate to specified language code)
--list 列出可用转录稿而不是获取 (List available transcripts instead of fetching)
--timestamps 每段包含 [HH:MM:SS → HH:MM:SS] 时间戳 (Include [HH:MM:SS → HH:MM:SS] timestamps per paragraph) on
--no-timestamps 禁用时间戳 (Disable timestamps)
--chapters 从视频描述中提取章节分割 (Chapter segmentation from video description)
--speakers 输出用于说话人识别的原始转录稿(带元数据)(Raw transcript with metadata for speaker identification)
--exclude-generated 跳过自动生成的转录稿 (Skip auto-generated transcripts)
--exclude-manually-created 跳过手动创建的转录稿 (Skip manually created transcripts)
--refresh 强制重新获取,忽略缓存 (Force re-fetch, ignore cached data)
-o, --output <path> 保存到特定文件路径 (Save to specific file path) 自动生成 (auto-generated)
--output-dir <dir> 基础输出目录 (Base output directory) youtube-transcript

输入格式 (Input Formats)

接受以下任何形式作为视频输入:

  • 完整 URL:https://www.youtube.com/watch?v=dQw4w9WgXcQ
  • 短 URL:https://youtu.be/dQw4w9WgXcQ
  • 嵌入 URL:https://www.youtube.com/embed/dQw4w9WgXcQ
  • Shorts URL:https://www.youtube.com/shorts/dQw4w9WgXcQ
  • 视频 ID:dQw4w9WgXcQ

输出格式 (Output Formats)

格式 (Format) 扩展名 (Extension) 描述 (Description)
text .md 带前置元数据的 Markdown、自然段落、可选时间戳/章节/说话人 (Markdown with frontmatter, natural paragraphs, optional timestamps/chapters/speakers)
srt .srt 用于视频播放器的 SubRip 字幕格式 (SubRip subtitle format for video players)

输出目录 (Output Directory)

youtube-transcript/
├── .index.json                          # 视频 ID → 目录路径映射(用于缓存查找)(Video ID → directory path mapping - for cache lookup)
└── {channel-slug}/{title-full-slug}/
    ├── meta.json                        # 视频元数据(标题、频道、描述、时长、章节等)(Video metadata - title, channel, description, duration, chapters, etc.)
    ├── transcript-raw.json              # 来自 YouTube API 的原始转录稿片段(已缓存)(Raw transcript snippets from YouTube API - cached)
    ├── transcript-sentences.json        # 句子分段的转录稿(按标点分割,合并跨片段)(Sentence-segmented transcript - split by punctuation, merged across snippets)
    ├── imgs/
    │   └── cover.jpg                    # 视频缩略图 (Video thumbnail)
    ├── transcript.md                    # Markdown 转录稿(由句子生成)(Markdown transcript - generated from sentences)
    └── transcript.srt                   # SRT 字幕(由原始片段生成,如果使用 --format srt)(SRT subtitle - generated from raw snippets, if --format srt)
  • {channel-slug}:频道名称,短横线命名法 (Channel name in kebab-case)
  • {title-full-slug}:完整视频标题,短横线命名法 (Full video title in kebab-case)

--list 模式仅输出到标准输出(不保存文件)。

缓存 (Caching)

首次获取时,脚本保存:

  • meta.json — 视频元数据、章节、封面图像路径、语言信息 (video metadata, chapters, cover image path, language info)
  • transcript-raw.json — 来自 YouTube API 的原始转录稿片段({ text, start, duration }[])(raw transcript snippets from YouTube API – { text, start, duration }[])
  • transcript-sentences.json — 句子分段的转录稿({ text, start: "HH:mm:ss", end: "HH:mm:ss" }[]),按句子结束标点(.?!…。?! 等)分割,时间戳按字符长度比例分配,支持 CJK 文本合并 (sentence-segmented transcript – { text, start: "HH:mm:ss", end: "HH:mm:ss" }[], split by sentence-ending punctuation (.?!…。?! etc.), timestamps proportionally allocated by character length, CJK-aware text merging)
  • imgs/cover.jpg — 视频缩略图 (video thumbnail)

同一视频的后续运行使用缓存数据(无网络调用)。使用 --refresh 强制重新获取。如果请求不同的语言,缓存会自动刷新。

SRT 输出(--format srt)从 transcript-raw.json 生成。文本/Markdown 输出使用 transcript-sentences.json 以获得自然的句子边界。

工作流 (Workflow)

当用户提供 YouTube URL 并希望获取转录稿时:

  1. 如果用户未指定语言,首先使用 --list 运行,以显示可用选项
  2. 默认:使用 --chapters --speakers 运行,以获得最丰富的输出(章节 + 说话人识别)
  3. 脚本自动保存缓存数据 + 输出文件,并打印文件路径
  4. 对于 --speakers 模式:脚本保存原始文件后,按照下面的说话人识别工作流进行后处理,添加说话人标签

当用户只需要封面图像或元数据时,使用任何选项运行脚本也会缓存 meta.jsonimgs/cover.jpg

当重新格式化同一视频时(例如,先文本后 SRT),缓存数据被重用——无需重新获取。

章节与说话人工作流 (Chapter & Speaker Workflow)

章节 (--chapters)

脚本从视频描述中解析章节时间戳(例如 0:00 介绍 (Introduction)),按章节边界分割转录稿,将片段分组为可读段落,并保存为带目录的 .md 文件。无需进一步处理。

如果描述中没有章节时间戳,转录稿将输出为分组段落,不带章节标题。

说话人识别 (--speakers)

说话人识别需要 AI 处理。脚本输出一个原始的 .md 文件,包含:

  • 包含视频元数据的 YAML 前置元数据(标题、频道、日期、封面、语言)(YAML frontmatter with video metadata – title, channel, date, cover, language)
  • 视频描述(用于提取说话人姓名)(Video description – for speaker name extraction)
  • 来自描述的章节列表(如果可用)(Chapter list from description – if available)
  • SRT 格式的原始转录稿(预计算开始/结束时间戳,令牌高效)(Raw transcript in SRT format – pre-computed start/end timestamps, token-efficient)

脚本保存原始文件后,生成一个子智能体(使用更便宜的模型如 Sonnet 以提高成本效率)来处理说话人识别:

  1. 读取已保存的 .md 文件
  2. 读取 {baseDir}/prompts/speaker-transcript.md 中的提示模板
  3. 按照提示处理原始转录稿:
    • 使用视频元数据识别说话人(标题 → 嘉宾,频道 → 主持人,描述 → 姓名)(Identify speakers using video metadata – title → guest, channel → host, description → names)
    • 从对话流、问答模式及上下文线索检测说话人轮次 (Detect speaker turns from conversation flow, question-answer patterns, and contextual cues)
    • 分割成章节(使用描述中的章节,否则根据主题变化创建)(Segment into chapters – use description chapters if available, else create from topic shifts)
    • 使用 **说话人姓名:** 标签格式化,段落分组(2-4 句),以及 [HH:MM:SS → HH:MM:SS] 时间戳 (Format with **Speaker Name:** labels, paragraph grouping – 2-4 sentences, and [HH:MM:SS → HH:MM:SS] timestamps)
  4. 用处理后的转录稿覆盖 .md 文件(保留 YAML 前置元数据)(Overwrite the .md file with the processed transcript – keep the YAML frontmatter)

当使用 --speakers 时,--chapters 是隐含的——处理后的输出始终包含章节分割。

错误情况 (Error Cases)

错误 (Error) 含义 (Meaning)
Transcripts disabled (转录稿已禁用) 视频完全没有字幕 (Video has no captions at all)
No transcript found (未找到转录稿) 请求的语言不可用 (Requested language not available)
Video unavailable (视频不可用) 视频已删除、私密或地区限制 (Video deleted, private, or region-locked)
IP blocked (IP 被封锁) 请求过多,稍后重试 (Too many requests, try again later)
Age restricted (年龄限制) 视频需要登录进行年龄验证 (Video requires login for age verification)

📄 原始文档

完整文档(英文):

https://skills.sh/jimliu/baoyu-skills/baoyu-youtube-transcript

💡 提示:点击上方链接查看 skills.sh 原始英文文档,方便对照翻译。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。