La plupart des vidéos YouTube ont une transcription, et pour la plupart elle a été écrite par un système de reconnaissance vocale. C'est suffisant pour suivre la vidéo. Pour une citation dans un mémoire, un article de presse ou une note juridique, la question est de savoir à quel point le texte automatique s'éloigne de ce qui a été dit, et si ses horodatages pointent vers la bonne seconde. Une vidéo qui possède les deux types de sous-titres donne une réponse directe.
La vidéo est la mise en ligne par la NASA du discours du président Kennedy à l'université Rice en 1962 (WZyRbnpGyzQ, 18 minutes). Elle comporte deux pistes en anglais : une écrite par une personne et une générée par YouTube. Les deux peuvent être listées et téléchargées avec le paquet Python youtube-transcript-api :
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() Chaque entrée est une ligne de texte avec une heure de début et une durée en secondes.
L'écart entre les deux pistes
Comparées mot à mot (en minuscules, sans ponctuation, alignées avec difflib.SequenceMatcher de Python), les deux pistes concordent sur environ 95 % du discours :
| Écrite par une personne | Générée automatiquement | |
|---|---|---|
| Lignes | 183 | 332 |
| Mots | 2,233 | 2,211 |
| Signes de ponctuation | 255 | 4 |
| Mots différents | environ 143 (6 %) |
Six pour cent semble peu, jusqu'à ce qu'on regarde de quels mots il s'agit. La reconnaissance vocale se débrouille bien avec les mots courants et mal avec les noms, les nombres et le vocabulaire technique, c'est-à-dire justement les passages dont une citation dépend le plus souvent :
| Écrite par une personne | Générée automatiquement |
|---|---|
| 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 |
Il y a aussi un trou. Vers 4:47, la piste automatique saute de « both must be » directement à « determined and cannot be deterred ». Les 28 mots intermédiaires, "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", n'y figurent pas du tout. Rien dans la piste automatique ne signale cette lacune.
Ce qui arrive à la phrase célèbre
La phrase que l'on cite de ce discours se trouve à 9:18. Dans la piste humaine, c'est une seule ligne, ponctuée, avec une seule heure de début :
558.90 3.65 not because they are easy, but because they are hard, Dans la piste automatique, elle est répartie sur trois lignes qui se chevauchent, et le premier mot appartient à la ligne précédente :
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 Les sous-titres automatiques sont conçus pour un affichage défilant, quelques mots à la fois, si bien que leurs lignes suivent le rythme de la parole et non les phrases. Pour citer, deux conséquences. Copier la ligne de 9:18 donne un fragment qui commence au milieu d'une phrase, et l'heure de début de la ligne qui contient « not » est 9:15, trois secondes avant la citation. Aucun des deux n'est faux comme sous-titre ; les deux sont faux comme référence.
Ici, la grammaire survit, « they are », contrairement à la version dont la plupart des gens se souviennent (« because it is hard »). Mais « we are willing » est devenu « we're willing » quelques lignes plus loin, et une citation prise dans la piste automatique mettrait dans la bouche de Kennedy une contraction qu'il n'a pas prononcée.
Choisir la piste, et le lien
L'outil de transcription de l'application de bureau osFoundry, qui récupère les sous-titres depuis l'ordinateur sur lequel elle tourne, fait ce choix en quelques lignes de Rust. YouTube marque les pistes automatiques avec kind: "asr", et l'application prend d'abord une piste anglaise humaine, puis n'importe quelle piste anglaise, puis n'importe quelle piste humaine, puis ce qu'il y a :
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()) } Quand une ligne est enregistrée comme référence, son heure de début devient le paramètre t du lien. L'heure est arrondie à l'inférieur, de sorte que la vidéo démarre une fraction de seconde avant les mots plutôt que juste après le premier :
url: `https://www.youtube.com/watch?v=${transcript.video_id}&t=${Math.floor(segment.start)}s` Pour la ligne de 9:18, cela donne &t=558s, pour une ligne qui commence à 558.9 secondes.
Quand il n'y a qu'une piste automatique
Beaucoup de vidéos n'ont que la piste automatique. Elle sert alors d'index de recherche, pas de source : on s'en sert pour trouver à peu près où quelque chose a été dit, on écoute ce passage et on écrit la citation d'après l'audio. Vérifiez les noms et les chiffres auprès d'une autre source, et attendez-vous à des passages manquants sans aucun repère. Le lien à la seconde reste utile à conserver, parce qu'il permet à un lecteur de refaire la même vérification en quelques secondes.
L'application de bureau utilisée ici est gratuite sur la page de téléchargement d'osFoundry.


