Z czego składa się plik SRT
Plik SRT to lista ponumerowanych bloków. Każdy blok ma trzy części: numer, czas rozpoczęcia i zakończenia zapisany jako godziny:minuty:sekundy,milisekundy oraz jedną lub dwie linijki tekstu. Pusta linia kończy blok.
329
00:24:22,584 --> 00:24:23,784
absence ...
Odtwarzacz wideo czyta tylko czasy. Pokazuje tekst od czasu rozpoczęcia do czasu zakończenia, a resztę ignoruje. Dlatego tłumaczenie może brzmieć znakomicie, a mimo to źle się odtwarzać: słowa są w porządku, ale przypisane do złych momentów.
Trzy sposoby, w jakie tłumaczenie psuje synchronizację
Te przykłady pochodzą z naszego testu czterech długich zleceń, w którym trzy modele czatowe tłumaczyły ten sam 85-minutowy plik SRT z 1200 linijkami na hiszpański, w jednej odpowiedzi.
1. Linijka zostaje dołączona do poprzedniej. W oryginale linijka 328 brzmiała „...take advantage of Lady Bracknell's temporary”, a linijka 329 – „absence ...”. Jeden z modeli umieścił całe zdanie w linijce 328 i usunął linijkę 329. Na ekranie „absence” pojawia się teraz sekundę za wcześnie, a miejsce czasowe linijki 329 jest puste.
2. Wszystko po pominiętej linijce zostaje przenumerowane. Ten sam model ponumerował resztę pliku od 329 dalej, bez przerwy. Po drugim scaleniu w linijce 357 aż 870 z 1200 linijek miało inny numer niż w oryginale. Plik nadal się odtwarza. Ale jeśli Ty albo Twój edytor porównujecie tłumaczenie z oryginałem według numeru linijki, każda linijka po 329 zostaje zestawiona z niewłaściwą.
3. Zmienia się jedna cyfra w kodzie czasowym. Inny model zapisał 00:54:55,839 --> 00:54:51,039 dla linijki, która miała 00:54:45,839 --> 00:54:51,039. Linijka kończy się teraz przed swoim początkiem. W zależności od odtwarzacza jest pomijana, mignie na ułamek sekundy albo plik w ogóle się nie wczyta.
Przesunięcie całego pliku, gdy każda linijka jest przesunięta o tyle samo już od pierwszej, to inny problem: napisy zostały przygotowane do innej wersji montażowej lub innej liczby klatek na sekundę wideo. Tłumaczenie tego nie powoduje.
Sprawdzenie w 2 minuty
Otwórz oryginał i tłumaczenie obok siebie w dowolnym edytorze tekstu.
- Ostatnia linijka. Przejdź na koniec obu plików. Ostatni numer i ostatni kod czasowy powinny być identyczne. Jeśli tłumaczenie kończy się na 1,198, a oryginał na 1,200, dwie linijki zostały scalone lub pominięte.
- Trzy linijki ze środka. Wyszukaj w tłumaczeniu trzy kody czasowe wzięte z oryginału, mniej więcej z jednej czwartej, połowy i trzech czwartych długości pliku. Każdy z nich powinien mieć w obu plikach ten sam numer. Pierwsze miejsce, w którym numery się rozjeżdżają, to miejsce, gdzie zniknęła linijka.
- Niemożliwe czasy. Poszukaj linijek, w których czas końca jest wcześniejszy niż czas początku. W długim pliku wychwyci je od razu prosty skrypt albo sprawdzanie błędów w edytorze napisów.
- Ostatnie dziesięć minut. Wczytaj tłumaczenie do odtwarzacza i przeskocz blisko końca. Jeśli napisy pojawiają się tam punktualnie, plik z dużym prawdopodobieństwem jest w porządku.
Jeśli masz Pythona, ten krótki skrypt wykonuje kontrole od 1 do 3 dla dowolnej pary plików (python3 srtcheck.py original.srt translated.srt). W trzech tłumaczeniach z naszego testu wykrył dokładnie te błędy, które opisaliśmy wyżej.
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]}")
Jeśli tłumaczenie przejdzie wszystkie cztery kontrole, korzystaj z niego. Jeśli którejś nie przejdzie, zwykle szybciej jest przetłumaczyć plik jeszcze raz narzędziem, które zachowuje synchronizację, niż poprawiać go ręcznie.
Długość linijek to osobna kontrola
Tłumaczenia na hiszpański, niemiecki czy francuski często wychodzą dłuższe niż angielski oryginał. Wytyczne Netflixa dla angielskiego (USA) dopuszczają 42 znaki w linijce i dwie linijki na napis. W naszym teście odsetek przetłumaczonych napisów z linijką dłuższą niż 42 znaki wahał się, zależnie od modelu, od 32 do 447 na 1,200. Nasze narzędzie dało wynik 105, więc warto to sprawdzać, niezależnie od tego, z czego korzystasz: długie linijki źle się czyta, ale nie psują synchronizacji.
Jak uniknąć problemu
Błędy opisane wyżej biorą się stąd, że model ma razem z tłumaczeniem zapisać z powrotem numery i czasy. Nie dawaj mu takiej możliwości. Nasz tłumacz napisów wczytuje Twój plik .srt lub .vtt, wysyła do tłumaczenia wyłącznie tekst w blokach do 60 linijek, ponownie prosi o każdą linijkę, której zabrakło w odpowiedzi, i kopiuje wszystkie numery i czasy z Twojego oryginału. W tym samym 1,200-linijkowym pliku testowym wszystkie 1,200 linijek wróciło z identycznymi numerami i kodami czasowymi.
Pierwsza część każdego zlecenia jest za darmo i nie wymaga rejestracji. Cały film lub sezon, do 5,000 linijek w maksymalnie 30 plikach, kosztuje $5, jednorazowa płatność. Najpopularniejsze języki docelowe mają własne strony: SRT na hiszpański, arabski i perski.
Metoda i dane
Źródła
- 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