Как озвучить субтитры на Ютубе

Привет, Хабр! Около полугода назад я наткнулся на статью с практически аналогичным названием . Сама идея мне показалась интересной и захотелось сделать нечто похожее только с использованием компьютерного зрения, и вот что у меня получилось:

Общая архитектура проекта

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

Сбор данных

Решение практически любой ML задачи начинается со сбора данных — эта задача не исключение, поэтому необходимо было собрать датасет, который включает в себя скриншоты видеороликов с YouTube, на которых присутствуют субтитры и выделить ограничительные рамки самих субтитров. Вот основные требования к датасету:

YouTube SubSound — автоматическая озвучка субтитров на YouTube (расширение браузера)

1) Субтитры должны быть на разных языках.

2) Картинка с самим видеороликом должна быть разного размера, то есть видеоролик может быть на весь экран, так и на части экрана.

3) Субтитры находятся в разных областях экрана.

4) Требования к самим субтитрам:

  • могут быть разного размера;
  • семейство шрифтов: обычный и пропорциональный без засечек;
  • цвет шрифта: белый;
  • цвет фона: чёрный;
  • прозрачность фона: 75%;
  • прозрачность окна: 0%.

Датасет был успешно собран сотрудниками компании LabelMe , за что им огромное спасибо! Исходный датасет вы можете найти на Kaggle .

Детекция субтитров

После того как датасет был собран, необходимо обучить модельку находить субтитры, да ещё чтоб и в реальном времени детектировало. Выбор пал на yolov5 . И после 50 эпох обучения на предобученной модельке получились довольно впечатляющие метрики:

И вот как детекция работает в real-time:

Подготовка изображения к оптическому распознаванию текста

Большинству библиотек для распознавания текста, о которых поговорим чуть ниже, лучше передавать grayscale картинку, поэтому первым делом я именно это и делаю:

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 1)) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) _, thresh_img = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY) transformation_image = cv2.morphologyEx(thresh_img, cv2.MORPH_OPEN, kernel, iterations=1)

На выходе получается нечто подобное:

Теперь-то изображение уже готово, казалось бы, бери да и передавай изображение в какую-нибудь библиотеку для распознавания текста, но не тут то было. Дело в том, что yolo выдаёт у меня примерно 10 кадров в секунду и соответственно будет получаться очень много изображений с одинаковым текстом, а зачем нам переводить и озвучивать один и тот же текст много раз?

ПРИЛОЖЕНИЕ ДЛЯ ПЕРЕВОДА СУБТИТРОВ ВИДЕО НА YOUTUBE + ОЗВУЧКА

В OpenCV есть такая прекрасная функция как matchTemplate(). Данную функцию можно рассматривать как очень простую форму обнаружения объектов. Используя сопоставление шаблонов, мы можем детектировать объекты на входном изображении, используя «шаблон», содержащий объект, который мы хотим обнаружить:

Еще по теме:  Ютуб как разделывать курицу

Чтобы найти шаблон на исходном изображении, мы перемещаем шаблон слева направо и сверху вниз по исходному изображению:

Данная функция одним из параметров возвращает условно вероятность от 0 до 1 насколько два изображения похожи между собой. Используя это число, мы можем предположить, что если оно больше, чем 0.75, то на этих двух изображениях расположен один и тот же текст. Более подробно про данную функцию можно почитать тут .

Вторая проблема это то, что текст на следующем кадре дополняется к предыдущему по 1-2 слова, то есть:

Как можно увидеть текст первой картинки отличается от текста второй картинки одним лишь «is». Думаю, это не вариант вычленять по одному слову и передавать это одно слово на следующий шаг, поэтому предлагаю определить каким-то образом, что строка закончилась и только лишь изображение на котором закончилась строка передавать на следующий этап. О том, как мы будем это определять поговорим чуть ниже.

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

Но на деле получается следующее:

Всё дело в том, что детекция отрабатывает не всегда одинаково, то есть часто бывает, что изображение с таким же текстом, но на другом кадре, будет отличаться на 2-3 пикселя по ширине и/или высоте. В данном случае можно найти ограничительные рамки каждой буквы и обрезать изображение по этим координатам и таким образом мы сможем убрать чёрный фон вокруг текста. Про алгоритмы нахождения контуров и ограничительных рамок я писал в одной из прошлых своих статей. И по итогу, у нас должно получиться изображение подобное идеальному случаю. А дальше всё просто: мы передаём полученное изображение вместе с первым ( у которого отсутствует слово is в конце) изображением, в функцию matchTemplate() и действуем точно таким же образом как было описано несколькими абзацами выше. Вот и изображение готово к распознаванию текста:)

OCR

После успешной, на мой взгляд, детекции, хотелось бы так же успешно преобразовывать изображения текста в машиночитаемый текстовый формат, но не тут то было. В качестве библиотек для распознавания текста присмотрел следующие : Tesseract, EasyOCR и PaddleOCR. Теперь необходимо выбрать одну из предложенных. Что ж, было решено провести небольшое исследование и проверить насколько хороша каждая из библиотек работает на моих данных по трём критериям: CER, WER и время работы алгоритма, где про первые две метрики можно почитать тут . Для этого было взято 50 изображений из датасета и субтитры данных картинок я переписал в отдельный JSON файл . Прогнал данные через инференс каждого решения и получил следующие результаты:

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

Еще по теме:  Как узнать что тебя на Ютубе кто то взломал

Теперь нужно определиться с библиотекой, которую стоит использовать. Кажется практически очевидным, использовать PaddleOCR, но проблема в том, что у меня доступно всего лишь 2Гб видеопамяти, из которых ~1.5Гб потребляет моделька детекции, а на CPU данное решение работает достаточно долго, что для real-time не очень-то подходит, такая же ситуация и с EasyOCR, за исключением того, что на CPU мне вообще не удалось запустить данное решение, но на будущее, когда у меня появится достойная видюха, буду иметь в виду:) Остался только Tesseract — его я и буду использовать.

Обработка и перевод текста

Так часто бывает, что Tesseract в слове может неправильно распознать 1-2 буквы, из-за чего в дальнейшем слово может быть переведено неправильно. Поэтому я решил использовать библиотеку pyenchant, которая проверяет орфографию слова и если слово написано неправильно, библиотека советует слово, которое похоже на текущее слово, и уже получившийся текст передаём на следующий этап — перевод.

С переводом всё просто — Google Translate API. Переводит местами не совсем корректно, но быстро и никаких ограничений на количество запросов я не заметил.

Озвучка и визуализация текста

Для озвучки я использовал не навороченную либу pyttsx3. Для русского языка звучит так себе, но со временем привыкаешь. А визуализация текста была реализована при помощи библиотеки PySimpleGUI

Топовый сервис по озвучке текста к видео для Youtube

Добрый день господа. Это мой 90-й пост в этом блоге, и вот я решил сделать его необычным. В прошлом посте я затронул тему сбора ключевиков для создания потока трафика из Youtube, но сегодня, я хочу продолжить тему и написать в двух словах по озвучке. Сервисов есть много, так же софт есть очень качественный под это дело, но в нашем случаи будет все «for free».

Кто очень сильно хочет — найдет этот софт, он все таки своих денег стоит. Для более тонкой наводки, там цена в евро.

Пожалуй перейду от слов к делу. Допустим на руках есть уже готовые текста, и нам нужно с текста сделать звуковую дорожку для нашего ролика. Тесты показали, что самый годный выхлоп от сервиса «ttsmp3». Для наглядности оставлю скрин ниже.

Предлагаю посмотреть на функционал этого сервиса. Визуально он достаточно простой, но простота не значит бесполезность.

Если дословно перевести что они тут пишут, выйдет такое:

«Легко конвертируйте ваш текст на английском языке в профессиональную речь бесплатно. Идеально подходит для электронного обучения, презентаций, видео на YouTube и повышения доступности вашего сайта. Наши голоса произносят ваши тексты на их родном языке с особым акцентом. Кроме того, эти тексты можно скачать в формате MP3. На некоторых языках доступно несколько ораторов.»

Там и в правду есть по несколько спикеров, под разные гео, вот для наглядности:

А это значит, что можно генерировать контент под любое гео и в любом количестве. Все зависит от вашего желания и времени. Чем обольше видео — тем больше трафика!

Еще по теме:  Как избавиться от живота Ютуб

С этим понятно, перейду к осмотру функционала. Как видим в 1 пункте — там нужно забросить наш готовый текст длиной в 3000 символов. На практике это 1,5 минуты озвучки. Когда как, но в среднем это максимум до 2 минут. Во 2 пункте — выбираем гео и спикера который это все озвучит.

Ну и в 3 шаге — кликаем по кнопке «Download as MP3» и получаем готовый звуковой файл с нашей озвучкой в формате mp3, который уже можно использовать для создания видео. Для наглядности, пожалуй сделаю скрин как сохранить готовый звуковой файл.

Файл озвучки готов, а что делать дальше? Дальше нам нужно забросить этот звуковой файл в любой видео редактор и смонтировать уже готовы ролик.

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

Я пользуюсь Камтазией. Софт простой и удобный. Вот для наглядности окрою внутрянку.

Первым делом забрасываем в прогу наше видео и звуковой файл. На скрине это пункт 1 и 2. Дальше Переносим их на поле для обработки, первым делом видео, это пункт 3 и затем звуковой файл, это пункт 4. Далее подгоняем все что бы получить на выходе годный ролик, если все готово, кликаем по кнопке «Поделиться» — это пункт 5 на скрине. Затем софт рендерит ваше видео и на выходе мы получаем готовый результат.

По весу, выходит примерно 10-15 мб, хотя это зависит от исходника видео + длительности звукового файла. В совокупности видео выходит на полторы-две минуты, и по весу максимум 100 мб. Такой вот готовый ролик мы можем выгружать на Youtube. Для наглядности, такой вот ролик у меня получился для примера:

По весу это 64 мб, по длительности это получилось до минуты по времени.

В итоге YT канал с таким контентом хорошо собирает трафик по ключевикам. Для наглядности сделал скрин, по источнику трафа на канале:

Схема работает, трафик летит, бабосы на карманы капают.

Итог.

У всего есть своя цена. Если есть у вас деньги, но нет времени на тесты вашей гипотезы, тогда идите в сторону закупки трафика. Если есть время, но нет желания тратить деньги — добывайте трафик самостоятельно. Как и где, это уже другой вопрос. Арбитраж это не один источник как FB/IG/TT/VK/YT — смотрите шире!

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

На связи Арбихелпер, заходите на досуге, у меня там много полезной инфы!

Источник: partnerkin.com

Расширение для Chrome — YouTube SubSound — автоматическая озвучка субтитров

Расширение для Chrome – YouTube SubSound – автоматическая озвучка субтитров

Listen to this article

Чтобы открыть контент, необходимо пройти быструю регистрацию или войти в свой профиль. После этого Вы получите полный доступ ко всем материалам на портале.

Спасибо что вы с нами!

Рейтинг
( Пока оценок нет )
Загрузка ...