Субтитры SRT из готового текста
Что на самом деле мешает
Расшифровка уже есть. Она лежит одним куском в заметках, в документе или в окне распознавания речи — сплошной абзац без единого переноса. Видеоредактору такой текст бесполезен: он ждёт файл, где каждая реплика пронумерована и привязана ко времени. Ручная сборка означает, что вы сидите и печатаете шестизначные таймкоды для каждой из двух сотен фраз пятиминутного ролика.
Задача при этом делится надвое, и путать половины не стоит. Первая половина механическая: нарезать текст на куски подходящей длины и разложить их по временной сетке в правильном синтаксисе. Вторая содержательная: подвинуть каждый блок под настоящую речь, где есть паузы, вдохи и места, в которых диктор ускоряется. Автоматика закрывает первую половину целиком и не трогает вторую. Понимание этой границы избавляет от разочарования на выходе.
Как устроен SRT изнутри
Формат стоит показать, потому что он проще, чем кажется, и знание структуры экономит время при любой правке. Блок состоит из четырёх строк:
1
00:00:00,000 --> 00:00:03,500
Привет всем. Сегодня разберём субтитры.
2
00:00:03,500 --> 00:00:07,000
Начнём с того, как выглядит сам файл.
Первая строка — порядковый номер, целое число начиная с единицы, без пропусков. Вторая — время появления и время исчезновения, разделённые последовательностью «пробел, два дефиса, знак больше, пробел». Формат времени жёсткий: часы, минуты, секунды по две цифры, затем запятая и три цифры миллисекунд. Не точка: точка используется в родственном формате WebVTT, и SRT-парсер на ней спотыкается. Дальше идёт сам текст, одна или несколько строк, и завершает блок пустая строка.
Нумерация нужна парсеру для порядка блоков, но фактическую последовательность на экране задают именно таймкоды. Если вы вырезали один блок из середины и не перенумеровали остальные, большинство плееров это переживёт; строгий валидатор при загрузке на площадку может и придраться, поэтому нумерацию лучше держать сплошной.
Всё. Никаких заголовков, никакой служебной шапки. Файл — обычный текст, и его можно открыть блокнотом и поправить руками.
Сборка через инструмент
Открываете генератор субтитров из текста. Страница называется «Обычный текст в SRT» и состоит из двух секций — «Ввод» и «Результат».
- Вставьте расшифровку в поле «Обычный текст». Разметка не нужна, переносы строк схлопываются: скрипт сводит любую последовательность пробелов и переводов строки к одному пробелу и дальше работает со списком слов.
- Задайте «Макс. символов в субтитре». По умолчанию стоит 84. Это верхняя граница длины блока, а не цель: очередное слово добавляется в текущий блок, пока результат укладывается в лимит, иначе слово открывает следующий блок. Слова пополам не рвутся никогда.
- Задайте «Секунд на субтитр». По умолчанию 3.5, поле принимает дробное значение.
- Нажмите «Сгенерировать». В секции «Результат» появится готовый SRT.
- Под результатом две кнопки — «Копировать» и «Download». Вторая отдаёт файл сразу с именем
subtitles.srt, так что подставлять расширение вручную не требуется. - Кнопка «Сбросить» возвращает поля к значениям по умолчанию перед следующим сценарием.
Про тайминги честно: сетка равномерная. Блок с номером N начинается на отметке, равной произведению его порядкового номера без единицы на заданную длительность, и заканчивается ровно там, где начинается следующий, — зазоров между репликами нет. При 3.5 секундах на блок двадцатый субтитр стартует на 01:06,500 независимо от того, что происходит на дорожке. Совпадение с речью в начале ролика будет приличным, к пятой минуте разойдётся на секунды. Это стартовая сетка для перетаскивания в монтажке, а не результат распознавания.
Что подобрать под ролик
Два числа связаны между собой скоростью чтения. Комфортный ориентир — около 15-17 символов в секунду для взрослого зрителя. Отсюда 84 символа просят примерно пять секунд экранного времени, а не 3.5. Если оставить оба значения по умолчанию, плотные блоки будут мелькать быстрее, чем читаются.
Рабочие пары выглядят так. Горизонтальное видео на большом экране: 60-70 символов при 4 секундах. Вертикальные ролики с крупным кеглем: 40-50 символов при 2-2.5 секундах — длинная строка там переносится в три-четыре ряда и уезжает под интерфейс платформы, под кнопки лайка и описание.
Есть и третий множитель, о котором забывают: длина блока задаётся в символах, а не в словах. Русский текст в среднем длиннее английского на четверть, поэтому лимит, подобранный по английскому сценарию, на переводе даст блоки, вылезающие за границу кадра. Проверяйте на самом длинном абзаце, а не на первых двух фразах.
Обратная операция тоже существует: если у вас на руках чужой SRT и нужен голый текст для описания или перевода, его снимает инструмент удаления таймкодов. Остальное по работе с видео лежит в разделе видеоинструментов.
Ошибки, которые стоят перезалива
Кодировка не UTF-8. Единственная по-настоящему частая причина, по которой правильный файл не читается. Сохранение в windows-1251 превращает кириллицу в вопросительные знаки и кракозябры уже в плеере. Если сохраняете вручную из редактора, выбирайте UTF-8 и следите, чтобы редактор не добавил BOM в начало файла: три невидимых байта перед единицей ломают номер первого блока в части парсеров.
Точка вместо запятой в миллисекундах. Возникает, когда таймкоды правят руками или переносят из VTT. Внешне строка выглядит нормально, а блок молча пропадает.
Слипшиеся блоки. Пустая строка между блоками обязательна. Если при копировании из окна результата пустые строки схлопнулись, часть парсеров склеит два блока в один и потеряет второй таймкод. Проще нажать «Download» и не проверять.
Ожидание автоматической разбивки на две строки. Инструмент кладёт весь блок одной строкой. Разбить длинную реплику на два ряда так, чтобы перенос попал по смыслу, — задача редактора субтитров, здесь этого нет.
Расшифровка не почищена перед вставкой. Если текст приехал из автосубтитров, в нём остались повторы фраз на стыках блоков и отсутствуют точки. Генератор режет что дали, поэтому чистить лучше до, а не после: снять служебный мусор помогает чистка расшифровки с YouTube.
Слишком мелкая нарезка. Соблазн поставить 30 символов, чтобы блоки точно влезли, оборачивается сотнями блоков по одной-две строки. Зритель не успевает дочитать до смены кадра, а вы получаете вдвое больше объектов для ручной подгонки. Ниже 40 символов опускаться стоит только для очень крупного кегля.
Можно ли получить точные тайминги без ручной правки?
Нет. Для этого нужно распознавание речи с привязкой ко времени, а здесь считается арифметика по заданной длительности блока. Ролик на пять минут после импорта потребует минут пяти-семи на подгонку блоков по звуковой волне — всё равно быстрее, чем набирать двести таймкодов с нуля.
Куда уходит вставленный текст?
Никуда. Разбиение и расчёт времени выполняет скрипт страницы прямо во вкладке, сетевого запроса с содержимым текста нет. Черновик сценария невышедшего ролика можно вставлять спокойно.
Что делать, если общая длительность не совпала с роликом?
Посчитайте нужное значение обратно. Разделите длительность речи в секундах на число блоков в результате и подставьте полученное в «Секунд на субтитр», затем сгенерируйте заново. Начало и конец сойдутся, останется поправить середину.
Поддерживается ли кириллица и эмодзи?
Да, любой юникодный текст обрабатывается одинаково, а эмодзи считаются обычными символами при подсчёте лимита. Отрисовка эмодзи зависит от плеера: часть десктопных показывает вместо них пустые квадраты.
Подойдёт ли результат для загрузки на YouTube?
Да, это обычный SRT, и загрузчик субтитров его принимает. Но именно на YouTube равномерная сетка заметна сильнее всего, потому что зритель видит текст вместе со звуком в одном окне. Подгонку блоков лучше сделать до загрузки.