Из чего состоит файл SRT

Файл SRT — это список пронумерованных блоков. В каждом блоке три части: номер, время начала и окончания в формате часы:минуты:секунды,миллисекунды и одна-две строки текста. Пустая строка завершает блок.

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

Видеоплеер читает только время. Он показывает текст от момента начала до момента окончания и игнорирует всё остальное. Поэтому перевод может читаться безупречно, а воспроизводиться плохо: слова верные, но привязаны не к тому времени.

Три способа, которыми перевод ломает тайминг

Эти примеры взяты из нашего теста четырёх длинных задач: три чат-модели переводили один и тот же файл SRT из 1 200 строк и 85 минут на испанский, каждая за один ответ.

1. Строка приклеена к предыдущей. В оригинале в строке 328 было «...take advantage of Lady Bracknell's temporary», а в строке 329 — «absence ...». Одна модель поместила всё предложение в строку 328 и удалила строку 329. На экране слово «absence» теперь появляется на секунду раньше, а временной интервал строки 329 остаётся пустым.

2. После пропущенной строки всё нумеруется заново. Та же модель затем пронумеровала остаток файла начиная с 329, без пропусков. После второй склейки в строке 357 у 870 из 1 200 строк номер отличался от оригинального. Файл по-прежнему воспроизводится. Но если вы или ваш редактор сравниваете перевод с оригиналом по номеру строки, каждая строка после 329 окажется в паре с неверной.

3. Меняется одна цифра в тайм-коде. Другая модель написала 00:54:55,839 --> 00:54:51,039 вместо 00:54:45,839 --> 00:54:51,039. Теперь строка заканчивается раньше, чем начинается. В зависимости от плеера её пропускают, она мигает на экране на мгновение или файл вообще не загружается.

Сдвиг всего файла, когда каждая строка смещена на одно и то же время с самой первой, — это другая проблема: субтитры были сделаны под другую версию монтажа или частоту кадров видео. Перевод её не вызывает.

Проверка за 2 минуты

Откройте оригинал и перевод рядом в любом текстовом редакторе.

  1. Последняя строка. Перейдите в конец обоих файлов. Последний номер и последний тайм-код должны совпадать. Если перевод заканчивается на 1,198, а оригинал на 1,200, две строки были склеены или потеряны.
  2. Три строки из середины. Найдите в переводе три тайм-кода из оригинала: примерно на четверти, на середине и на трёх четвертях файла. У каждого из них номер в обоих файлах должен быть одинаковым. Там, где номера впервые расходятся, и пропала строка.
  3. Невозможное время. Поищите строки, у которых время окончания раньше времени начала. В длинном файле такие строки мгновенно находит небольшой скрипт или проверка ошибок в редакторе субтитров.
  4. Последние десять минут. Загрузите перевод в плеер и перемотайте почти к концу. Если строки появляются вовремя, файл, скорее всего, в порядке.

Если у вас установлен Python, этот короткий скрипт выполняет проверки с 1 по 3 для любой пары файлов (python3 srtcheck.py original.srt translated.srt). На трёх переводах из нашего теста он показал именно те ошибки, которые описаны выше.

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

Если перевод проходит все четыре проверки, используйте его. Если не проходит хотя бы одну, обычно быстрее перевести заново инструментом, который сохраняет тайминг, чем исправлять файл вручную.

Длина строки проверяется отдельно

Переводы на испанский, немецкий или французский часто получаются длиннее английского оригинала. Руководство по стилю Netflix для английского (США) допускает 42 символа в строке и две строки в субтитре. В нашем тесте доля переведённых строк, где есть строка длиннее 42 символов, составила от 32 до 447 из 1,200, в зависимости от модели. Наш собственный инструмент выдал 105, так что проверять стоит независимо от того, чем вы пользуетесь: длинные строки неудобно читать, но тайминг они не ломают.

Как избежать проблемы

Ошибки, описанные выше, возникают потому, что модель просят записать в ответ не только перевод, но и номера со временем. Не давайте ей эту возможность. Наш переводчик субтитров читает ваш файл .srt или .vtt, отправляет на перевод только текст блоками до 60 строк, повторно запрашивает любую строку, которая вернулась пропущенной, и копирует все номера и время из вашего оригинала. На том же тестовом файле из 1,200 строк все 1,200 строк вернулись с теми же номерами и тайм-кодами.

Первая часть каждой задачи бесплатно и без регистрации. Целый фильм или сезон, до 5,000 строк в не более чем 30 файлах, стоит $5, разовый платёж. У популярных направлений есть свои страницы: SRT на испанский, арабский и персидский.

Метод и данные

Источники

  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