Весной 2023 года прошел хакатон MTS True Tech Hack, на котором был представлен кейс улучшения сервиса просмотра видео для людей с ограниченными зрительными способностями. Предоставить решение во время хакатона нам не удалось, но зато за следующие два месяца мы смогли закончить пил��тную версию сервиса, помогающего слабовидящим людям лучше понимать происходящее на экране. В этом посте мы решили поделиться результатами и деталями нашей работы.

Цель

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

Сложности

Главной сложностью разработки сервиса стала интеграция информации из сериала. Мы остановились на использовании имён персонажей вместо общих терминов вроде "мужчина", "женщина" и так далее. Добиться этого оказалось достаточно сложно: во-первых, чтобы получить желаемый эффект хотя бы в рамках одного сериала, пришлось собрать немаленькое количество данных; а во-вторых, чтобы научиться правильно подставлять имена, необходимо было тщательно анализировать текст.

Результат

В конечном итоге мы получили сервис, представляющий из себя Docker-образ, позволяющий обработать видео и улучшить его доступность для слабовидящей аудитории. Мы опубликовали сервис в Github репозитории. Сервис состоит из различных компонентов: конвертация изображений в текст, распознавание лиц персонажей и последующее сопоставление их с именами, озвучка текста и аудиосегментация. Обо всех подробностях будет рассказано ниже. Мы обработали небольшой отрывок из сериала Теория Большого Взрыва на английском языке в качестве примера работы сервиса:

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

  1. В кадре с фразой "Sheldon points to a brick wall" (Шелдон показывает на кирпичную стену) модель перепутала Шелдона и Леонарда, потому что Леонард отвернулся от камеры и его лицо не распозналось. А вот лицо Шелдона, которое попало прямо в угол кадра, наоборот распозналось, но поскольку в центре кадра все равно Леонард, само описание было связано с его действием. Отсюда и произошла путаница. В будущем, мы хотим улучшить распознавание персонажей и создать механизм, позволяющий убедиться, что описанное действие совершается тем, чье лицо мы увидели.

  2. Для того чтобы не описывать 30 \times 24 = 720кадров, мы описываем происходящее каждую секунду. Но так как количество кадров в секунду в видео-исходнике не делится на ровные секунды, в конце можно заметить, что видео "замерло" чуть раньше того кадра, для которого было сделано озвученное описание. Промах незначительный, но зрячих людей такой эффект может сбить с толку, поэтому, чтобы не ухудшать впечатления для них, мы сделаем паузы в видео точнее.

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

Компоненты

Cхематичное представление сервиса (на английском)
Cхематичное представление сервиса (на английском)

Всего в сервисе пять компонентов:

  1. Описывающий компонент (Describe) представляет из себя обёртку вокруг image-to-text модели. Было решено использовать предобученные модели с платформы Hugging Face. В частности, весьма хорошо себя показала архитектура GIT (Generative Image-to-Text), описанная здесь: https://arxiv.org/abs/2205.14100

  2. Компонент распознавания речи (Listen) необходим для того, чтобы не прервать важный диалог в фильме. Он разбивает аудиопоток на сегменты и выбирает такие моменты, когда кто-то из персонажей заканчивает свою реплику. Метод называется Speaker Diarization и подробнее описан здесь: https://github.com/pyannote/pyannote-audio

  3. Компонент определения персонажей (Recognize) – наша гордость. Он необходим для распознавания лиц и сопоставления имён. Так как мы используем готовые модели для конвертации изображения в текст, зачастую мы получаем описания вроде:

    Мужчина в зеленой футболке стоит у кирпичной стены
    Девушка со светлыми волосами играет в теннис

    Если "Шелдон в зеленой футболке" еще приемлемое описание, то постоянно слышать "Пенни со светлыми волосами" может надоесть. Поэтому мы решили заменять не просто слова, а группы слов. Чтобы сгруппировать слова, мы обошли дерево зависимостей построенное моделью stanza от Стэнфордского университета. Но это еще не все. Гораздо большей проблемой стало появление нескольких персонажей в кадре. В таком случае, имея два имени и описание вроде "мужчина в зеленой футболке ударил мужчину в шляпе", мы поняли, что мы не знаем, какое имя относится к какому мужчине.

    Чтобы правильно сопоставлять слова и имена, мы анализируем несколько кадров до и после события и статистически анализируем полученные описания. Если мы часто распознавали в кадре Шелдона, и описания ко всем этим кадрам содержали "мужчина в зеленой футболке", то скорее всего правильно будет выполнить следующую замену в вышеупомянутом предложении: "Шелдон ударил мужчину в шляпе". Таким образом, используя статистику с разных кадров, мы сопоставляем группы слов и имена персонажей.

  4. Компонент озвучки (Say) представляет собой обертку вокруг text-to-speech модели. Опять-таки взятой с платформы Hugging Face.

  5. Финальный компонент (Mixer) собирает работу всех остальных компонентов вместе и редактирует исходное видео, вставляя в него паузы и озвученные описания.

Сервис

Сам сервис представляет собой Docker-изображение, из которого можно собрать контейнер, способный обрабатывать единичные видео. На данный момент он довольный медленный, так как нам приходится со��давать описания для всех кадров, чтобы собрать статистику. Без поддержки видеокарты, на обработку видео длинной Nсекунд уходит \approx15Nсекунд. В будущем, мы изменим стратегию сбора статистики и описывать придётся намного меньше. В целях сделать сервис, способный работать в прямом эфире.

Заключение

В заключении, стоит отметить, что идея добавления аудио описания с целью помочь слабовидящим людям не нова. В Apple TV в некоторых фильмах можно включить похожую опцию. Однако, там это сделано при помощи актёров озвучки и сделано вручную. Мы же попытались приблизиться к похожему результату, но при этом сделать сервис полностью автоматическим. В целом, мы очень довольны результатом: комбинировать модели с разных областей и разным интерфейсом было тяжело и интересно. Очень надеемся, что в будущем наша работа окажется полезной и в популярных киносервисах появится опция аудио-субтитров.

Авторы: Александр Лобанов (dev@alobanov.space) и Айхем Буабид (bouabidayhem@gmail.com)