YouTube-Untertitel annotieren
Wie du Untertitel mit yt-dlp herunterlädst und in Potato annotierst, was automatisch erzeugte Untertitel hergeben und was nicht, wie du mit dem Video umgehst und was vor der Weitergabe von Medien zu klären ist.
Lade die Untertitel mit yt-dlp herunter und richte Potato auf die Dateien. Vorher das Wichtigste: Automatisch erzeugte Untertitel haben keine Satzzeichen und keine Sprecherlabels, und ihre Zeilenumbrüche sagen nichts aus, was einschränkt, was sich sinnvoll annotieren lässt. Potato liest jedes Untertitelformat, das yt-dlp ausgibt. Die vollständige Liste steht unter Transkriptformate.
Videoplattformen sind eine große und bequeme Quelle für natürlich gesprochene Sprache. Untertitelung macht diese Sprache zu Text, und der Text ist klein, leicht zu bewegen und leicht zu annotieren. Der Haken: Untertitel sind nicht gleich Untertitel, und sie so zu behandeln, ist der Punkt, an dem die meisten untertitelbasierten Annotationsprojekte schiefgehen.
Wie lade ich die Untertitel herunter?
yt-dlp holt Untertitel mit oder ohne die Medien:
# Human-written subtitles, if the uploader provided any
yt-dlp --write-subs --sub-langs en --skip-download <URL>
# Auto-generated captions
yt-dlp --write-auto-subs --sub-langs en --sub-format vtt --skip-download <URL>Potato liest vtt, srt, json3, ttml sowie die Varianten srv1, srv2 und srv3, welches --sub-format du also auch wählst, es wird geparst. Entscheide danach, was du behalten willst: json3 bewahrt die Zeiten pro Wort, während sich WebVTT und SubRip leichter von Hand lesen und bearbeiten lassen.
Was unterscheidet menschliche von automatischen Untertiteln?
Im Texteditor sehen sie gleich aus, als Annotationseingabe verhalten sie sich sehr unterschiedlich:
| Menschliche Untertitel | Automatische Untertitel | |
|---|---|---|
| Satzzeichen | Ja | Nein oder unzuverlässig |
| Satzgrenzen | Aussagekräftig | Willkürlich |
| Sprecher | Manchmal, über <v Name>-Tags | Nie |
| Wortzeiten | Nein | Ja, in json3 |
| Wortgetreu | Oft fürs Lesen gekürzt | Näher am Gesagten |
Keines von beiden ist grundsätzlich besser. Menschliche Untertitel lesen sich gut, werden aber der Lesbarkeit zuliebe redigiert, verlieren also Füllwörter, verdichten Wiederholungen und formulieren manchmal einen ganzen Satz um. Automatische Untertitel sind näher am Wortlaut, was du für alles brauchst, das vom tatsächlichen Sprechen handelt, kommen aber als Strom ohne Satzzeichen an.
Was lässt sich auf automatischen Untertiteln annotieren?
Entwirf kein Annotationsschema auf Satzebene über automatischen Untertiteln. Ihre Cue-Grenzen liegen dort, wo das Untertitelfenster voll war, nicht dort, wo ein Satz endete. Ein Cue in einer Datei mit Autountertiteln ist ein Anzeigeartefakt, keine sprachliche Einheit. Bittest du Annotierende, Sätze zu bewerten, setzt jede Person stillschweigend andere Satzgrenzen, und deine Übereinstimmungswerte messen am Ende genau das statt dessen, worum es dir ging.
Zwei gangbare Wege:
- Die Untertitelfenster so annotieren, wie sie sind. Labele jeden Cue mit dem, was auf ihn zutrifft, und nimm hin, dass die Einheit willkürlich, aber einheitlich ist. Taugt für Thema, das Vorliegen eines Phänomens oder alles, was sich an einem Fragment beurteilen lässt.
- Vorgelagert neu segmentieren. Ein Modell zur Wiederherstellung der Zeichensetzung oder ein ASR-System mit Zeichensetzung laufen lassen und neu takten. Mehr Aufwand, dafür echte Einheiten.
Mit menschlichen Untertiteln erübrigt sich das Problem weitgehend. Die Cue-Grenzen hat jemand beim Mitlesen gesetzt, sie respektieren also meist die Teilsätze.
Und das Video?
Untertitel sind klein und leicht weiterzugeben. Video meist nicht. Drei Möglichkeiten:
# Media hosted somewhere your annotators can reach
potato transcripts ./captions --media-url-prefix https://cdn.example.org/video -o data/talks.json
# Media downloaded locally as audio only
yt-dlp -f 'ba' -x --audio-format mp3 -o './audio/%(id)s.%(ext)s' <URL>
potato transcripts ./captions --media-dir ./audio -o data/talks.jsonDie dritte Möglichkeit sind gar keine Medien. Transkripte ohne Medien lassen sich gut annotieren, die Annotierenden lesen statt zu hören. Wenn das dein Plan ist, schreib es in die Anweisungen, sonst halten die Annotierenden den fehlenden Player für einen Fehler und melden ihn als solchen.
Achtung: Kläre deine Rechte, bevor du etwas weitergibst, das nicht von dir stammt. Untertitel oder Medien für die eigene Forschung herunterzuladen ist eine andere Frage, als diese Medien einem Pool von Annotierenden auszuliefern, und Plattformbedingungen, Urheberrecht und die Regeln deiner Einrichtung spielen alle hinein. Kläre das, bevor du die Pipeline baust, nicht danach.
Wie richte ich die Aufgabe ein?
Der Konverter schreibt eine Datendatei mit bereits normalisiertem Transkript:
potato transcripts ./captions --media-dir ./audio -o data/talks.json{
"id": "talk_01",
"conversation": {
"audio": "audio/talk_01.mp3",
"turns": [
{"turn_id": "t0", "speaker": null, "start": 0.0, "end": 4.2,
"text": "so the thing about caption windows is"}
]
}
}speaker: null ist das, was ein automatischer Untertitel hergibt. Solche Turns erscheinen als Unassigned mit einer Auswahl, sodass Annotierende sie beim Hören zuordnen können.
Automatische Untertitel führen keine Sprecher, jeder Cue bleibt also Unassigned, bis eine annotierende Person einen auswählt
annotation_task_name: "Talk Annotation"
task_dir: .
data_files:
- data/talks.json
item_properties:
id_key: id
text_key: conversation
instance_display:
fields:
- key: conversation
type: audio_dialogue
label: "Captions"
span_target: true
display_options:
show_timestamps: true
allow_speaker_assignment: auto
annotation_schemes:
- annotation_type: radio
name: cue_topic
description: "What is this caption window about?"
labels: [setup, argument, example, aside]turn_level: true hängt die Frage an jeden Cue statt an das Video als Ganzes, was die richtige Einheit ist, wenn du nur die Cues hast. Starten:
python potato/flask_server.py start config.yaml -p 8000Du kannst den Konverter auch ganz weglassen und eine Datendatei direkt auf die Untertiteldateien auf der Platte zeigen lassen. Siehe Whisper-Transkripte annotieren, wo der Rest dieser Arbeitsweise gleich läuft.
Weiterführende Lektüre
- Transkriptformate, alle unterstützten Untertitel- und Transkriptformate
- Whisper-Transkripte annotieren, dieselbe Arbeitsweise ausgehend von ASR-Ausgaben
- Transcript Format Ingestion, ein lauffähiges Showcase-Design mit sechs Formaten nebeneinander
- Video-Annotation, um das Video statt seiner Untertitel zu annotieren
- Datenformate für die Annotation entwerfen
- Timed Text Markup Language, der Untertitelstandard aus dem Rundfunk, den Potato ebenfalls liest