YouTube-transkripsjon
Laster ned transkripsjoner (undertekster/bildetekster) fra YouTube-videoer. Fungerer med både manuelt opprettede og automatisk genererte transkripsjoner. Ingen API-nøkkel eller nettleser kreves — bruker YouTubes InnerTube-API direkte og faller automatisk tilbake til yt-dlp når YouTube blokkerer den direkte API-stien.
Henter videometadata og forsidebilde ved første kjøring, hurtiglagrer rådata for rask omformatering.
Skriptkatalog
Skript i scripts/-underkatalogen. {baseDir} = denne SKILL.md-filens katalogbane. Løs opp ${BUN_X}-kjøretid: hvis bun er installert → bun; hvis npx er tilgjengelig → npx -y bun; ellers foreslå å installere bun. Erstatt {baseDir} og ${BUN_X} med faktiske verdier.
| Skript | Formål |
|---|---|
scripts/main.ts | CLI for nedlasting av transkripsjon |
Bruk
# Standard: markdown med tidsstempler (engelsk)
${BUN_X} {baseDir}/scripts/main.ts <youtube-url-eller-id>
# Spesifiser språk (prioritetsrekkefølge)
${BUN_X} {baseDir}/scripts/main.ts <url> --languages zh,en,ja
# Uten tidsstempler
${BUN_X} {baseDir}/scripts/main.ts <url> --no-timestamps
# Med kapittelinndeling
${BUN_X} {baseDir}/scripts/main.ts <url> --chapters
# Med taleridentifikasjon (krever AI-etterbehandling)
${BUN_X} {baseDir}/scripts/main.ts <url> --speakers
# SRT-undertekstfil
${BUN_X} {baseDir}/scripts/main.ts <url> --format srt
# Oversett transkripsjon
${BUN_X} {baseDir}/scripts/main.ts <url> --translate zh-Hans
# List opp tilgjengelige transkripsjoner
${BUN_X} {baseDir}/scripts/main.ts <url> --list
# Tving ny henting (ignorer hurtiglager)
${BUN_X} {baseDir}/scripts/main.ts <url> --refresh
Alternativer
| Alternativ | Beskrivelse | Standard |
|---|---|---|
<url-or-id> | YouTube-URL eller video-ID (flere tillatt) | Påkrevet |
--languages <koder> | Språkkoder, kommas separert, i prioritetsrekkefølge | en |
--format <fmt> | Utdataformat: text, srt | text |
--translate <kode> | Oversett til angitt språkkode | |
--list | List opp tilgjengelige transkripsjoner i stedet for å hente | |
--timestamps | Inkluder [TT:MM:SS → TT:MM:SS]-tidsstempler per avsnitt | på |
--no-timestamps | Deaktiver tidsstempler | |
--chapters | Kapittelinndeling fra videobeskrivelsen | |
--speakers | Rå transkripsjon med metadata for taleridentifikasjon | |
--exclude-generated | Hopp over automatisk genererte transkripsjoner | |
--exclude-manually-created | Hopp over manuelt opprettede transkripsjoner | |
--refresh | Tving ny henting, ignorer hurtiglagrede data | |
-o, --output <bane> | Lagre til spesifikk filbane | automatisk generert |
--output-dir <mappe> | Basis utdatamappe | youtube-transcript |
Valgfrie miljøvariabler
| Variabel | Beskrivelse |
|---|---|
YOUTUBE_TRANSCRIPT_COOKIES_FROM_BROWSER | Sendes til yt-dlp --cookies-from-browser under tilbakefall, f.eks. chrome, safari, firefox, eller chrome:Profile 1 |
Inndataformater
Godtar hvilken som helst av disse som videoinndata:
- Full URL:
https://www.youtube.com/watch?v=dQw4w9WgXcQ - Kort URL:
https://youtu.be/dQw4w9WgXcQ - Innbyggings-URL:
https://www.youtube.com/embed/dQw4w9WgXcQ - Shorts-URL:
https://www.youtube.com/shorts/dQw4w9WgXcQ - Video-ID:
dQw4w9WgXcQ
Utdataformater
| Format | Filendelse | Beskrivelse |
|---|---|---|
text | .md | Markdown med frontmatter (inkl. description), titteloverskrift, sammendrag, valgfri innholdsfortegnelse/forsidebilde/tidsstempler/kapitler/talere |
srt | .srt | SubRip-undertekstformat for videospillere |
Utdatamappe
youtube-transcript/
├── .index.json # Video-ID → mappebane-mapping (for hurtiglager-oppslag)
└── {channel-slug}/{title-full-slug}/
├── meta.json # Videometadata (tittel, kanal, beskrivelse, varighet, kapitler, osv.)
├── transcript-raw.json # Rå transkripsjonsutdrag fra YouTube-API (hurtiglagret)
├── transcript-sentences.json # Setningssegmentert transkripsjon (delt ved tegnsetting, slått sammen på tvers av utdrag)
├── imgs/
│ └── cover.jpg # Videominiatyrbilde
├── transcript.md # Markdown-transkripsjon (generert fra setninger)
└── transcript.srt # SRT-undertekst (generert fra råutdrag, hvis --format srt)
{channel-slug}: Kanalnavn i kebab-case{title-full-slug}: Full videotittel i kebab-case
--list-modus sender ut til stdout bare (ingen fil lagret).
Hurtiglaging
Ved første henting lagrer skriptet:
meta.json— videometadata, kapitler, forsidebildesti, språkinformasjontranscript-raw.json— rå transkripsjonsutdrag fra YouTube-API ({ text, start, duration }[])transcript-sentences.json— setningssegmentert transkripsjon ({ text, start: "TT:mm:ss", end: "TT:mm:ss" }[]), delt ved setningsavsluttende tegnsetting (.?!…。?!osv.), tidsstempler proporsjonalt fordelt etter tegnlengde, CJK-bevisst tekstsammenslåingimgs/cover.jpg— videominiatyrbilde
Påfølgende kjøringer for samme video bruker hurtiglagrede data (ingen nettverkskall). Bruk --refresh for å tvinge ny henting. Hvis et annet språk er forespurt, blir hurtiglageret automatisk oppdatert.
Når YouTube returnerer anti-bot / blokkerte svar på den direkte InnerTube-stien, prøver skriptet på nytt med alternative klientidentiteter og faller deretter tilbake til yt-dlp hvis tilgjengelig. Hvis tilbakefall er nødvendig, men yt-dlp er utilgjengelig, bør agenten selv avgjøre hvordan yt-dlp gjøres tilgjengelig og fortsette i stedet for å dytte installasjonsbeslutningen over på brukeren.
SRT-utdata (--format srt) genereres fra transcript-raw.json. Tekst-/markdown-utdata bruker transcript-sentences.json for naturlige setningsgrenser.
Arbeidsflyt
Når brukeren oppgir en YouTube-URL og ønsker transkripsjonen:
- Kjør med
--listførst hvis brukeren ikke har spesifisert et språk, for å vise tilgjengelige alternativer - Sett alltid URL-en i enkle anførselstegn når du kjører skriptet — zsh behandler
?som et glob-jokertegn, så en ubeskyttet YouTube-URL forårsaker «no matches found»: bruk'https://www.youtube.com/watch?v=ID' - Standard: kjør med
--chapters --speakersfor den rikeste utdataen (kapitler + taleridentifikasjon) - Skriptet lagrer automatisk hurtiglagrede data + utdatafil og skriver ut filbanen
- For
--speakers-modus: etter at skriptet har lagret råfilen, følg arbeidsflyten for taleridentifikasjon nedenfor for å etterbehandle med taleretiketter
Når brukeren bare ønsker et forsidebilde eller metadata, vil kjøring av skriptet med ethvert alternativ også hurtiglagre meta.json og imgs/cover.jpg.
Ved omformatering av samme video (f.eks. først tekst så SRT), gjenbrukes de hurtiglagrede dataene — ingen ny henting nødvendig.
Arbeidsflyt for kapitler og talere
Kapitler (--chapters)
Skriptet analyserer kapitteltidsstempler fra videobeskrivelsen (f.eks. 0:00 Introduksjon), segmenterer transkripsjonen etter kapittelgrenser, grupperer utdrag i lesbare avsnitt, og lagrer som .md med en innholdsfortegnelse. Ingen videre behandling nødvendig.
Hvis ingen kapitteltidsstempler finnes i beskrivelsen, sendes transkripsjonen ut som grupperte avsnitt uten kapitteloverskrifter.
Taleridentifikasjon (--speakers)
Taleridentifikasjon krever AI-behandling. Skriptet sender ut en rå .md-fil som inneholder:
- YAML-frontmatter med videometadata (tittel, kanal, dato, forsidebilde, beskrivelse, språk)
- Videobeskrivelse (for uttrekk av talernavn)
- Kapitelliste fra beskrivelse (hvis tilgjengelig)
- Rå transkripsjon i SRT-format (forhåndsberegnede start-/sluttidsstempler, tokeneffektivt)
Etter at skriptet har lagret råfilen, start en underagent (bruk en billigere modell som Sonnet for kostnadseffektivitet) for å behandle taleridentifikasjon:
- Les den lagrede
.md-filen - Les promptmalen på
{baseDir}/prompts/speaker-transcript.md - Behandle den rå transkripsjonen i henhold til prompten:
- Identifiser talere ved hjelp av videometadata (tittel → gjest, kanal → vert, beskrivelse → navn)
- Oppdag talerskifter fra samtale flyt, spørsmål-svar-mønstre og kontekstuelle ledetråder
- Segmenter i kapitler (bruk beskrivelseskapitler hvis tilgjengelig, ellers lag fra emneskifter)
- Formater med
**Talernavn:**-etiketter, avsnittsgruppering (2-4 setninger), og[TT:MM:SS → TT:MM:SS]-tidsstempler
- Overskriv
.md-filen med den behandlede transkripsjonen (behold YAML-frontmatteren)
Når --speakers brukes, er --chapters underforstått — den behandlede utdataen inkluderer alltid kapittelinndeling.
Feiltilfeller
| Feil | Betydning |
|---|---|
| Transkripsjoner deaktivert | Videoen har ingen undertekster i det hele tatt |
| Ingen transkripsjon funnet | Forespurt språk er ikke tilgjengelig |
| Video utilgjengelig | Videoen er slettet, privat eller regionslåst |
| IP blokkert | For mange forespørsler, prøv igjen senere |
| Aldersbegrenset | Videoen krever innlogging for aldersverifisering |
| bot oppdaget | Skriptet prøver på nytt med alternative klienter og deretter yt-dlp; hvis tilbakefallsverktøy mangler, bør agenten løse det selv, ellers hvis det fortsatt mislykkes, prøv YOUTUBE_TRANSCRIPT_COOKIES_FROM_BROWSER=safari (eller din nettleser) |


