Разбить длинные субтитры
Или вставьте текст субтитров
Параметры
Считается в символах так, как их видит читатель, а не в байтах или единицах UTF-16, поэтому буква с диакритикой считается за одну. Любая реплика длиннее этого режется на куски не длиннее указанного числа символов. Разрез приходится на пробел, конец строки или границу между китайскими и японскими иероглифами; только сплошной фрагмент без всего этого, например длинный URL, режется посреди слова. Каждый кусок получает долю времени реплики пропорционально объёму текста.
В какой частоте кадров считается тайминг. На страницах форматов это то, что нужно MicroDVD: он хранит время в номерах кадров. На страницах частоты кадров это частота, по которой файл был рассчитан, — версия, для которой делались субтитры, — а второе поле страницы принимает частоту видео, с которым вы будете их использовать. Обычные значения: 23,976, 24, 25, 29,97, 30, 50, 59,94 и 60. Ошибка сдвигает весь таймлайн, а на страницах частоты кадров — на коэффициент, а не на фиксированную величину.
Эта страница режет каждую реплику, в которой больше символов, чем вы разрешили, на части, укладывающиеся в предел. Предел считается в символах так, как их видит читатель, и по умолчанию равен 42 — это самая распространённая верхняя граница для одной строки субтитров, которую проверяют вещатели и стриминговые платформы. Реплика из 60 символов выходит двумя: текст делится по ближайшему пробелу, и ни один символ не пропадает, а время исходной реплики распределяется между частями пропорционально числу символов. Начало первой части и конец последней остаются точно там, где были начало и конец исходной реплики, остальные реплики файла не сдвигаются ни на миллисекунду, а файл с изменившимся числом реплик выводится в порядке таймлайна с нумерацией с 1.
Примеры
Строка из 56 символов при пределе 42
Вход
1
00:00:01,000 --> 00:00:04,000
She walked into the room and closed the door behind her.
Выход
1
00:00:01,000 --> 00:00:03,127
She walked into the room and closed the
2
00:00:03,127 --> 00:00:04,000
door behind her.
Две части по 39 и 16 символов, и три секунды делятся как 2127 и 873 мс. Разрез приходится на пробел перед door, а не ровно на 42-й символ, поэтому ни одно слово не разорвано. Если бы у этой реплики был стиль, первая часть сохранила бы его, а отчёт сказал бы, что одна новая реплика вышла без оформления.
Китайский текст, где нет пробелов
Вход
1
00:00:01,000 --> 00:00:04,000
我们今天下午三点在会议室开会讨论明年的计划。
Выход
1
00:00:01,000 --> 00:00:02,364
我们今天下午三点在会
2
00:00:02,364 --> 00:00:03,727
议室开会讨论明年的计
3
00:00:03,727 --> 00:00:04,000
划。
При пределе 10 двадцать два символа выходят как 10, 10 и 2. Разрыв рядом с иероглифом считается точкой разрыва, поэтому китайские и японские файлы делятся по своим правилам; каждый иероглиф при этом считается одним символом, так что предел означает здесь то же, что и в английском тексте.
Файл, который уже укладывается в предел
Вход
1
00:00:01,000 --> 00:00:02,000
A short one.
2
00:00:03,000 --> 00:00:04,000
And another.
Выход
1
00:00:01,000 --> 00:00:02,000
A short one.
2
00:00:03,000 --> 00:00:04,000
And another.
Здесь ничто не длиннее 100 символов, поэтому ничего не делится и результат совпадает с входным файлом байт в байт, включая номера. Это первый прогон, когда вы не уверены, что лежит в файле: завышенный предел может только ничего не сделать.
Частые вопросы
Откуда на этой странице берётся предел в 42 символа?
Это верхняя граница для одной строки, на которой сходятся большинство руководств по субтитрам и вещательных спецификаций: зритель при обычной дистанции уверенно следит примерно за 42 символами в строке, а две такие строки — обычный максимум для одной реплики. Поэтому поле открывается со значением 42; допустимы значения от 1 до 1000, а считаются именно видимые символы (эмодзи — один символ), не байты и не единицы UTF-16. Для файла, который смотрят на телефоне с расстояния вытянутой руки, значение стоит уменьшить.
Как делится время между частями при разрезании по символам?
Каждая часть получает долю исходного отрезка пропорционально числу символов, которые в ней остались: часть с вдвое большим текстом стоит на экране примерно вдвое дольше. Первая часть начинается там, где начиналась исходная реплика, последняя заканчивается там, где она заканчивалась, а все остальные реплики файла сохраняют свои времена до миллисекунды. В файле было записано только время всей реплики целиком, поэтому новые внутренние границы вычисляются здесь и попадают в отчёт о потерях как запись timing с числом разделённых реплик, а не частей.
Что происходит со словом длиннее предела в 42 символа?
Оно режется посередине — это единственный случай, когда инструмент разрывает слово. Так бывает с длинным URL, хешем или строкой цифр, внутри которых нет ни пробела, ни переноса, ни иероглифа; текст на тайском или кхмерском ведёт себя так же, потому что в нём нет ни пробелов, ни иероглифических знаков. Альтернатива — выпустить часть за предел, но предел задан как жёсткая граница, поэтому побеждает разрез. Если такие строки нужно сохранить целиком, поднимите предел выше самой длинной неразрывной последовательности в файле.
Меняются ли номера реплик после разделения длинных субтитров?
Да. Файл, у которого изменилось число реплик, записывается в порядке таймлайна и нумеруется с 1, чтобы номера оставались счётом того, что лежит в файле, а не набором меток с пропусками. Практическое следствие: разделённый файл больше нельзя сравнивать с исходным по номеру реплики — сравнивайте по таймлайну или держите исходник рядом. Новые части получают идентификаторы вида «исходный-2», «исходный-3», чтобы в WebVTT не появилось трёх одинаковых идентификаторов.
Куда девается оформление, когда длинная реплика делится по символам?
Стиль, позиция и караоке-тайминг принадлежат той реплике, на которой были записаны, поэтому они остаются у первой части, а у созданных частей их нет; отчёт считает, сколько новых реплик вышло без оформления. Встроенные пометки вроде курсива обрезаются по границам частей и остаются на тех же словах. Форматные поля уровня реплики — номер строки SRT, поля Name, MarginL и Effect в ASS — тоже остаются только у первой части и отдельно попадают в потери как unknown-field, потому что описывают одну исходную реплику.
Чем разделение по символам отличается от разделения по длительности?
Вопрос в том, что именно нарушено: если реплика висит достаточно долго, но в ней слишком много текста, проблема в символах и нужна эта страница с полем splitAfterChars, а если текст читается легко, но реплика слишком долго остаётся на экране, проблема в секундах и нужна страница с полем splitAfterMs. Приоритет в реализации — символы, затем миллисекунды, затем концы предложений, поэтому заполненный splitAfterChars перекрывает остальные два условия. Для реплики, которая плоха по обоим параметрам, безопаснее сначала прогнать эту страницу: она только укорачивает части, тогда как смена предела длительности переписывает времена, которые вы, возможно, уже выставили.