YouTube Transcribe Turn a video — or a whole topic's worth of videos — into text you can actually read and reason over. The point is not to hand back a transcript and stop; it is to absorb what the video teaches and report it back usefully. Pipeline: find → download → transcribe → (look at frames) → (ask Gemini) → synthesize. Most tasks only need the middle. Reach for the visual steps when the spoken words are not enough. Setup (once per machine) If venv creation fails on Debian/Ubuntu, install first ( ). Keys: transcription reads ; the Gemini fallback reads . Export them, or drop a that reso…

\\t'\n yt-dlp \"${SRC[@]}\" --flat-playlist --no-warnings \\\n --print \"%(id)s${TAB}%(duration>%H:%M:%S)s${TAB}%(channel)s${TAB}%(title)s\"\nfi\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":1497,"content_sha256":"b58cd4b0f9ae5828974a3a7691b1551c3aa6e813e85ee8449f8f6b2dc4dafb90"},{"filename":"scripts/setup.sh","content":"#!/usr/bin/env bash\n# Create the skill's self-contained venv and install dependencies.\n# Idempotent: safe to run every time; it only installs what is missing.\nset -euo pipefail\nROOT=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")/..\" && pwd)\"\nVENV=\"$ROOT/.venv\"\n\nif [ ! -x \"$VENV/bin/python\" ]; then\n # Some Debian/Ubuntu boxes ship python3 without ensurepip; install python3-venv if so.\n python3 -m venv \"$VENV\" 2>/dev/null || {\n echo \"venv creation failed. On Debian/Ubuntu run: sudo apt-get install -y python3-venv\" >&2\n exit 1\n }\nfi\n# shellcheck disable=SC1091\n. \"$VENV/bin/activate\"\npip install -q --upgrade pip >/dev/null 2>&1 || true\n# yt-dlp: download. elevenlabs: Scribe v2 transcription. google-genai: Gemini video understanding.\npip install -q yt-dlp elevenlabs google-genai\necho \"youtube-transcribe ready: yt-dlp $(yt-dlp --version), $( python -c 'import elevenlabs,google.genai;print(\"elevenlabs+google-genai ok\")' )\"\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":930,"content_sha256":"471cf0f4af0b02b8f2d5d6f2b411310119919c6e7efd70de35b48447fc5f54a2"},{"filename":"scripts/transcribe.py","content":"#!/usr/bin/env python3\n\"\"\"Transcribe an audio/video file with ElevenLabs Scribe v2.\n\nUsage: transcribe.py \u003caudio_file> \u003coutdir> [--no-diarize] [--lang xxx] [--keyterms a,b,c]\n\nWrites into \u003coutdir>:\n transcript.txt full plain text\n transcript.diarized.txt speaker-grouped, timestamped lines of ~30-60 s (read this to absorb the talk)\n transcript.json raw ElevenLabs response (words + timings + speakers)\n\"\"\"\nimport os\nimport sys\nimport json\nimport argparse\nfrom elevenlabs import ElevenLabs\n\n\ndef _get(w, k, default=None):\n return w.get(k, default) if isinstance(w, dict) else getattr(w, k, default)\n\n\n# A single-speaker talk would otherwise be one huge line with one timestamp, which makes\n# \"what was said at 12:40\" impossible to find. Start a new line at the first sentence end\n# after SOFT_BREAK seconds, and unconditionally after HARD_BREAK seconds.\nSOFT_BREAK = 30\nHARD_BREAK = 60\nSENTENCE_END = (\".\", \"?\", \"!\", \"…\")\n\n\ndef main():\n ap = argparse.ArgumentParser()\n ap.add_argument(\"audio\")\n ap.add_argument(\"outdir\")\n ap.add_argument(\"--no-diarize\", action=\"store_true\")\n ap.add_argument(\"--lang\", default=None, help=\"ISO-639 hint; omit to auto-detect\")\n ap.add_argument(\"--keyterms\", default=None, help=\"comma-separated terms to spell correctly\")\n a = ap.parse_args()\n os.makedirs(a.outdir, exist_ok=True)\n\n client = ElevenLabs() # reads ELEVENLABS_API_KEY from env\n kw = dict(model_id=\"scribe_v2\", diarize=not a.no_diarize, timestamps_granularity=\"word\")\n if a.lang:\n kw[\"language_code\"] = a.lang\n if a.keyterms:\n kw[\"keyterms\"] = [k.strip() for k in a.keyterms.split(\",\") if k.strip()]\n\n with open(a.audio, \"rb\") as f:\n res = client.speech_to_text.convert(file=f, **kw)\n\n data = res.model_dump() if hasattr(res, \"model_dump\") else dict(res.__dict__)\n with open(os.path.join(a.outdir, \"transcript.json\"), \"w\") as f:\n json.dump(data, f, ensure_ascii=False, indent=2, default=str)\n\n text = (_get(res, \"text\", \"\") or data.get(\"text\", \"\") or \"\").strip()\n with open(os.path.join(a.outdir, \"transcript.txt\"), \"w\") as f:\n f.write(text + \"\\n\")\n\n # Group consecutive words by speaker into readable, timestamped lines.\n words = _get(res, \"words\", None) or data.get(\"words\") or []\n lines, buf, cur_spk, seg_start = [], [], None, None\n\n def flush():\n if buf and seg_start is not None:\n ts = f\"[{int(seg_start // 60):02d}:{int(seg_start % 60):02d}]\"\n spk = f\" {cur_spk}\" if cur_spk else \"\"\n lines.append(f\"{ts}{spk}: {''.join(buf).strip()}\")\n\n for w in words:\n spk = _get(w, \"speaker_id\")\n st = _get(w, \"start\")\n txt = _get(w, \"text\", \"\")\n if cur_spk is None:\n cur_spk, seg_start = spk, st\n if spk != cur_spk:\n flush()\n buf, cur_spk, seg_start = [], spk, st\n if seg_start is None and st is not None:\n seg_start = st\n buf.append(txt)\n elapsed = (st - seg_start) if (st is not None and seg_start is not None) else 0\n if elapsed >= HARD_BREAK or (elapsed >= SOFT_BREAK and txt.rstrip().endswith(SENTENCE_END)):\n flush()\n buf, seg_start = [], None\n flush()\n\n with open(os.path.join(a.outdir, \"transcript.diarized.txt\"), \"w\") as f:\n f.write(\"\\n\".join(lines) + \"\\n\")\n\n lang = data.get(\"language_code\")\n prob = data.get(\"language_probability\")\n n_spk = len({_get(w, \"speaker_id\") for w in words if _get(w, \"speaker_id\")})\n print(f\"Transcribed: {len(text)} chars, {len(words)} words, lang={lang} \"\n f\"({prob}), speakers={n_spk or 'n/a'}\")\n print(f\" {os.path.join(a.outdir, 'transcript.txt')}\")\n print(f\" {os.path.join(a.outdir, 'transcript.diarized.txt')}\")\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":3824,"content_sha256":"38f6361001e6d0481a554e3f03742262e61e7c75b6752135c0c9f8aef8a81846"},{"filename":"scripts/transcribe.sh","content":"#!/usr/bin/env bash\n# Wrapper: load the ElevenLabs key, activate the venv, run transcribe.py.\n# Usage: transcribe.sh \u003caudio_file> \u003coutdir> [--no-diarize] [--lang xxx] [--keyterms a,b,c]\nset -euo pipefail\nDIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\nROOT=\"$(cd \"$DIR/..\" && pwd)\"\n# shellcheck disable=SC1091\n. \"$DIR/load-keys.sh\"\n# shellcheck disable=SC1091\n. \"$ROOT/.venv/bin/activate\"\npython \"$DIR/transcribe.py\" \"$@\"\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":426,"content_sha256":"6f5dff7acf7d596cbd0a81e577fdf4097df45aff6e3f10f7c55183feba92da4b"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"YouTube Transcribe","type":"text"}]},{"type":"paragraph","content":[{"text":"Turn a video — or a whole topic's worth of videos — into text you can actually read and reason over. The point is not to hand back a transcript and stop; it is to ","type":"text"},{"text":"absorb what the video teaches","type":"text","marks":[{"type":"strong"}]},{"text":" and report it back usefully.","type":"text"}]},{"type":"paragraph","content":[{"text":"Pipeline: ","type":"text"},{"text":"find → download → transcribe → (look at frames) → (ask Gemini) → synthesize.","type":"text","marks":[{"type":"strong"}]},{"text":" Most tasks only need the middle. Reach for the visual steps when the spoken words are not enough.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Setup (once per machine)","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"S=.claude/skills/youtube-transcribe/scripts\nbash \"$S/setup.sh\" # creates a venv, installs yt-dlp + elevenlabs + google-genai (idempotent)","type":"text"}]},{"type":"paragraph","content":[{"text":"If venv creation fails on Debian/Ubuntu, install ","type":"text"},{"text":"python3-venv","type":"text","marks":[{"type":"code_inline"}]},{"text":" first (","type":"text"},{"text":"sudo apt-get install -y python3-venv","type":"text","marks":[{"type":"code_inline"}]},{"text":").","type":"text"}]},{"type":"paragraph","content":[{"text":"Keys:","type":"text","marks":[{"type":"strong"}]},{"text":" transcription reads ","type":"text"},{"text":"ELEVENLABS_API_KEY","type":"text","marks":[{"type":"code_inline"}]},{"text":"; the Gemini fallback reads ","type":"text"},{"text":"GEMINI_API_KEY","type":"text","marks":[{"type":"code_inline"}]},{"text":". Export them, or drop a ","type":"text"},{"text":"scripts/load-keys.local.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":" that resolves them however you like (the wrappers source it automatically, and it is gitignored so it never ships). Never print a key into your output.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Mode A — one video","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"S=.claude/skills/youtube-transcribe/scripts\nOUT=/tmp/claude/youtube-transcribe/\u003cvideo-id> # scratch; never a repo\n\nbash \"$S/download.sh\" \"\u003curl>\" \"$OUT\" audio # audio.mp3 + metadata.json\nbash \"$S/transcribe.sh\" \"$OUT/audio.mp3\" \"$OUT\" # transcript.txt + .diarized.txt + .json","type":"text"}]},{"type":"paragraph","content":[{"text":"Then ","type":"text"},{"text":"read ","type":"text","marks":[{"type":"strong"}]},{"text":"transcript.diarized.txt","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" (speaker-grouped, one timestamped line every ~30-60 s, so even a single-speaker talk can be cited by minute) and write up what matters: the thesis, the steps/method, the concrete claims, the numbers, anything actionable. Skip the filler. If it is a tutorial, capture the actual how; if it is a talk, capture the argument and evidence.","type":"text"}]},{"type":"paragraph","content":[{"text":"transcribe.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":" flags: ","type":"text"},{"text":"--no-diarize","type":"text","marks":[{"type":"code_inline"}]},{"text":" (single speaker), ","type":"text"},{"text":"--lang spa","type":"text","marks":[{"type":"code_inline"}]},{"text":" (hint; omit to auto-detect), ","type":"text"},{"text":"--keyterms \"Kubernetes,PyTorch,yt-dlp\"","type":"text","marks":[{"type":"code_inline"}]},{"text":" (spell names/jargon right — Scribe will otherwise mangle them, which poisons the summary).","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Mode B — a topic (many videos)","type":"text"}]},{"type":"paragraph","content":[{"text":"Search is ","type":"text"},{"text":"free and needs no API key","type":"text","marks":[{"type":"strong"}]},{"text":" — it uses yt-dlp's own search.","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"S=.claude/skills/youtube-transcribe/scripts\n\n# 1. Find candidates — pick the good ones by title/channel/duration before spending transcription on them.\nbash \"$S/search.sh\" \"quantitative trading with LLMs\" 20 # id | duration | channel | title\nbash \"$S/search.sh\" \"quantitative trading with LLMs\" 20 --date # sort by newest instead of relevance\n\n# 2. Transcribe the chosen ones in one go (each lands in \u003cOUT>/\u003cvideo-id>/).\nbash \"$S/search.sh\" \"quantitative trading with LLMs\" 20 --urls > /tmp/urls.txt\n# ...edit /tmp/urls.txt down to the 10-15 worth watching, then:\nbash \"$S/batch.sh\" /tmp/claude/youtube-transcribe/topic /tmp/urls.txt --lang spa --keyterms \"IRPF,Hacienda\" # flags after the urls file go to every transcription","type":"text"}]},{"type":"paragraph","content":[{"text":"Be selective, not exhaustive: a 3-hour stream and a 40-second Short are rarely both worth it. Prefer substance (duration, channel authority, title specificity) over raw view count. Then read every transcript and produce ","type":"text"},{"text":"one synthesis","type":"text","marks":[{"type":"strong"}]},{"text":" across all of them — the consensus, the disagreements, the best single source, and what is still unanswered — not N separate summaries.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Seeing what is on screen","type":"text"}]},{"type":"paragraph","content":[{"text":"The transcript misses slides, charts, code, dashboards, product shots, and anyone pointing at \"this\". Two escalating tools:","type":"text"}]},{"type":"paragraph","content":[{"text":"1. Frames (cheap, local).","type":"text","marks":[{"type":"strong"}]},{"text":" Download the video, pull stills, and Read the JPGs.","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash \"$S/download.sh\" \"\u003curl>\" \"$OUT\" video # video.mp4 (≤720p)\nbash \"$S/frames.sh\" \"$OUT/video.mp4\" \"$OUT/frames\" every 30 # one frame / 30s\nbash \"$S/frames.sh\" \"$OUT/video.mp4\" \"$OUT/frames\" at 00:01:20,00:04:05 # exact moments from the transcript","type":"text"}]},{"type":"paragraph","content":[{"text":"Use timestamps from ","type":"text"},{"text":"transcript.diarized.txt","type":"text","marks":[{"type":"code_inline"}]},{"text":" to grab the exact moment someone says \"as you can see here\".","type":"text"}]},{"type":"paragraph","content":[{"text":"2. Gemini (last resort, needs GEMINI_API_KEY).","type":"text","marks":[{"type":"strong"}]},{"text":" When frames are not enough — you need the video ","type":"text"},{"text":"understood","type":"text","marks":[{"type":"em"}]},{"text":", on-screen text read, or a direct visual question answered. Gemini ingests the YouTube URL directly (no download); for a local file it uploads first.","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash \"$S/ask-gemini.sh\" \"\u003curl-or-local-mp4>\" \"What indicators are shown on the chart at minute 4, and what are their values?\"","type":"text"}]},{"type":"paragraph","content":[{"text":"Gemini is the fallback, not the default: transcription is cheaper, faster, and usually sufficient. Go to Gemini only when the answer is genuinely visual.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Output — absorb, do not dump","type":"text"}]},{"type":"paragraph","content":[{"text":"Default to a tight knowledge digest, not a wall of transcript:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"What it is:","type":"text","marks":[{"type":"strong"}]},{"text":" title, channel, length, one-line framing.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Core knowledge:","type":"text","marks":[{"type":"strong"}]},{"text":" the actual ideas/method/claims, in your own words, dense and specific.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Notable specifics:","type":"text","marks":[{"type":"strong"}]},{"text":" numbers, names, tools, steps, quotes worth keeping (with ","type":"text"},{"text":"[mm:ss]","type":"text","marks":[{"type":"code_inline"}]},{"text":" timestamps).","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Caveats / what's unproven or salesy.","type":"text","marks":[{"type":"strong"}]},{"text":" Many \"educational\" videos are funnels — say so plainly.","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Keep the raw ","type":"text"},{"text":"transcript.txt","type":"text","marks":[{"type":"code_inline"}]},{"text":" on disk and point to it; paste quotes, not the whole thing.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Scripts","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Script","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Does","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/setup.sh","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Create the venv, install deps (idempotent)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/search.sh \"\u003cq>\" [n] [--date] [--urls]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Find videos for a topic — free, no API key","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/download.sh \u003curl> \u003cout> [audio|video|both]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"yt-dlp audio (mp3) and/or video (≤720p) + metadata.json","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/transcribe.sh \u003caudio> \u003cout> [--no-diarize] [--lang] [--keyterms]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ElevenLabs Scribe v2 → text + diarized + raw json","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/batch.sh \u003coutdir> \u003curls-file> [--lang] [--keyterms] [--no-diarize]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Download+transcribe many; one folder per video + manifest; flags are passed to every transcription","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/frames.sh \u003cvideo> \u003cout> every \u003csec> | at \u003cts,ts>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Extract stills to Read","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/ask-gemini.sh \u003curl|file> \"\u003cquestion>\"","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Gemini visual understanding (fallback)","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Notes","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Scratch only.","type":"text","marks":[{"type":"strong"}]},{"text":" Media and transcripts go in ","type":"text"},{"text":"/tmp/claude/youtube-transcribe/…","type":"text","marks":[{"type":"code_inline"}]},{"text":", never in a repo. They can be large.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Scribe limits:","type":"text","marks":[{"type":"strong"}]},{"text":" 3 GB / 10 h per file; 90+ languages, auto-detected. A ~12 min talk is a single call.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Age-restricted / members-only / private","type":"text","marks":[{"type":"strong"}]},{"text":" videos may need cookies (","type":"text"},{"text":"yt-dlp --cookies-from-browser","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"--cookies","type":"text","marks":[{"type":"code_inline"}]},{"text":"). For Gemini, prefer uploading the downloaded file over passing a URL it cannot reach.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"This is for learning from public videos.","type":"text","marks":[{"type":"strong"}]},{"text":" Respect copyright and each platform's terms; do not republish someone's content as your own.","type":"text"}]}]}]}]},"metadata":{"date":"2026-11-02","name":"youtube-transcribe","author":"@skillopedia","source":{"stars":0,"repo_name":"youtube-transcribe","origin_url":"https://github.com/marks97/youtube-transcribe/blob/HEAD/youtube-transcribe/SKILL.md","repo_owner":"marks97","body_sha256":"394c0d0b3933884c15705692347f148181c668fff605a0c6bcab9cd9e873c4cc","cluster_key":"34eb3641288fd6e3f0f3507c1806286563e4a75d2bff71c82632286f0584c19a","clean_bundle":{"format":"clean-skill-bundle-v1","source":"marks97/youtube-transcribe/youtube-transcribe/SKILL.md","text_bytes":14018,"source_commit":"2531ccbb6bd956e2475f6cb51f88930d1567980b","skills_sh_rank":13099,"attachment_count":10,"text_attachments":10,"attachment_storage":"skill_attachments","binary_attachments":0},"cluster_size":1,"skill_md_path":"youtube-transcribe/SKILL.md","import_metadata":{"date":"2026-11-02","author":"@skillopedia","version":"v1","category":"media-content","category_label":"Media"},"exact_dupes_collapsed_into_this":0},"license":"MIT","version":"v1","category":"media-content","metadata":{"openclaw":{"requires":{"env":["ELEVENLABS_API_KEY"]},"primaryEnv":"ELEVENLABS_API_KEY","optionalEnv":["GEMINI_API_KEY"]}},"import_tag":"skills-sh-top20k-2026-11","description":"Absorb the knowledge in YouTube videos — find them, transcribe them with ElevenLabs Scribe v2, inspect their visuals, and digest what they actually teach. Use this whenever someone wants a video's content as text or knowledge rather than just a link — \"transcribe this YouTube video\", \"what does this video say\", \"summarize/explain this talk\", \"pull the transcript\", \"get subtitles\", \"turn this lecture into notes\", or research-style asks like \"find 10-20 videos about \u003ctopic> and tell me everything\", \"research \u003ctopic> on YouTube\", \"what are people saying about \u003cX>\". Also use it when a question needs what is shown on screen (slides, charts, code, UI, product) and not only what is said — it extracts frames and, as a last resort, asks Google Gemini to describe the video. Works on any yt-dlp-supported URL. Trigger it even when the words \"transcribe\" or \"skill\" never appear but the goal is to learn from video.","compatibility":"Needs internet, ffmpeg, and python3 (with python3-venv). ELEVENLABS_API_KEY is required for transcription; GEMINI_API_KEY is optional and only used for the visual fallback."}},"renderedAt":1793666653369}

YouTube Transcribe Turn a video — or a whole topic's worth of videos — into text you can actually read and reason over. The point is not to hand back a transcript and stop; it is to absorb what the video teaches and report it back usefully. Pipeline: find → download → transcribe → (look at frames) → (ask Gemini) → synthesize. Most tasks only need the middle. Reach for the visual steps when the spoken words are not enough. Setup (once per machine) If venv creation fails on Debian/Ubuntu, install first ( ). Keys: transcription reads ; the Gemini fallback reads . Export them, or drop a that reso…