De quoi est fait un fichier SRT
Un fichier SRT est une liste de blocs numérotés. Chaque bloc comprend trois éléments : un numéro, une heure de début et de fin écrites sous la forme heures:minutes:secondes,millisecondes, et une ou deux lignes de texte. Une ligne vide marque la fin du bloc.
329
00:24:22,584 --> 00:24:23,784
absence ...
Un lecteur vidéo ne lit que les horaires. Il affiche le texte de l'heure de début à l'heure de fin et ignore tout le reste. C'est pourquoi une traduction peut se lire parfaitement et pourtant s'afficher mal : les mots sont justes, mais ils sont rattachés aux mauvais horaires.
Les trois façons dont une traduction fausse le timing
Ces exemples proviennent de notre test de quatre tâches longues, dans lequel trois chatbots IA ont chacun traduit en espagnol, en une seule réponse, le même fichier SRT de 1 200 lignes et 85 minutes.
1. Une ligne est fondue dans la précédente. L'original contenait « ...take advantage of Lady Bracknell's temporary » à la ligne 328 et « absence ... » à la ligne 329. Un modèle a placé toute la phrase à la ligne 328 et supprimé la ligne 329. À l'écran, « absence » apparaît désormais une seconde trop tôt, et le créneau de la ligne 329 est vide.
2. Tout ce qui suit une ligne supprimée est renuméroté. Le même modèle a ensuite numéroté la suite du fichier à partir de 329, sans trou. Après une seconde fusion à la ligne 357, 870 lignes sur 1 200 portaient un numéro différent de celui de l'original. Le fichier se lit toujours. Mais si vous ou votre éditeur comparez la traduction à l'original par numéro de ligne, chaque ligne après la 329 est associée à la mauvaise.
3. Un chiffre d'un code temporel change. Un autre modèle a écrit 00:54:55,839 --> 00:54:51,039 pour une ligne qui était 00:54:45,839 --> 00:54:51,039. La ligne se termine donc avant de commencer. Selon le lecteur, elle est ignorée, s'affiche une fraction de seconde ou empêche le chargement du fichier.
Un décalage global, où toutes les lignes sont décalées de la même durée dès la toute première, est un autre problème : les sous-titres ont été réalisés pour un autre montage ou une autre cadence d'images de la vidéo. La traduction n'en est pas la cause.
Le contrôle en 2 minutes
Ouvrez l'original et la traduction côte à côte dans n'importe quel éditeur de texte.
- Dernière ligne. Allez à la fin des deux fichiers. Le dernier numéro et le dernier code temporel doivent être identiques. Si la traduction s'arrête à 1,198 et l'original à 1,200, deux lignes ont été fusionnées ou supprimées.
- Trois lignes au milieu. Recherchez dans la traduction trois codes temporels pris dans l'original, à peu près au quart, à la moitié et aux trois quarts du fichier. Chacun doit porter le même numéro dans les deux fichiers. Là où les numéros commencent à différer, une ligne a disparu.
- Horaires impossibles. Cherchez toute ligne dont l'heure de fin précède l'heure de début. Dans un long fichier, un petit script ou la vérification d'erreurs d'un éditeur de sous-titres les repère instantanément.
- Les dix dernières minutes. Chargez la traduction dans votre lecteur et allez près de la fin. Si les lignes s'affichent au bon moment, le fichier est très probablement correct.
Si vous avez Python, ce court script effectue les contrôles 1 à 3 sur n'importe quelle paire de fichiers (python3 srtcheck.py original.srt translated.srt). Sur les trois traductions de notre test, il a signalé exactement les erreurs décrites ci-dessus.
import re, sys
def cues(path):
text = open(path, encoding="utf-8-sig").read().replace("\r", "")
return re.findall(r"^(\d+)\n(\d\d:\d\d:\d\d,\d{3}) --> (\d\d:\d\d:\d\d,\d{3})", text, re.M)
a, b = cues(sys.argv[1]), cues(sys.argv[2])
print(f"lines: {len(a)} original, {len(b)} translated")
print(f"last: {a[-1]} vs {b[-1]}")
times = {(s, e): n for n, s, e in a}
renumbered = sum(1 for n, s, e in b if (s, e) in times and times[(s, e)] != n)
changed = [n for n, s, e in b if (s, e) not in times]
broken = [n for n, s, e in b if e <= s]
missing = [n for n, s, e in a if (s, e) not in {(s2, e2) for _, s2, e2 in b}]
print(f"renumbered: {renumbered}, changed time codes: {changed[:10]}, "
f"end before start: {broken[:10]}, original lines missing: {missing[:10]}")
Si la traduction réussit les quatre contrôles, utilisez-la. Si elle échoue à l'un d'eux, il est généralement plus rapide de la refaire avec un outil qui conserve le minutage que de corriger le fichier à la main.
La longueur des lignes est un contrôle à part
Les traductions vers l'espagnol, l'allemand ou le français sont souvent plus longues que l'anglais. Le guide de style Netflix pour l'anglais (États-Unis) autorise 42 caractères par ligne et deux lignes par sous-titre. Dans notre test, la part des lignes traduites contenant une ligne de plus de 42 caractères allait de 32 à 447 sur 1,200, selon le modèle. Notre propre outil en a produit 105 : ce contrôle vaut donc la peine, quel que soit l'outil utilisé. Des lignes trop longues se lisent mal, mais elles ne dérèglent pas le minutage.
Comment éviter le problème
Ces erreurs surviennent parce qu'on demande au modèle de réécrire les numéros et les horaires en même temps que la traduction. Il suffit de les lui retirer des mains. Notre traducteur de sous-titres lit votre fichier .srt ou .vtt, n'envoie que le texte par blocs de 60 lignes maximum, redemande toute ligne manquante au retour, et recopie chaque numéro et chaque horaire depuis votre original. Sur le même fichier de test de 1,200 lignes, les 1,200 lignes sont revenues avec des numéros et des codes temporels identiques.
Le début de chaque tâche est gratuit et sans inscription. Un film ou une saison entière, jusqu'à 5,000 lignes réparties dans 30 fichiers au maximum, coûte $5, en paiement unique. Les langues cibles les plus demandées ont leur propre page : SRT en espagnol, en arabe et en persan.
Méthode et données
Sources
- SubRip (SRT file format) — Wikipedia
- English (USA) Timed Text Style Guide — Netflix Partner Help Center
- Timed Text Style Guide: General Requirements — Netflix Partner Help Center