Die meisten YouTube-Videos haben ein Transkript, und bei den meisten stammt es von einer Spracherkennung. Zum Mitlesen reicht das. Für ein Zitat in einer Arbeit, einem Nachrichtenartikel oder einem Rechtsvermerk stellt sich die Frage, wie weit der automatische Text von dem abweicht, was gesagt wurde, und ob seine Zeitstempel auf die richtige Sekunde zeigen. Ein Video mit beiden Arten von Untertiteln gibt eine direkte Antwort.

Das Video ist der NASA-Upload von Präsident Kennedys Rede von 1962 an der Rice University (WZyRbnpGyzQ, 18 Minuten). Es hat zwei englische Spuren: eine von einem Menschen geschriebene und eine von YouTube generierte. Beide lassen sich mit dem Python-Paket youtube-transcript-api auflisten und herunterladen:

from youtube_transcript_api import YouTubeTranscriptApi tracks = YouTubeTranscriptApi().list("WZyRbnpGyzQ") for t in tracks: print(t.language_code, t.is_generated, t.language) # en False English - Caption # en True English (auto-generated)  manual = tracks.find_manually_created_transcript(["en"]).fetch().to_raw_data() auto = tracks.find_generated_transcript(["en"]).fetch().to_raw_data() 

Jeder Eintrag ist eine Textzeile mit Startzeit und Dauer in Sekunden.

Wie weit die beiden Spuren auseinanderliegen

Wortweise verglichen (kleingeschrieben, ohne Satzzeichen, abgeglichen mit Pythons difflib.SequenceMatcher), stimmen die beiden Spuren bei etwa 95 % der Rede überein:

Von einem Menschen geschrieben Automatisch generiert
Zeilen 183 332
Wörter 2,233 2,211
Satzzeichen 255 4
Abweichende Wörter etwa 143 (6 %)

Sechs Prozent klingen wenig, bis man sich ansieht, um welche Wörter es geht. Spracherkennung kommt mit häufigen Wörtern gut zurecht und schlecht mit Namen, Zahlen und Fachbegriffen, also genau mit den Stellen, an denen ein Zitat hängt:

Von einem Menschen geschrieben Automatisch generiert
President Pitzer President pit
launched John Glenn launched John gland
a Saturn C-1 booster rocket a satin C1
Cape Canaveral (second mention) canabal
we are willing to accept we're willing to accept

Dazu kommt eine Lücke. Bei etwa 4:47 springt die automatische Spur von "both must be" direkt zu "determined and cannot be deterred". Die 28 Wörter dazwischen, "enterprised and overcome with answerable courage. If this capsule history of our progress teaches us anything, it is that man, in his quest for knowledge and progress, is", fehlen komplett. Nichts in der automatischen Spur markiert die Lücke.

Was mit dem berühmten Satz passiert

Der Satz, den man aus dieser Rede zitiert, steht bei 9:18. In der menschlichen Spur ist er eine Zeile mit Zeichensetzung und einer Startzeit:

558.90 3.65 not because they are easy, but because they are hard, 

In der automatischen Spur verteilt er sich auf drei überlappende Zeilen, und das erste Wort gehört zur Zeile davor:

555.64 4.80 decade and do the other things not 558.20 6.52 because they are easy but because they 560.44 7.04 are hard because that goal will serve to 

Automatische Untertitel sind für die Laufanzeige gebaut, ein paar Wörter auf einmal, daher folgen ihre Zeilen dem Timing der Sprache und nicht den Sätzen. Fürs Zitieren ergeben sich daraus zwei Dinge. Wer die Zeile bei 9:18 kopiert, erhält ein Fragment, das mitten im Satz beginnt, und die Startzeit der Zeile, die „not“ enthält, ist 9:15, drei Sekunden vor dem Zitat. Als Untertitel ist beides nicht falsch, als Quellenangabe schon.

Die Grammatik bleibt in diesem Fall erhalten, "they are", anders als in der Version, die die meisten im Kopf haben ("because it is hard"). Aber "we are willing" wurde einige Zeilen später zu "we're willing", und ein Zitat aus der automatischen Spur würde Kennedy eine Kontraktion in den Mund legen, die er nicht gesagt hat.

Die Spur wählen, und der Link

Das Transkript-Werkzeug der osFoundry-Desktop-App, das Untertitel von dem Rechner holt, auf dem es läuft, trifft die Auswahl in ein paar Zeilen Rust. YouTube kennzeichnet automatische Spuren mit kind: "asr", und die App nimmt zuerst eine menschliche englische Spur, dann irgendeine englische, dann irgendeine menschliche und sonst, was da ist:

fn pick_track(tracks: &[CaptionTrack]) -> Option<&CaptionTrack> { tracks .iter() .find(|t| t.language_code.starts_with("en") && t.kind != "asr") .or_else(|| tracks.iter().find(|t| t.language_code.starts_with("en"))) .or_else(|| tracks.iter().find(|t| t.kind != "asr")) .or_else(|| tracks.first()) } 

Die von einem Menschen geschriebene Spur in der Transkriptansicht der App: 183 Zeilen, das Zitat steht bei 9:18 in einer eigenen Zeile

Wird eine Zeile als Referenz gespeichert, wird ihre Startzeit zum Parameter t des Links. Die Zeit wird abgerundet, sodass das Video einen Bruchteil einer Sekunde vor den Worten startet und nicht erst nach dem ersten:

url: `https://www.youtube.com/watch?v=${transcript.video_id}&t=${Math.floor(segment.start)}s` 

Für die Zeile bei 9:18 ergibt das &t=558s, für eine Zeile, die bei 558.9 Sekunden beginnt.

Wenn es nur eine automatische Spur gibt

Viele Videos haben nichts als die automatische Spur. Dann ist sie ein Suchindex und keine Quelle: Man findet damit ungefähr, wo etwas gesagt wurde, spielt diese Stelle ab und schreibt das Zitat nach dem Ton auf. Namen und Zahlen sollte man mit einer anderen Quelle gegenprüfen und mit fehlenden Stücken ohne Markierung rechnen. Der Link auf die Sekunde lohnt sich trotzdem, weil Leser damit dieselbe Prüfung in wenigen Sekunden nachvollziehen können.

Die hier verwendete Desktop-App ist auf der osFoundry-Downloadseite kostenlos.