Конвертер SUP (PGS) в SRT
При первом запуске скачивается распознаватель текста — около 4 МБ плюс языковая модель, с этого сайта; дальше их кэширует браузер. Ничего не загружается, а результат получен машиной: вычитайте его, прежде чем на него полагаться.
Параметры
Растровый субтитр — это изображение текста, поэтому слова приходится вычитывать из него. Скажите распознавателю, на каком языке написаны субтитры: в списке все языки, на которых публикуется этот сайт. Русские субтитры, прочитанные английской моделью, выходят шумом, а не русским текстом. Скачивается только выбранная модель (остальные — никогда), поэтому переключение стоит одной загрузки на язык, дальше она в кэше.
Файл .sup — это поток PGS, растровый формат субтитров, который используют диски Blu-ray: в нём нет ни одного символа — каждый субтитр хранится картинкой вместе с палитрой и моментом, когда он должен появиться, а плеер накладывает её поверх видео. Получить из него текст значит прочитать буквы на каждой картинке; страница делает это во вкладке движком OCR, который сайт отдаёт сам, и записывает результат в файл .srt.
Формат — это последовательность сегментов, у каждого тринадцатибайтовая шапка с моментом показа в единицах 90 кГц, типом и длиной; из четырёх важных типов складывается кадр: палитра (PDS) отображает индексы в полный RGB через YCbCr, объект (ODS) несёт одну сжатую кодом длин серий картинку, композиция (PCS) говорит, какие объекты где стоят на кадре, а набор отображения их собирает.
Поток PGS вообще не несёт времени конца — субтитр висит на экране, пока его не заменит следующий набор отображения, — поэтому концом каждой реплики здесь служит начало следующей, ровно как это делает плеер. Выбирайте язык, на котором субтитры действительно написаны: список покрывает все языки, на которых публикуется этот сайт, и каждая модель читает свою письменность, а запуск английской модели по японским субтитрам даёт шум, а не плохой перевод, потому что распознаватель ищет формы, которых там нет.
Частые вопросы
Что лежит внутри .sup, из-за чего конвертация в SRT становится распознаванием?
Сегменты, а не символы. Каждый субтитр в потоке PGS — это объект: сжатая кодом длин серий картинка из индексов палитры плюс определение палитры, которое превращает индексы в RGB. Единственные похожие на текст значения в файле — моменты показа, целые числа в единицах 90 кГц, а не что-то, что читает человек. Превратить это в SRT значит положить каждую картинку на холст и распознать буквы — поэтому результат нужно вычитывать и поэтому страница спрашивает, на каком языке субтитры.
Почему последний субтитр в результате кончается на пару секунд позже, чем следовало?
Потому что PGS никогда не говорит, когда субтитр кончается. Плеер показывает композицию, пока не придёт следующая или пока поток не очистят, поэтому единственное время конца, которое есть в файле, — это начало следующего. У последней реплики следующей нет; страница даёт ей две секунды и записывает это решение в список потерь. Если диск действительно держал последнюю строку десять секунд, честное исправление — сдвиг или правка длительности, а не догадка, спрятанная в конвертере.
Какую языковую модель выбрать для субтитров, где есть и японские, и английские строки?
Ту, на которой написана большая часть диалога. Кадр PGS может смешивать письменности в одной строке — японское предложение с английским заимствованием латиницей встречается часто, — но распознавателю на один запуск даётся одна модель, и модель, обученная на одной письменности, читает другую как мусор. Если файл действительно чередует две письменности, прогоните его дважды, по разу на язык, и оставьте строки, которые каждый проход прочитал правильно: результат — обычный .srt, поэтому слить два файла проще, чем заново экспортировать.
Переносятся ли цвета субтитров в SRT?
Нет, и не могут. .sup кодирует цвет трижды: в палитре (YCbCr с альфа-каналом, отдельно для каждой реплики), в композиции (где картинка стоит на кадре 1920×1080) и в обводке и тени, нарисованных внутри самой картинки. У SRT нет ни одного из этих мест. Страница читает яркость каждого пикселя, чтобы решить, что здесь чернила, а что фон, — этого OCR достаточно, — а оформление сообщает в списке потерь один раз на файл, а не делает вид, что цвета уцелели.
Некоторые реплики вышли пустыми или отсутствуют. Что с ними стало?
Картинка, из которой не получилось текста, была отброшена, а не записана пустым субтитром. Это бывает с кадрами появления и исчезновения, с репликами, которые состоят только из логотипа или символа, и с очень мелким текстом меньше того размера, который распознаватель различает. Каждая такая реплика посчитана в списке потерь, поэтому полученный файл не короче отданного молча. Если счёт велик, обычная причина — неверная языковая модель или поток с необычно мелкими картинками.
Отправляется ли .sup или его картинки куда-нибудь?
Нет. Распознаватель работает во вкладке, а его worker, ядро WebAssembly и языковая модель отдаются с этого сайта и кэшируются браузером. Единственные запросы, которые делает страница, — за этими файлами. Здесь это важнее, чем на текстовой странице: поток PGS, извлечённый с диска, часто оказывается тем самым материалом, который студия или юрист меньше всего готовы отдать третьей стороне, и весь смысл страницы в том, что отдавать не нужно.