YouTube-transskription
Downloader transskriptioner (undertekster/tekstning) fra YouTube-videoer. Fungerer med både manuelt oprettede og automatisk genererede transskriptioner. Ingen API-nøgle eller browser påkrævet — bruger YouTubes InnerTube API direkte og falder automatisk tilbage på yt-dlp, når YouTube blokerer den direkte API-sti.
Henter video-metadata og forsidebillede ved første kørsel, cacher rådata for hurtig reformattering.
Scriptbibliotek
Scripts i underbiblioteket scripts/. {baseDir} = denne SKILL.md-fils bibliotekssti. Opløs ${BUN_X}-køretid: hvis bun er installeret → bun; hvis npx er tilgængelig → npx -y bun; ellers foreslå installation af bun. Erstat {baseDir} og ${BUN_X} med faktiske værdier.
| Script | Formål |
|---|---|
scripts/main.ts | CLI til transskriptionsdownload |
Brug
# Standard: markdown med tidsstempler (engelsk)
${BUN_X} {baseDir}/scripts/main.ts <youtube-url-or-id>
# Angiv sprog (prioritetsrækkefølge)
${BUN_X} {baseDir}/scripts/main.ts <url> --languages zh,en,ja
# Uden tidsstempler
${BUN_X} {baseDir}/scripts/main.ts <url> --no-timestamps
# Med kapitelinddeling
${BUN_X} {baseDir}/scripts/main.ts <url> --chapters
# Med taleridentifikation (kræver AI-efterbehandling)
${BUN_X} {baseDir}/scripts/main.ts <url> --speakers
# SRT-undertekstfil
${BUN_X} {baseDir}/scripts/main.ts <url> --format srt
# Oversæt transskription
${BUN_X} {baseDir}/scripts/main.ts <url> --translate zh-Hans
# Vis tilgængelige transskriptioner
${BUN_X} {baseDir}/scripts/main.ts <url> --list
# Tving genhentning (ignorér cache)
${BUN_X} {baseDir}/scripts/main.ts <url> --refresh
Indstillinger
| Indstilling | Beskrivelse | Standard |
|---|---|---|
<url-or-id> | YouTube-URL eller video-id (flere tilladt) | Påkrævet |
--languages <codes> | Sprogkoder, kommasepareret, i prioritetsrækkefølge | en |
--format <fmt> | Outputformat: text, srt | text |
--translate <code> | Oversæt til angivet sprogkode | |
--list | Vis tilgængelige transskriptioner i stedet for at hente | |
--timestamps | Inkludér tidsstempler pr. afsnit i formatet [HH:MM:SS → HH:MM:SS] | til |
--no-timestamps | Deaktiver tidsstempler | |
--chapters | Kapitelinddeling fra videobeskrivelse | |
--speakers | Rå transskription med metadata til taleridentifikation | |
--exclude-generated | Spring automatisk genererede transskriptioner over | |
--exclude-manually-created | Spring manuelt oprettede transskriptioner over | |
--refresh | Tving genhentning, ignorér cachedata | |
-o, --output <path> | Gem til specifik filsti | auto-genereret |
--output-dir <dir> | Basis output-bibliotek | youtube-transcript |
Valgfri miljøvariabler
| Variabel | Beskrivelse |
|---|---|
YOUTUBE_TRANSCRIPT_COOKIES_FROM_BROWSER | Videresendes til yt-dlp --cookies-from-browser under fallback, f.eks. chrome, safari, firefox eller chrome:Profile 1 |
Inputformater
Accepterer enhver af disse som videoinput:
- Fuld URL:
https://www.youtube.com/watch?v=dQw4w9WgXcQ - Kort URL:
https://youtu.be/dQw4w9WgXcQ - Indlejrings-URL:
https://www.youtube.com/embed/dQw4w9WgXcQ - Shorts-URL:
https://www.youtube.com/shorts/dQw4w9WgXcQ - Video-ID:
dQw4w9WgXcQ
Outputformater
| Format | Filendelse | Beskrivelse |
|---|---|---|
text | .md | Markdown med frontmatter (inkl. description), titeloverskrift, resumé, valgfri indholdsfortegnelse/cover/tidsstempler/kapitler/talere |
srt | .srt | SubRip-undertekstformat til videoafspillere |
Output-bibliotek
youtube-transcript/
├── .index.json # Video-ID → bibliotekssti-mapping (til cacheopslag)
└── {channel-slug}/{title-full-slug}/
├── meta.json # Video-metadata (titel, kanal, beskrivelse, varighed, kapitler, osv.)
├── transcript-raw.json # Rå transskriptionsuddrag fra YouTube API (cachet)
├── transcript-sentences.json # Sætningsopdelt transskription (opdelt efter tegnsætning, flettet på tværs af uddrag)
├── imgs/
│ └── cover.jpg # Video-miniaturebillede
├── transcript.md # Markdown-transskription (genereret fra sætninger)
└── transcript.srt # SRT-undertekst (genereret fra rå uddrag, hvis --format srt)
{channel-slug}: Kanalnavn i kebab-case{title-full-slug}: Fuld videotitel i kebab-case
Funktionen --list udskriver kun til stdout (ingen fil gemmes).
Caching
Ved første hentning gemmer scriptet:
meta.json— video-metadata, kapitler, forsidebilledsti, sproginfotranscript-raw.json— rå transskriptionsuddrag fra YouTube API ({ text, start, duration }[])transcript-sentences.json— sætningsopdelt transskription ({ text, start: "HH:mm:ss", end: "HH:mm:ss" }[]), opdelt efter sætningsafsluttende tegnsætning (.?!…。?!osv.), tidsstempler proportionelt fordelt efter tegnlængde, CJK-bevidst tekstsammenfletningimgs/cover.jpg— video-miniaturebillede
Efterfølgende kørsler for den samme video bruger cachede data (ingen netværkskald). Brug --refresh for at tvinge genhentning. Hvis et andet sprog anmodes om, opdateres cachen automatisk.
Når YouTube returnerer anti-bot / blokerede svar på den direkte InnerTube-sti, prøver scriptet igen med alternative klientidentiteter og falder derefter tilbage på yt-dlp, hvis det er tilgængeligt. Hvis fallback er nødvendig, men yt-dlp ikke er tilgængelig, skal agenten beslutte, hvordan yt-dlp gøres tilgængelig, og fortsætte i stedet for at skubbe installationsbeslutningen til brugeren.
SRT-output (--format srt) genereres fra transcript-raw.json. Tekst-/markdown-output bruger transcript-sentences.json for naturlige sætningsgrænser.
Arbejdsgang
Når brugeren angiver en YouTube-URL og ønsker transskriptionen:
- Kør med
--listførst, hvis brugeren ikke har angivet et sprog, for at vise tilgængelige muligheder - Sæt altid URL'en i enkelte anførselstegn, når scriptet køres — zsh behandler
?som et glob-jokertegn, så en URL uden anførselstegn forårsager "ingen matches fundet": brug'https://www.youtube.com/watch?v=ID' - Standard: kør med
--chapters --speakersfor det rigeste output (kapitler + taleridentifikation) - Scriptet auto-gemmer cachede data + outputfil og udskriver filstien
- For
--speakers-tilstand: efter scriptet har gemt råfilen, følg arbejdsgangen for taleridentifikation nedenfor for at efterbehandle med taleretiketter
Når brugeren kun ønsker et forsidebillede eller metadata, vil kørsel af scriptet med en hvilken som helst indstilling også cache meta.json og imgs/cover.jpg.
Ved reformattering af den samme video (f.eks. først tekst derefter SRT), genbruges de cachede data — ingen genhentning nødvendig.
Kapitel- og talerarbejdsgang
Kapitler (--chapters)
Scriptet analyserer kapitel-tidsstempler fra videobeskrivelsen (f.eks. 0:00 Introduktion), opdeler transskriptionen efter kapitelgrænser, grupperer uddrag i læsbare afsnit og gemmer som .md med en indholdsfortegnelse. Ingen yderligere behandling nødvendig.
Hvis der ikke findes kapitel-tidsstempler i beskrivelsen, udskrives transskriptionen som grupperede afsnit uden kapiteloverskrifter.
Taleridentifikation (--speakers)
Taleridentifikation kræver AI-behandling. Scriptet udsender en rå .md-fil, der indeholder:
- YAML frontmatter med video-metadata (titel, kanal, dato, forside, beskrivelse, sprog)
- Videobeskrivelse (til udtræk af talernavne)
- Kapitelliste fra beskrivelse (hvis tilgængelig)
- Rå transskription i SRT-format (forudberegnede start-/sluttidsstempler, token-effektiv)
Efter scriptet har gemt råfilen, start en underagent (brug en billigere model som Sonnet for omkostningseffektivitet) til at behandle taleridentifikation:
- Læs den gemte
.md-fil - Læs prompt-skabelonen på
{baseDir}/prompts/speaker-transcript.md - Behandl den rå transskription i henhold til prompten:
- Identificer talere ved hjælp af video-metadata (titel → gæst, kanal → vært, beskrivelse → navne)
- Registrer talerskift ud fra samtale-flow, spørgsmål-svar-mønstre og kontekstuelle signaler
- Opdel i kapitler (brug beskrivelseskapitler, hvis tilgængelige, ellers opret ud fra emneskift)
- Formater med
**Talernavn:**-etiketter, afsnitsgruppering (2-4 sætninger) og[HH:MM:SS → HH:MM:SS]tidsstempler
- Overskriv
.md-filen med den behandlede transskription (behold YAML frontmatter)
Når --speakers bruges, er --chapters underforstået — det behandlede output inkluderer altid kapitelinddeling.
Fejlsager
| Fejl | Betydning |
|---|---|
| Transskriptioner deaktiveret | Videoen har slet ingen undertekster |
| Ingen transskription fundet | Det anmodede sprog er ikke tilgængeligt |
| Video utilgængelig | Video slettet, privat eller regionslåst |
| IP blokeret | For mange anmodninger, prøv igen senere |
| Aldersbegrænset | Video kræver login til aldersbekræftelse |
| bot opdaget | Scriptet prøver igen med alternative klienter og derefter yt-dlp; hvis fallback-værktøj mangler, skal agenten selv løse det, ellers hvis det stadig fejler, prøv YOUTUBE_TRANSCRIPT_COOKIES_FROM_BROWSER=safari (eller din browser) |


