Весной 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)

Комментарии (6)


  1. AigizK
    05.07.2023 20:36

    Просто респект, ребята!


  1. pirog13
    05.07.2023 20:36

    Большие молодцы!


  1. nikotin55
    05.07.2023 20:36

    Получилось ли привлечь инвесторов к проекту


    1. AlexTeexone Автор
      05.07.2023 20:36

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


      1. Lelant0s
        05.07.2023 20:36

        Напишите сразу в западные студии и стриминговые сервисы.


  1. kranid
    05.07.2023 20:36

    Классная штука!