Создание караоке-видео через Whisper и Spleeter

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

Spleeter и Whisper — это инструменты машинного обучения с открытым исходным кодом, предназначенные для анализа и обработки звука. Оба инструмента были разработаны и выпущены вместе с предварительно обученными языковыми моделями, что позволяет запускать их непосредственно на входных данных (аудиофайлы MP3 или AAC) без какой-либо дополнительной настройки. Spleeter используется для отделения вокальных треков от инструментальных, а с помощью Whisper можно создать субтитры. Обе программы широко используются по отдельности, но вместе они имеют особое применение: их можно использовать для создания караоке-треков из обычных аудиофайлов. В этом мануале мы покажем, как при помощи Whisper и Spleeter создавать караоке-треки или интегрировать их в другой стек приложений.

Требования

Эти инструменты доступны на большинстве платформ. 

 Для запуска Whisper и Spleeter потребуется не менее 3 ГБ памяти, поэтому если вы работаете на сервере с ограниченными ресурсами, следует включить своп. Об этом можно прочитать в мануале Как добавить swap.

Spleeter и Whisper — это библиотеки Python, поэтому вам необходимы Python и pip (менеджер пакетов Python). Ознакомьтесь с разделом 1 мануала Установка Python 3 и настройка среды разработки.

Также Spleeter и Whisper используют библиотеки машинного обучения, которые могут работать в 10-20 раз быстрее на графическом процессоре. Если GPU не обнаружен, они автоматически вернутся к работе на CPU. Настройки поддержки GPU нет в этом мануале, но она должна работать после установки PyTorch в средах с поддержкой GPU.

1: Установка Spleeter, Whisper и других инструментов

Устанавливать инструменты, которые будем использовать в этом проекте, нужно с помощью pip. В дополнение к Spleeter также нужно установить скрипт youtube-dl, с помощью которого можно загрузить видео с YouTube локально (видео будем использовать как пример). Установите их с помощью pip install:

sudo pip install spleeter youtube-dl

Вместо установки Whisper можно с помощью pip напрямую установить библиотеку yt-whisper прямо из Github. yt-whisper включает сам Whisper в качестве зависимости, поэтому после установки будет доступ к команде whisper, а кроме этого установится скрипт yt-whisper, с помощью которого можно в один шаг загрузить и создать субтитры к видео с YouTube. pip install может парсить ссылки Github на репозитории Python (с флагом git+):

sudo pip install git+https://github.com/m1guelpf/yt-whisper.git

Для дополнительной обработки аудио и видео нужен ffmpeg — универсальный инструмент для обработки, объединения и перекодирования аудио- и видеофайлов. В Ubuntu его можно установить с помощью диспетчера системных пакетов. Запустите apt update, а затем apt install:

sudo apt update
sudo apt install ffmpeg

Все необходимые инструменты установлены, в следующем разделе мы загрузим аудио и видео.

2: Загрузка и извлечение аудио из видео

youtube-dl — это инструмент для загрузки видео с YouTube в локальную среду. Но будьте осторожны при использовании материалов, защищенных авторским правом, особенно когда выполняете дополнительную обработку видео или используете их как исходники.

С помощью youtube-dl загрузите видео, которое мы будем использовать в этом туториале. Это ссылка на песню “Lie 2 You”, но вы можете использовать другую:

youtube-dl https://www.youtube.com/watch?v=dA2Iv9evEK4&list=PLzCxunOM5WFJxaj103IzbkAvGigpclBjt 

youtube-dl загрузит песню вместе с некоторыми метаданными и объединит их в один видеофайл .webm. Можете попробовать воспроизвести это видео в локальном медиаплеере (например mpv).

Примечание. Иногда загрузка может быть медленной, поскольку youtube-dl напрямую не поддерживается YouTube.

Далее необходимо извлечь звуковую дорожку из загруженного видео. В этом ffmpeg превосходит другие инструменты. С помощью следующей команды ffmpeg мы выведем аудио в новый файл audio.mp3:

ffmpeg -i "Lie 2 You (ft. Dylan Emmet) – Leonell Cassio (No Copyright Music)-dA2Iv9evEK4.webm" -c:a libmp3lame -qscale:a 1 audio.mp3

Давайте рассмотрим синтаксис команды ffmpeg:

  • -i /path/to/input — это путь к входному файлу, в данном случае к видео .webm, которое мы только что загрузили.
  • -c:a libmp3lame определяет аудиокодек для кодирования. Все аудио и видео нужно как-то кодировать, а libmp3lame — самый распространенный mp3-кодек.
  • qscale:a 1 определяет битрейт выходного mp3, в данном случае переменный битрейт 220 кбит/с. Ознакомиться с другими параметрами можно в материалах ffmpeg.
  • audio.mp3 — название выходного файла, которое указывается в конце команды без каких-либо флагов.

После выполнения этой команды FFmpeg создает новый файл audio.mp3.

Примечание. Ознакомиться подробнее с опциями ffmpeg можно в сообществе ffmprovisr или в официальной документации.

Далее с помощью Spleeter мы изолируем инструментальную дорожку от нового файла audio.mp3.

3: Разделение вокальных дорожек с помощью Spleeter

В Spleeter есть несколько моделей, которые позволяют выполнять сложное разделение дорожек: фортепиано, гитары, барабаны, бас и т.д. Но сейчас мы будем использовать модель по умолчанию 2stems. Запустите команду spleeter separate на файле audio.mp3, также указав путь к каталогу -o output:

spleeter separate -p spleeter:2stems -o output audio.mp3

Выполнение этой команды может занять несколько минут, если вы используете Spleeter без GPU. Команда создаст новый каталог output с двумя файлами: voices.wav и accompaniment.wav. Это разделенные вокальный и инструментальный треки. Ознакомьтесь с этими материалами, если возникли какие-то ошибки или нужно дополнительно настроить Spleeter.

Можете попробовать прослушать эти файлы в MPV или другом аудиоплеере. Пока они будут иметь относительно большой размер, поскольку Spleeter декодирует их в необработанный WAV-вывод, но далее мы будем кодировать их обратно в одно видео.

4: Создание титров с помощью Whisper

Теперь нужно сгенерировать титры из исходного видео. Можно запустить команду whisper непосредственно на скачанное видео .webm, но быстрее будет применить команду yt_whisper к исходной ссылке на видео YouTube:

yt_whisper https://www.youtube.com/watch?v=dA2Iv9evEK4&list=PLzCxunOM5WFJxaj103IzbkAvGigpclBjt

Если просмотреть исходный код yt_whisper, то можно понять, какие пресеты yt_whisper передает whisper для генерации титров из видеоролика YouTube. Например, по умолчанию используется параметр –model small. В документации Whisper указано, что эта модель — хороший компромисс между требованиями к памяти, производительности и точности. Если вам когда-нибудь понадобится запустить whisper самостоятельно на другом источнике входного сигнала или с другими параметрами, можете использовать эти пресеты как основу.

Выполнение команды может занять несколько минут, если вы используете Whisper без графического процессора. Команда создаст файл титров для видео в формате .vtt. Чтобы убедиться, что титры соответствуют тексту песни, можете проверить их с помощью head или текстового редактора:

head -20 Lie_2_You__ft__Dylan_Emmet____Leonell_Cassio__No_Copyright_Music.vtt

WEBVTT

00:00.000 --> 00:07.000
I need feeling you on me And I guess in a way you do

00:07.000 --> 00:19.000
All my breath on revelin' emotions I need some space to think this through

00:19.000 --> 00:29.000
Call me all night long Try to give you hints in a hard to see

00:29.000 --> 00:39.000
Right on the line, no Losing it on you is the last thing I need

00:39.000 --> 00:49.000
If I'm honest, I'll just make you cry And I don't wanna fight with you

00:49.000 --> 00:57.000
I would rather lie to you But if I'm honest, now's not the right time

Теперь у нас есть отдельные звуковые дорожки и файл субтитров. На последнем этапе с помощью ffmpeg соберем их вместе.

5: Объединение аудио и видео дорожек с субтитрами

Сейчас мы объединим выходные данные в готовое видео, которое содержит: исходное фоновое видео; созданную с помощью Spleeter изолированную инструментальную дорожку; созданные с помощью Whisper субтитры. Сделать это можно с помощью одной команды ffmpeg:

ffmpeg -i "Lie 2 You (ft. Dylan Emmet) – Leonell Cassio (No Copyright Music)-dA2Iv9evEK4.webm" -i output/audio/accompaniment.wav -i "Lie_2_You__ft__Dylan_Emmet____Leonell_Cassio__No_Copyright_Music.vtt" -map 0:v -map 1:a -map 2 -metadata:s:s:0 language=eng -c:v copy -c:a aac -c:s mov_text final.mp4

В отличие от команды ffmpeg, эта команда использует три разных входа: видео .webm, аудио .wav и субтитры .vtt. Она использует несколько map аргументов для привязки первого (или 0-го, считая с 0) ввода к видеодорожке, затем с аудио и последнего с метаданными субтитров: -map 0:v -map 1:a -map 2 -metadata:s:s:0 language=eng. Затем указываются кодеки для каждой дорожки:

  • c:v copy – исходный источник видео сохраняется, а не перекодируется. Это обычно экономит время и сохраняет качество видео (кодирование видео нагружает CPU при работе с ffmpeg), если у исходного источника совместимый формат. youtube-dl почти всегда по умолчанию использует распространенный формат H264, который можно использовать для потокового видео, отдельных файлов .mp4, дисков Blu-Ray и т. д., поэтому не нужно это изменять.
  • c:a aac – звук перекодируется в формат AAC. AAC используется по умолчанию для большинства видео в формате .mp4, поддерживается практически во всех средах и обеспечивает хороший баланс между размером файла и качеством звука.
  • c:s mov_text определяет формат субтитров. Несмотря на то, что субтитры были в формате vtt, mov_text – это обычный формат субтитров для встраивания их в видео.

Примечание. Можете сместить субтитры на пару секунд раньше, чтобы зрители могли заранее увидеть следующие строки. Это можно сделать с помощью флага -itsoffset -2 в команде ffmpeg.

В конце указываете формат вывода – final.mp4. Обратите внимание, что мы не указали выходной формат .mp4, кроме как в названии файла — ffmpeg автоматически определит формат вывода исходя из пути. При работе с аудио- и видеофайлами кодеки важнее, чем сами типы файлов, которые выступают как контейнеры для контента. Различия заключаются в поддержке типов файлов в видеоплеерах. Файл .mp4 с видео H264 и аудио AAC на момент написания этого мануала является широко поддерживаемым медиафайлом и будет воспроизводиться практически в любой среде (в том числе непосредственно в браузере) без необходимости загрузки файла или настройки сервера потоковой передачи, и он может содержать субтитры. .mkv — еще один популярный формат контейнера, который поддерживает больше функций, но не так широко распространен.

Видео final.mp4 теперь можно загрузить, поделиться им или с помощью проектора отобразить на стене на караоке-вечеринке. 

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

Подводим итоги

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

Tags: , , , , ,

Добавить комментарий