Com'è fatto un file SRT

Un file SRT è un elenco di blocchi numerati. Ogni blocco ha tre parti: un numero, un orario di inizio e di fine scritto come ore:minuti:secondi,millisecondi, e una o due righe di testo. Una riga vuota chiude il blocco.

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

Un lettore video legge solo gli orari. Mostra il testo dall'orario di inizio a quello di fine e ignora tutto il resto. Per questo una traduzione può essere perfetta da leggere e funzionare male in riproduzione: le parole vanno bene, ma sono agganciate agli orari sbagliati.

I tre modi in cui una traduzione rovina la sincronia

Questi esempi vengono dal nostro test su quattro lavori lunghi, in cui tre chatbot hanno tradotto ciascuno in spagnolo, in un'unica risposta, lo stesso file SRT di 1.200 righe e 85 minuti.

1. Una riga viene incorporata in quella precedente. L'originale aveva "...take advantage of Lady Bracknell's temporary" alla riga 328 e "absence ..." alla riga 329. Un modello ha messo l'intera frase nella riga 328 ed eliminato la riga 329. Sullo schermo "absence" ora compare un secondo prima, e lo slot temporale della riga 329 resta vuoto.

2. Tutto ciò che segue una riga eliminata viene rinumerato. Lo stesso modello ha poi numerato il resto del file dalla riga 329 in avanti senza buchi. Dopo una seconda fusione alla riga 357, 870 righe su 1.200 avevano un numero diverso dall'originale. Il file si riproduce ancora. Ma se tu o il tuo editor confrontate la traduzione con l'originale in base al numero di riga, ogni riga dopo la 329 viene abbinata a quella sbagliata.

3. Cambia una cifra in un codice temporale. Un altro modello ha scritto 00:54:55,839 --> 00:54:51,039 per una riga che era 00:54:45,839 --> 00:54:51,039. Ora la riga finisce prima di iniziare. A seconda del lettore, viene saltata, lampeggia per un istante o impedisce il caricamento del file.

Uno sfasamento dell'intero file, in cui ogni riga è fuori della stessa quantità fin dalla primissima, è un altro problema: i sottotitoli sono stati creati per un altro montaggio o per un altro frame rate del video. La traduzione non ne è la causa.

Il controllo in 2 minuti

Apri l'originale e la traduzione affiancati in un qualsiasi editor di testo.

  1. Ultima riga. Vai alla fine di entrambi i file. L'ultimo numero e l'ultimo time code devono essere identici. Se la traduzione finisce a 1,198 e l'originale a 1,200, due righe sono state unite o perse.
  2. Tre righe a metà file. Cerca nella traduzione tre time code presi dall'originale, più o meno a un quarto, a metà e a tre quarti del file. In entrambi i file ognuno deve avere lo stesso numero. Il primo punto in cui i numeri non coincidono è quello in cui è sparita una riga.
  3. Tempi impossibili. Cerca le righe in cui il tempo di fine è precedente a quello di inizio. In un file lungo, un piccolo script o il controllo errori di un editor di sottotitoli le trova all'istante.
  4. Gli ultimi dieci minuti. Carica la traduzione nel tuo player e vai vicino alla fine. Se lì le righe compaiono al momento giusto, molto probabilmente il file è a posto.

Se hai Python, questo breve script esegue i controlli da 1 a 3 su qualsiasi coppia di file (python3 srtcheck.py original.srt translated.srt). Sulle tre traduzioni del nostro test ha segnalato esattamente gli errori descritti sopra.

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

Se la traduzione supera tutti e quattro i controlli, usala. Se ne fallisce uno, di solito è più veloce tradurre di nuovo con uno strumento che mantiene i tempi che sistemare il file a mano.

La lunghezza delle righe è un controllo a parte

Le traduzioni in spagnolo, tedesco o francese sono spesso più lunghe dell'inglese. La guida di stile Netflix per l'inglese (USA) consente 42 caratteri per riga e due righe per sottotitolo. Nel nostro test, la quota di righe tradotte con una riga più lunga di 42 caratteri andava da 32 a 447 su 1,200, a seconda del modello. Il nostro strumento ne ha prodotte 105, quindi vale la pena controllare qualunque strumento tu usi: le righe lunghe si leggono con difficoltà, ma non rompono la sincronizzazione.

Come evitare il problema

Gli errori qui sopra nascono dal fatto che al modello viene chiesto di riscrivere numeri e tempi insieme alla traduzione. Meglio tenerli fuori dalla sua portata. Il nostro traduttore di sottotitoli legge il tuo file .srt o .vtt, invia solo il testo in blocchi da un massimo di 60 righe, richiede di nuovo ogni riga che torna mancante e copia dall'originale ogni numero e ogni tempo. Sullo stesso file di test da 1,200 righe, tutte le 1,200 righe sono tornate con numeri e time code identici.

La prima parte di ogni lavoro è gratis e senza registrazione. Un film o una stagione completi, fino a 5,000 righe in un massimo di 30 file, costano $5, con pagamento una tantum. Le lingue più richieste hanno pagine dedicate: SRT in spagnolo, arabo e persiano.

Metodo e dati

Fonti

  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