Как я синхронизировал Властелина Колец с его переводом и аудиоверсией

 Публичный пост
10 декабря 2024  803
ОХУЕННО

В ходе попыток прокачать навыки аудирования захотел попробовать собрать себе аналог WhysperSync.

Т.е. синхронизировать текст книги с её аудиоверсией, и добавить рядом еще литературный перевод. Но локально, без необходимости покупать книги в определенных сторах и отдавать задачи на чужие сервера с LLM.

ещё не совсем LLM/GenAI, но уже и не руками

Для теста выбрал "Властелина Колец" – он сложный с точки зрения грамматики, и известен фантазией переводчиков.

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

Сначала задача не показалась сложной. Whisper от OpenAI запускается локально, и если скормить ему текст книги и аудио, выдаёт хорошие результаты.
SubPlz - неплохая обёртка для него от фанатов аниме. Немного программерской магии с версиями Python и Cuda (а также фиксов их core lib с кодировками и английским языком вместо японского) – и он отлично работает на локальной видеокарте. На выходе получаются субтитры на английском. Из приятных бонусов – Whisper работает с любыми языками.

Дальше оказалось сложнее. Сопоставить английскую фразу русской из перевода совсем нетривиально. В теории – с этим должны справляться мультиязыковые модели BERT. На практике почему-то не справлялись. Изначальная задумка была попробовать сопоставить английскую фразу всем вариантам различной длины на русском и выбрать лучшую.

Стабильного результата таким образом добиться не удалось даже с разными метриками и вариациями алгоритма – очистка токенов, динамическое программирование с попыткой предсказать несколько следующих фраз, хитрое нормирование по длине фраз, и прочая магия-вуду не помогли. Вдобавок, работа с фразами из субтитров, а не целыми предложениями, сильно усложняет работу (модель на такое не тренирована, да и в принципе структура языков не всегда позволяет сопоставить части предложения). Хотя может я просто не научился их правильно готовить.

Лучший результат таким способом – это AI-подсказки, каким может быть следующая фраза. Но даже так, с 80-90% точностью, оставшиеся 10-20% для всей книги – долгая работа, вдобавок иногда взрывающая мозг несоотвествием русского литературного перевода оригиналу. Вот пара примеров (на всю трилогию их тысячи):

кричите во всю мочь и палите всё вокруг?

Поэтому тут я вернулся назад к работе с предложениями, чтобы попробовать сопоставить хотя бы их. Разбить текст на предложения – не такая элементарная задача, как может показаться программисту. Можно сильно удивиться, как много в языках нестандартных способов использовать знаки препинания, и как много всего интересного в юникоде. В общем, для токенизации текстов на предложения лучше не морочить себе голову и тоже воспользоваться натренированными моделями. Я брал spaCy – у них есть модели для 25 языках, натренированные на википедии и новостях, в принципе справляются хорошо. На выходе получаются отдельные предложения на русском и английском. Например, для 12-й главы – 503 и 588 предложений.

Лучшее, что нашлось для сопоставления предложений – hunalign. Один из плюсов, что программе можно скормить словарь из соотвествий отдельных слов, чтобы подсказать, что Strider это Бродяжник, а GlorfindelВсеславур.

Это сильно проще, чем разбираться, как наложить патч с дообучением или кастомными весами слов, или еще какими-нибудь методами запихнуть эту информацию под несколько слоёв нейронов. Но даже из и без словаря, hunalign строит его для непонятных ей слов сама.

В принципе, дальше дело техники. Если есть английские сабы с фразами, и пары выровненных предложений, то можно написать скрипт, который заменит фразу этой парой предложений, причём подсветит саму фразу (как в караоке).

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

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


пример: первая же сцена из Snatch – кто кого keeps?

В книге скорее было бы что-то из этого:
I give him a hard time to keep him in check
I give him a hard time. It keeps him in check

Последним штрихом – отобразить не только сабы, но и подсветить проговариваемый текст в PDF. Тут тоже немного заковыристо, встроенные в браузер просмотрщики отключили хуки для отображения текста (почему-то это посчитали несекьюрным и Firefox и в Chrome), сторонние читалки тоже не имеют API для динамической работы с текстом (подсветка по таймингам), а парсить PDF на лету – достаточно сомнительное занятие, так как это чисто output-формат. Проще всего предварительно сконвертировать ему в HTML и грузить/подсвечивать уже его.

Получилось примерно так:


(тут не последняя итерация, дальше вроде вышло и на более короткие фразы разбить)

С английским – работает с любой книгой. По идее и с другими парами языков, все используемые нейронки либо мультиязычные, либо имеют модели для двух-трёх десятков языков.

Если хотите помочь попробовать другие пары языков – пишите в tg (чтобы тут пиратчину на разводить). От вас – откопать книгу на исходном языке + её аудиоверсию + перевод, и потом отслушать результат, чтобы сказать, норм или нет получилось.

Связанные посты
9 комментариев 👇

Интересный подход к решению задачи. Моё почтение. Одобряемс!
Сейчас есть какие-то вещи, которые хочется ещё улучшить? Могу наверное чем-то помочь ))

  Развернуть 1 комментарий

@Gorodecki,
ну пока я вот так сижу и слушаю всё подряд на английском, больше ничего не хочу)

а вообще, интересно было бы генератор упражнений грамматических на основе выделенного текста. т.е. просто выделяешь абзац - скармливаешь нейронке, а она говорит "о из этого текста я могу сделать упражнения на такие темы (к примеру):

  • времена глаголов
  • идиомы
  • фразовые глаголы". Или на более высоком уровне - написать/наговорить пересказ отрывка с проверкой нейрокой и рекомендациями.

Чтобы сразу с текстом поработать прослушанным. Если немного менее обобщенно это делать, то вполне реализуемо вроде.


я делал кусочки этого отдельным скриптом, но через chat-gpt, а не локальные модели (он код сгенерил упражнения на основе написанного мной темплейта и картинок с упражнением из учебника).

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

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

Озвучка роботом очень далека по качеству от профессиональной аудиоозвучки пока что. Если цель - научиться понимать носителей, надо и слушать носителей.

Для меня есть три уровня аудирования:

  1. Понимаешь учебные материалы. То есть текст с экзаменов типа IELTS начитанный специально упрощённо.
  2. Понимаешь речь актёров или профессиональных дикторов (вот чтобы побыстрее этот уровень активно пройти, а не пассивно потреблять контент, я эту штуку и собрал, потому что чаще где-то посередине этого уровня большинство и застревает). Кроме чисто аудирования здесь уже часть непереводимого материала есть, который будешь пропускать больше в сериалах, меньше в книге, если от переводчиков есть сноски с объяснениями. Нейронки тоже иногда могут помочь восстановить, на что намекал автор (не переводческие, а general). В качестве известного примера – щенок бульдога доктора Ватсона.
  3. Понимаешь зашумленную произвольную речь нейтивов, разговаривающих между собой. Ну, или когда актёры/дикторы начинают говорить как будто не на камеру. Примеры - bloopers из сериалов, шотландский акцент (хотя бы примерно о чём речь), эмоциональный спор с перебиванием друг друга в подкастах.

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

А твою адаптацию ЛОТРа почитать можно как финальный продукт или надо сначала весь огород себе установить?

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

На выходе у меня на выходе у меня 2 srt-файла и один большой html (сконвертированный из pdf для удобства подсветки по нему джаваскриптом). Плейер, в который это можно загрузить – простая страничка, написанная на коленке (тут чья нибудь помощь не помешала бы может, сделать нормальный плейер). Её можно или открыть в браузере вообще без сервера, или запустить сервер, чтобы с телефона послушать.

Вот эти два srt-файла и html можно было б и "давать послушать друзьям в некоммерческих целях" или "временно использовать тем, у кого и так есть ВСЕ купленные версии" (и то, это право вечно ограничивать пытаются).

Ну, или выбирать произведения, которые в public domain, но если на известные продукты – то это надо ждать 70 лет с момента смерти автора/публикации (смотря что позже). Если с английским текстом ещё можно что-то интересное найти (в том смысле, что язык не устарел ещё), то для русского перевода сложнее, чаще всего их несколько и поздний -- лучший. Аудиокниг 70 лет назад вообще ещё не было, но тут собственно часть начитана изначально для public domain.

Но вообще, я делился инструкцией для того, чтобы и другие могли поиспользовать конечно (хотя бы нерды, которым не лень всё это локально повторить пока). Ну или есть интерес, какие-то книжки могу для теста поконвертировать, желательно не на английском, чтобы попробовать как это с другими языками работает.

  Развернуть 1 комментарий

Очень классный проект! Когда то так хотел делать для подкастов, что бы изучать язык. Но всё не дошли руки (может у тебя можно такое сделать ? там нужен автоперевод какой-нить хороший видимо). И не давно наткнулся на такую OS либу, может быть пригодиться для выравнивания, не пробовал?

https://github.com/averkij/lingtrain-aligner

  Развернуть 1 комментарий

@vmarcel, ага, мне уже несколько раз указали на неё :)
Действительно, это убер-решение для выравнивания. Ну и даже получилось вывод своих скриптов с ней вместе сшить.

там нужен автоперевод какой-нить хороший видимо)

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

  Развернуть 1 комментарий

Синхронизировал по запросу @bystritskiy Ведьмака на польском, даже получилось чё-то. Ожидается рецензия на качество :)

  Развернуть 1 комментарий

😎

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

Что вообще здесь происходит?


Войти  или  Вступить в Клуб