Как извлечь чистый текст из файлов субтитров SRT или VTT
Вытащить обычный диалог из файла субтитров кажется тривиальной задачей, пока не наткнёшься на номера cue, временные метки и предложения, разорванные посередине строки. Разбираемся, как сделать это правильно.
Файлы субтитров хранят три вещи, перемешанные вместе: порядковый номер, диапазон времени и сам текст. Если вам нужен только текст (для цитаты в блоге, статьи, поискового индекса или для передачи в другой инструмент), тайминг и нумерация, это просто лишний шум, который нужно убрать.
Ручной подход и где он ломается
Быстрая замена по регулярному выражению для строк с таймингом (\d{2}:\d{2}:\d{2}[,.]\d{3}\s*-->\s*...) справляется с очевидным случаем. Но вот где всё разваливается:
- Номера cue, похожие на текст. Строка, в которой просто
42, может быть индексом cue, а может, хотя и редко, быть частью самого диалога (персонаж произносит число вслух). Наивное удаление не всегда может надёжно отличить одно от другого в большом объёме данных. - Предложения, разбитые между cue. Субтитры нарезаны для удобства чтения на экране (примерно одна строка на несколько секунд), а не по границам грамматики. Одно предложение регулярно растягивается на два или три идущих подряд cue. Если просто удалить строки с таймингом без склейки фрагментов, получится рваный, несвязный набор кусков вместо связного текста.
- Встроенные теги форматирования.
<i>,<b>, а также теги голоса и цвета в VTT (<v Speaker>,<c.colorname>) тоже нужно убирать, иначе они появятся в выводе как буквальный текст в угловых скобках. - Смешанные символы конца строки. Файлы, экспортированные из разных инструментов или операционных систем, иногда смешивают
\r\nи\n, что может ломать регулярные выражения, рассчитанные только на один из вариантов.
Как выглядит хороший результат
Правильно извлечённый текст читается как обычная проза: целые предложения, разбивка на абзацы там, где есть естественные паузы, никаких случайных чисел или обрывков временных меток, никакой оставшейся разметки. Цель, документ, который выглядит так, будто кто-то просто расшифровал диалог с самого начала, без единого следа формата субтитров, из которого он взят.
Как сделать это без ручной чистки
Наш конвертер SRT в TXT (и аналогичный конвертер VTT в TXT) делает всё это автоматически: номера cue и временные метки удаляются, теги убираются, предложения, разбитые между cue, склеиваются в связные абзацы. Всё работает полностью в браузере, так что ничего из файла никуда не отправляется.