Language Dove: как я транскрибирую и перевожу фильмы. language dove.. language dove. llm.. language dove. llm. Natural Language Processing.. language dove. llm. Natural Language Processing. speech-to-text.. language dove. llm. Natural Language Processing. speech-to-text. youtube.. language dove. llm. Natural Language Processing. speech-to-text. youtube. английский.. language dove. llm. Natural Language Processing. speech-to-text. youtube. английский. Изучение языков.. language dove. llm. Natural Language Processing. speech-to-text. youtube. английский. Изучение языков. искусственный интеллект.. language dove. llm. Natural Language Processing. speech-to-text. youtube. английский. Изучение языков. искусственный интеллект. Машинное обучение.. language dove. llm. Natural Language Processing. speech-to-text. youtube. английский. Изучение языков. искусственный интеллект. Машинное обучение. перевод.. language dove. llm. Natural Language Processing. speech-to-text. youtube. английский. Изучение языков. искусственный интеллект. Машинное обучение. перевод. Работа с видео.. language dove. llm. Natural Language Processing. speech-to-text. youtube. английский. Изучение языков. искусственный интеллект. Машинное обучение. перевод. Работа с видео. субтитры.. language dove. llm. Natural Language Processing. speech-to-text. youtube. английский. Изучение языков. искусственный интеллект. Машинное обучение. перевод. Работа с видео. субтитры. транскреация.. language dove. llm. Natural Language Processing. speech-to-text. youtube. английский. Изучение языков. искусственный интеллект. Машинное обучение. перевод. Работа с видео. субтитры. транскреация. французский.

Я обожаю смотреть иностранные фильмы в оригинале.

Во-первых, мне нравится расширять кругозор, погружаться в другую культуру, расшифровывать структуру разных языков, пополнять словарный запас.

Во-вторых, мне просто нравится звучание некоторых языков – например, французского, датского, китайского.

Также я работаю над сайтом по изучению языков Language Dove, а учить языки по фильмам – это очень эффективно.

Так родился проект по генерации идеальных субтитров.

Функциональность субтитров:

  1. Подсветка слов в момент произношения – для тренировки восприятия на слух

  2. Адаптивный перевод каждой строки

  3. Контекстуальный перевод для каждого слова, который можно подписать сверху для быстрого доступа

  4. Романизация для языков с нелатинской письменностью

  5. Интерактивный словарь: клик по слову открывает статью в Wiktionary

  6. UI для кастомизации субтитров: пользователи должны иметь возможность оставить только то, что им нужно

Субтитры генерируются автоматически, но с возможностью ручного вмешательства – можно редактировать как транскрипт, так и переводы (как адаптивные, так и пословные).

Результаты

Результаты можно посмотреть на моем сайте.

Я на данный момент обработал видео на английском, французском и русском.

На английском (с переводом на русский):

  1. Animal Farm (Скотный двор) – британский мультфильм 1954 года по Оруэллу

  2. Двухчасовое видео Андрея Карпаты, где он пишет и обучает GPT с нуля

  3. History of the entire world I guess от Bill Wurtz – ролик, растащенный на мемы

  4. Одно из ранних видео классика англоязычного научпопа Vsauce: “Is Earth Actually Flat”

    Language Dove: как я транскрибирую и перевожу фильмы - 1

На французском (с переводом на английский):

  1. Мини-сериал «Анна Каренина» (2013–2018) – почти 200 минут видео

  2. Мультфильм 1985 года Astérix et la Surprise de César

Language Dove: как я транскрибирую и перевожу фильмы - 2

На русском (с переводом на английский):

  1. Иван Васильевич меняет профессию

  2. Холоп

  3. Алеша Попович и Тугарин Змей

  4. Наша Раша: яйца судьбы

  5. Первая и вторая серия Интернов в одном видео

  6. Первая серия Кухни

  7. Двухчасовая лекция Светланы Бурлак о языковом родстве

Language Dove: как я транскрибирую и перевожу фильмы - 3

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

Language Dove: как я транскрибирую и перевожу фильмы - 4

Архитектура решения

Алгоритм принимает видеофайл и генерирует HTML-страницу с видеоплеером и оверлеем субтитров. Есть два режима: для сайта (со встроенным YouTube-плеером – без нарушения копирайта и без хранения файлов на сервере) и для тестов (полностью локальный плеер).

Пайплайн обработки видео:

  1. Препроцессинг аудио

  2. Транскрибация с помощью ASR-моделей (ASR – Automatic Speech Recognition)

  3. Получение чистого текстового транскрипта: либо с помощью правки результатов ASR, либо с помощью правки внешних субтитров

  4. Forced alignment: определение таймингов слов локальной моделью с использованием текстового транскрипта и результатов ASR

  5. Укладывание слов в строки субтитров по особым правилам – так, чтобы было удобнее читать

  6. Адаптивный перевод субтитров на уровне строк

  7. Перевод субтитров на уровне отдельных слов

  8. Генерация веб-страницы

Препроцессинг аудио

Суть препроцессинга – подавление участков аудио, которые не содержат речь.

Для детекции речи я использую локальную VAD-модель Silero (VAD – Voice Activity Detection), которая возвращает псевдовероятность V (от 0 до 1) наличия речи в каждом фрейме.

Экспериментальным путём я вывел формулу коэффициента громкости для фрейма:

K = min(1, (V/0.4)³)

При V ≥ 0.4 громкость не меняется. При меньших значениях она падает, причём резко: например, при V = 0.2 громкость уменьшается в 8 раз.

Интересно, что бустинг участков с высоким V (K > 1) ухудшал метрики транскрибации – поэтому от него пришлось отказаться.

После расчёта коэффициентов массив K сглаживается (резкие перепады громкости могут запутать ASR-модели), и громкость каждого фрейма корректируется.

Транскрибация с помощью ASR-моделей

Алгоритм транскрибации возвращает массив токенов со следующими атрибутами:

  1. text – значение токена

  2. start/end – тайминги в миллисекундах

  3. score – оценка надежности таймингов (от 0 до 1)

  4. speaker – локальный идентификатор спикера (нужен для определения моментов смены говорящего внутри одного сегмента речи). Опционален, может принимать значение None.

Сначала с помощью данных VAD выделяется сегменты с речью (соседние сегменты объединяются, если их разделяет достаточно маленький кусок аудио). Затем для каждого сегмента запускается каскад ASR-моделей. 

От ASR-моделей требуется возвращать только текст сегмента (таким образом, ASR модели любой архитектуры совместимы с пайплайном). Тайминги и score для каждого токена определяются с помощью локальной forced-alignment модели.

Значения score для всех токенов агрегируются, чтобы вывести оценку качества транскрибации сегмента данной ASR-моделью.

Логика каскада: если первая модель дает достаточно высокий агрегированный score, обработка завершается. Иначе запускаются остальные модели (в текущей конфигурации их две), и выбирается лучший результат.

Сегменты с лучшим результатом ниже порога качества игнорируются – обычно это случаи, когда VAD принял посторонний звук за речь.

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

Получение текстовго транскрипты

Наша цель – получить максимально точный текстовый транскрипт. Есть несколько стратегий в зависимости от исходных данных.

Вариант 1: Нет внешних субтитров

Формируем текст из ASR-токенов, затем улучшаем его через LLM с промтом вида “исправь орфографию, грамматику и пунктуацию, не меняя смысл”.

LLM делает две важные вещи:

  1. Восстанавливает по контексту участки с явными ошибками ASR (результат почти всегда осмыслен, хотя не всегда соответствует оригиналу)

  2. Нормализует пунктуацию – это критично для качественного перевода

После этого все равно желательно пройтись по тексту вручную. К сожалению, это требует знания языка и занимает много времени.

Вариант 2: Есть внешние субтитры

Можно распарсить их и собрать в транскрипт. Но с внешними субтитрами к фильмам постоянно всякие проблемы:

  1. В субтитрах “Кухни” были комментарии для изучающих русский. Иногда в субтитрах также бывает html-разметка. Все это можно вычистить регулярками

  2. Субтитры “Алеши Поповича” выглядят так, как будто их писал второклассник. Ну, это не очень большая проблема – натравляем на текст LLM-ку, и она переписывает всё по-нормальному 

  3. В субтитрах для “Ивана Васильевича” отсутствовала добрая часть коротких реплик

  4. Самый тяжелый случай, “Astérix et la Surprise de César”: множество реплик перефразированы автором субтитров на свой вкус. Чтобы исправить такие субтитры вручную, нужно хорошо знать язык и угробить кучу времени

Для двух последних ситуаций я разработал специальный алгоритм: он матчит ASR-массив с текстом субтитров, делит на куски, которые железно соответствуют друг другу; затем для каждого куска подаёт в LLM оба варианта – и модель восстанавливает оригинал на основе двух источников.

Для Ивана Васильевича этот алгоритм сработал отлично (потом я внес лишь мелкие косметические правки). Для Астерикса – удовлетворительно: метрики forced alignment сильно выросли, тайминги стали намного лучше, но мне всё равно пришлось ещё раз пройтись по тексту и исправить моменты, где LLM не шмогла.

Forced Alignment

Теперь нужно определить тайминги для токенов правильного транскрипта, полученного на предыдущем этапе. 

Однако нельзя просто так взять и запихнуть весь транскрипт и всё аудио в forced alignment модель – не хватит ни памяти, ни времени (сложность forced alignment – O(n²) от длины аудио).

Решение: матчим ASR-массив с токенами транскрипта и разбиваем аудио на мелкие кусочки для forced alignment.

На выходе получаем два типа токенов:

  1. Совпавшие (были и в массиве ASR, и в транскрипте): два набора таймингов и score

  2. Только в транскрипте: один score и один тайминг

Для токенов первого типа выбираем тайминг с лучшим score. 

После этого может нарушиться монотонность таймингов – восстанавливаем её PAV-алгоритмом (L1 Isotonic Regression – минимизирует сумму модулей изменений).

Укладывание слов в строки субтитров

Алгоритм работает с одним жёстким ограничением (на максимальную длину строки) и тремя хотелками, на основании которых строится оптимизируемая функция потерь:

  1. Желательно, чтобы границы строк приходились на концы предложений, знаки препинания (запятая, точка с запятой, многоточие) или длинные паузы

  2. Желательно разделение разных спикеров

  3. Желательно избегать слишком коротких строк – чтобы дать пользователю больше времени на чтение

Перевод на уровне строк: транскреация против обычного перевода

Работая над этим проектом, я понял, что раньше переводил художественные тексты через LLM неправильно.

Я просил просто перевести текст, добавляя требования вроде “чтобы звучало естественно”. Результат получается правильный по смыслу, но деревянный. По сути, получается улучшенная версия Google Translate.

Транскреация – это другой подход. Вместо перевода мы просим переписать текст на языке перевода, адаптируя текст под аудиторию носителей языка перевода.

Преимущества транскреации:

  1. Свобода в структуре: LLM перестаёт следовать синтаксису оригинала, перевод звучит естественнее

  2. Адекватная передача нестандартной манеры речи: стилизаций, сленга, эмоций

  3. Адаптация культурных реалий: например, в “Иване Васильевиче”, где Якин гадает, какой актёр “играет царя:, советские актёры заменены на англоязычных

  4. Каламбуры (кошмар любого переводчика) иногда получается адекватно перевести. Да, процент успеха все равно не очень высок, но у гугл-транслейта он вообще нулевой

  5. Когда модель понимает, что какой-то кусок текста нужно переводить очень художественно, с минимальной оглядкой на оригинал, она это сделает. В основном это касается песен – LLM даже способна переводить с сохранением рифмы

Полезно указывать источник текста для дополнительного контекста. Например, при переводе “Интернов” Claude Opus 4.5 понял, что “Анастасия Константиновна” нужно переводить как “Dr. Kisegach”.

Но есть нюанс. Транскреация годится только для текстов с невысокой ценой ошибки. В попытках адаптации модель может накреативить не в том направлении.

Пример: перевожу лекцию по лингвистике с русского на английский. Лектор произносит фразу на чешском, демонстрируя, что родственные языки можно понять без перевода. Модель заменяет чешский на французский. Это плохой выбор: французский родствен английскому только на индоевропейском уровне, а их сходство объясняется заимствованиями – о чём лектор говорила буквально за несколько минут до этого. Лучше был бы скотс или голландский, но и чешский оставить – вполне адекватно.

Ещё одно преимущество транскреации: ее легче редактировать вручную. В Google Translate всё вроде бы правильно, но сам бы так не написал – приходится переписывать всё. При транскреации ошибки в среднем грубее, но они сконцентрированы, а большая часть текста звучит нормально.

Переводить нужно большими кусками для максимума контекста. Подробнее о технике перевода большими кусками с сохранением структуры массива строк – в моей англоязычной статье.

Главный bottleneck алгоритма перевода сейчас – это отсутствие доступа к картинке. Не всегда можно перевести правильно, имея только текст. 

Типичные ошибки:

– Мисгендеринг из-за гендерно-нейтральных формулировок в оригинале

– Неправильные местоимения, когда из текста неясно, о ком речь

– Выбор неподходящего узкого понятия вместо широкого (например, перевод слова “трусы” словом “boxers”, когда речь идет о женских трусах)

Для следующего скачка в качестве перевода нужно начать использовать видеоряд.

Перевод на уровне отдельных слов

Про этот алгоритм я уже рассказывал на Хабре (и с тех пор улучшил его).

Это очень буквальный перевод, который при этом старается выглядеть складно на языке перевода. С примерно таким же подходом Кирилл и Мефодий переводили Библию с греческого на славянский – буквальность была нужна, чтобы избежать еретических толкований. Именно поэтому церковнославянские тексты звучат странно – у них греческая структура.

Транскреация и буквальный пословный перевод – это два полюса идеологии перевода, и они отлично дополняют друг друга.

Типичный кейс использования: вы знаете 90% слов в фильме, но из-за остальных 10% смысл ускользает (как у меня с французским или польским). Гораздо удобнее глянуть контекстуальный перевод над незнакомым словом, чем парсить перевод всей строки и вычленять оттуда нужное слово – для этого точно придётся останавливать видео.

Генерация веб-страницы

Перед генерацией HTML можно исправить переводы через редактирование .txt-файла: для каждой строки субтитров сначала идет адаптивный перевод, затем переводы отдельных слов. Редактировать можно только сами переводы (но не структуру) – то есть, то, что идет после знака =

Language Dove: как я транскрибирую и перевожу фильмы - 6

На этапе генерации .html-файла

  1. Идет фильтрация строк по качеству таймингов. Строки с низким агрегированным score отбрасываются – лучше не показать реплику, чем показать в неправильное время. У лекций отфильтровывается в среднем пара реплик на час видео; у фильмов – около 3%; рекорд у «Астерикса» – 8%. Можно вручную включить/исключить любую реплику через редактирование файла переводов.

  2. Для строк субтитров определяем тайминги их начала и конца, которые отличаются от таймингов первого и последнего слова соответственно. Чтобы было больше времени на чтение субтитров (все-таки, мы ориентируемся на изучающих язык), нужно удлинить время их показа. Если строка субтитров стоит в изоляции, она начинает отображаться за 2 секунды до начала первого слова, и продолжает еще 10 секунд после конца последнего. Если интервал между строками меньше 12 секунд, то он распределяется между этими строками в том же соотношении 1 к 5; ⅚ времени интервала стоит первая строка, и ⅙ времени – вторая.

  3. Если у языка нелатинская письменность, делаем романизацию. Юзер может настроить на свой вкус: либо отображать текст без романизации, либо заменить текст на романизацию, либо отображать романизацию сверху над словом. Романизация нужна либо на начальных этапах, когда вы без неё не успеваете читать субтитры; либо когда вас мало интересует письменность языка (например, вы увлекаетесь лингвистикой, и вам интересна структура какого-нибудь экзотического языка вроде арабского); либо для языков с логографическим письмом (китайский и японский)

  4. Проставляем ударения в русском: проставляем только в однозначных случаях, омографы типа «слова́/сло́ва» не трогаем. В будущем можно добавить аналогичные фичи для других языков (например, огласовки в арабском)

  5. Делаем слова кликабельными – по клику открывается Wiktionary со словарной статьёй.

  6. Встраиваем субтитры в HTML+JS+CSS плеер – либо локальный (со ссылкой на реальное видео в файловой систем), либо ютубовский.

В плеере также есть отдельный UI для кастомизации субтитров:

  1. Отображать ли пословный перевод над словом, или только при наведении на него

  2. Перевод на уровне строк: отображать всегда вместе с оригиналом; отображать при наведении на специальную иконку; не отображать вообще; или отображать только перевод, без исходного текста

  3. Если язык не на латинице, настройки романизации

  4. Отображать ли субтитры в одну строку или в две

  5. Вертикальная позиция субтитров

  6. Размер субтитров

Все эти настройки (а также временная позиция в каждом из видео) персистентны, они хранятся в local storage.

Автор: einhorn

Источник

Rambler's Top100