Waaruit een SRT-bestand bestaat

Een SRT-bestand is een lijst met genummerde blokken. Elk blok heeft drie delen: een nummer, een begin- en eindtijd in het formaat uren:minuten:seconden,milliseconden en een of twee regels tekst. Een lege regel sluit het blok af.

329
00:24:22,584 --> 00:24:23,784
absence ...

Een videospeler leest alleen de tijden. Hij toont de tekst van de starttijd tot de eindtijd en negeert de rest. Daarom kan een vertaling perfect lezen en toch slecht afspelen: de woorden kloppen, maar ze hangen aan de verkeerde tijden.

De drie manieren waarop een vertaling de timing breekt

Deze voorbeelden komen uit onze test met vier lange opdrachten, waarin drie chatbotmodellen elk hetzelfde SRT-bestand van 1.200 regels en 85 minuten in één antwoord naar het Spaans vertaalden.

1. Een regel wordt samengevoegd met de regel ervoor. In het origineel stond "...take advantage of Lady Bracknell's temporary" in regel 328 en "absence ..." in regel 329. Eén model zette de hele zin in regel 328 en verwijderde regel 329. Op het scherm verschijnt "absence" nu een seconde te vroeg, en het tijdvak van regel 329 is leeg.

2. Alles na een weggelaten regel wordt opnieuw genummerd. Hetzelfde model nummerde de rest van het bestand vanaf 329 zonder onderbreking verder. Na een tweede samenvoeging bij regel 357 hadden 870 van de 1.200 regels een ander nummer dan in het origineel. Het bestand speelt nog steeds af. Maar als jij of je editor de vertaling op regelnummer met het origineel vergelijkt, wordt elke regel na 329 aan de verkeerde gekoppeld.

3. Eén cijfer in een tijdcode verandert. Een ander model schreef 00:54:55,839 --> 00:54:51,039 voor een regel die 00:54:45,839 --> 00:54:51,039 was. De regel eindigt nu voordat hij begint. Afhankelijk van de speler wordt hij overgeslagen, flitst hij nauwelijks voorbij of laadt het bestand helemaal niet.

Een verschuiving van het hele bestand, waarbij elke regel vanaf de allereerste regel evenveel afwijkt, is een ander probleem: de ondertitels zijn gemaakt voor een andere montage of framerate van de video. Vertalen veroorzaakt dat niet.

De check van 2 minuten

Open het origineel en de vertaling naast elkaar in een willekeurige teksteditor.

  1. Laatste regel. Spring naar het einde van beide bestanden. Het laatste nummer en de laatste tijdcode moeten identiek zijn. Als de vertaling eindigt bij 1,198 en het origineel bij 1,200, zijn er twee regels samengevoegd of weggevallen.
  2. Drie regels uit het midden. Zoek in de vertaling drie tijdcodes op die je uit het origineel haalt, ongeveer op een kwart, de helft en driekwart van het bestand. Bij elke tijdcode moet in beide bestanden hetzelfde nummer staan. Op de plek waar de nummers voor het eerst verschillen, is een regel verdwenen.
  3. Onmogelijke tijden. Zoek naar regels waarvan de eindtijd eerder is dan de begintijd. In een lang bestand vindt een klein script of de foutcontrole van een ondertiteleditor ze meteen.
  4. De laatste tien minuten. Laad de vertaling in je speler en spring naar vlak voor het einde. Als de regels daar op tijd verschijnen, is het bestand heel waarschijnlijk in orde.

Heb je Python? Dan voert dit korte script controle 1 tot en met 3 uit op elk paar bestanden (python3 srtcheck.py original.srt translated.srt). Bij de drie vertalingen uit onze test meldde het precies de hierboven beschreven fouten.

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]}")

Slaagt de vertaling voor alle vier de controles, gebruik haar dan. Faalt ze op één ervan, dan is het meestal sneller om opnieuw te vertalen met een tool die de timing behoudt dan om het bestand met de hand te repareren.

Regellengte is een aparte controle

Vertalingen naar het Spaans, Duits of Frans zijn vaak langer dan het Engels. De Engelse (VS) stijlgids van Netflix staat 42 tekens per regel toe en twee regels per ondertitel. In onze test varieerde het aantal vertaalde ondertitels met een regel van meer dan 42 tekens van 32 tot 447 van de 1,200, afhankelijk van het model. Onze eigen tool kwam op 105, dus deze controle is de moeite waard, welke tool je ook gebruikt: lange regels lezen moeilijk, maar ze verstoren de timing niet.

Zo voorkom je het probleem

De fouten hierboven ontstaan doordat het model de nummers en tijden samen met de vertaling opnieuw moet uitschrijven. Houd ze dus buiten bereik van het model. Onze ondertitelvertaler leest je .srt- of .vtt-bestand, stuurt alleen de tekst door in blokken van maximaal 60 regels, vraagt opnieuw om elke regel die ontbreekt en kopieert elk nummer en elke tijd uit je origineel. Bij hetzelfde testbestand van 1,200 regels kwamen alle 1,200 regels terug met identieke nummers en tijdcodes.

Het eerste deel van elke opdracht is gratis en vereist geen account. Een hele film of serie, tot 5,000 regels in maximaal 30 bestanden, kost $5, eenmalig betaald. Populaire doeltalen hebben hun eigen pagina: SRT naar Spaans, Arabisch en Perzisch.

Methode & data

Bronnen

  1. SubRip (SRT file format) — Wikipedia
  2. English (USA) Timed Text Style Guide — Netflix Partner Help Center
  3. Timed Text Style Guide: General Requirements — Netflix Partner Help Center