Как клонировать голос и синхронизировать губы в видео как профессионал с помощью открытых инструментов

Мастерство клонирования голоса и синхронизации губ в видео профессиональные подходы с использованием открытых инструментов

Введение

Голосовой клонирование ИИ покорило социальные медиа. Оно открыло мир творческих возможностей. Вы, наверняка, видели мемы или исполнения голоса знаменитостей, созданные с помощью ИИ, в социальных медиа. Вас интересовало, как это делается? Конечно, многие платформы предоставляют API, такие как Eleven Labs, но можем ли мы сделать это бесплатно, используя программное обеспечение с открытым исходным кодом? Короткий ответ – ДА. У программы с открытым исходным кодом есть модели текст в речь (TTS) и инструменты для синхронизации губ, чтобы достичь синтеза голоса. Поэтому в этой статье мы исследуем открытые инструменты и модели для голосового клонирования и синхронизации губ.

Цели изучения

  • Исследовать открытые инструменты для голосового клонирования ИИ и синхронизации губ.
  • Использовать FFmpeg и Whisper для транскрибации видео.
  • Использовать модель xTTS от Coqui-AI для клонирования голоса.
  • Использовать Wav2Lip для синхронизации губ в видео.
  • Исследовать реальные примеры использования этой технологии.

Эта статья была опубликована в рамках блогофона по Data Science.

Open-Source стек

Как вы уже знаете, мы будем использовать OpenAI Whisper, FFmpeg, модель xTTS от Coqui-ai и Wav2lip в качестве нашего технического стека. Но перед тем, как перейти к кодам, давайте кратко обсудим эти инструменты и также выразим благодарность авторам этих проектов.

Whisper: Whisper представляет собой модель автоматической речи OpenAI. Это модель трансформера кодировщик-декодер, обученная на более чем 650 тысяч часов разнообразных аудио данных и соответствующих транскриптов. Это делает его очень мощным для многоязычной транскрипции из аудио.

Энкодеры получают лог-мел-спектрограммы аудио-сегментов продолжительностью 30 секунд. Каждый блок энкодера использует само-внимание для понимания разных частей аудио-сигналов. Затем декодер получает информацию о скрытом состоянии от энкодеров и позиционные кодировки, ученые при обучении. Декодер использует само-внимание и перекрестное внимание для предсказания следующего токена. В конце процесса он выводит последовательность токенов, представляющую распознаваемый текст. Для получения дополнительной информации о Whisper см. официальный репозиторий.

Coqui TTS: TTS – это библиотека с открытым исходным кодом от Coqui-ai. Она содержит несколько моделей текст в речь. В ней есть модели с конца в конец, такие как Bark, Tortoise и xTTS, модели спектрограммы, такие как Glow-TTS, FastSpeech и т. д., и вокодеры, такие как Hifi-GAN, MelGAN и т. д. Более того, она предоставляет унифицированный API для вывода, настройки и обучения моделей текст в речь. В этом проекте мы будем использовать xTTS, модель голосового клонирования с мультиязычной поддержкой. Она поддерживает 16 языков, включая английский, японский, хинди, китайский и т. д. Для получения дополнительной информации о TTS см. официальный репозиторий.

Wav2Lip: Wav2Lip – это репозиторий на Python для работы с статьей “Автоматическое генерирование движения губ подходит для дублирования голоса”. Он использует дискриминатор синхронизации губ для распознавания движений лица и губ. Это отлично работает для озвучивания речи. Для получения дополнительной информации см. официальный репозиторий. Мы будем использовать этот модифицированный репозиторий Wav2lip – вот этот.

Workflow

Теперь, когда мы знакомы с инструментами и моделями, которые мы будем использовать, давайте разберем рабочий процесс. Это простой рабочий процесс. Вот что мы сделаем.

  • Загрузим видео в среду выполнения Colab и изменим его размер на формат 720p для лучшей синхронизации губ.
  • Используем FFmpeg, чтобы извлечь аудио 24 бит из видео и использовать Whisper для транскрибации аудиофайла.
  • Используем Google Translate или LLM для перевода транскрибированного сценария на другой язык.
  • Загрузим многоязычную модель xTTS с помощью библиотеки TTS и передадим сценарий и модель референсного аудио для синтеза голоса.
  • Клонируем репозиторий Wav2lip и загрузим контрольные точки модели. Запустим файл inference.py для синхронизации оригинального видео с синтезированным аудио.

Теперь давайте углубимся в коды.

Шаг 1: Установите зависимости

Для этого проекта требуется значительное потребление оперативной памяти и графического процессора, поэтому рекомендуется использовать Colab runtime. Бесплатная версия Colab предоставляет 12 ГБ оперативной памяти и 15 ГБ графического процессора T4. Этого должно быть достаточно для этого проекта. Поэтому перейдите в Colab и подключитесь к GPU runtime.

Теперь установите TTS и Whisper.

!pip install TTS!pip install git+https://github.com/openai/whisper.git 

Шаг 2: Загрузите видео в Colab

Теперь мы загрузим видео и изменим его размер до формата 720p. Wav2lip работает лучше, когда видео имеют формат 720p. Это можно сделать с помощью FFmpeg.

#@title Загрузка видеоиз google.colab import filesimport osimport subprocessuploaded = Noneresize_to_720p = Falsedef upload_video():  global uploaded  global video_path  # Объявим video_path глобальной для ее изменения  uploaded = files.upload()  for filename in uploaded.keys():    print(f'Загружено {filename}')    if resize_to_720p:        filename = resize_video(filename)  # Получить имя измененного видео    video_path = filename  # Обновить video_path либо оригинальным, либо измененным именем файла    return filenamedef resize_video(filename):    output_filename = f"resized_{filename}"    cmd = f"ffmpeg -i {filename} -vf 'scale=-1:720' {output_filename}"    subprocess.run(cmd, shell=True)    print(f'Измененное видео сохранено как {output_filename}')    return output_filename# Создаем кнопку формы, которая вызывает функцию upload_video при щелчке, и флажок для изменения размераimport ipywidgets as widgetsfrom IPython.display import displaybutton = widgets.Button(description="Загрузить видео")checkbox = widgets.Checkbox(value=False, description='Изменить размер до 720p (лучшие результаты)')output = widgets.Output()def on_button_clicked(b):  with output:    global video_path    global resize_to_720p    resize_to_720p = checkbox.value    video_path = upload_video()button.on_click(on_button_clicked)display(checkbox, button, output)

Это выведет кнопку формы для загрузки видео с локального устройства и флажок для включения изменения размера до 720p. Вы также можете загрузить видео вручную в текущую сессию Collab и изменить его размер, используя subprocess.

Шаг 3: Извлечение звука и транскрипция Whisper

Теперь, когда у нас есть видео, следующее, что мы сделаем, – это извлечение звука с помощью FFmpeg и использование Whisper для транскрипции.

# @title Извлечение звука (24 бит) и конвертация whisperimport subprocess# Убедитесь, что переменная video_path существует и не равна Noneif 'video_path' in globals() and video_path is not None:    ffmpeg_command = f"ffmpeg -i '{video_path}' -acodec pcm_s24le -ar 48000 -q:a 0 -map a\                       -y 'output_audio.wav'"    subprocess.run(ffmpeg_command, shell=True)else:    print("Видео не загружено. Пожалуйста, сначала загрузите видео.")import whispermodel = whisper.load_model("base")result = model.transcribe("output_audio.wav")whisper_text = result["text"]whisper_language = result['language']print("Текст Whisper:", whisper_text)

Это извлекает звук из видео в формате 24 бит и использует Whisper Base для его транскрипции. Для более точной транскрипции используйте Whisper small или VoAGI модели.

Шаг 4: Синтез голоса

Теперь перейдем к части клонирования голоса. Как я уже упоминал ранее, мы будем использовать модель xTTS от Coqui-ai. Это одна из лучших моделей с открытым исходным кодом для синтеза голоса. Coqui-ai также предоставляет много моделей TTS для разных целей; ознакомьтесь с ними. Для нашего случая использования, который является клонированием голоса, мы будем использовать модель xTTS v2.

Загрузите модель xTTS. Это большая модель размером 1,87 ГБ. Так что это займет некоторое время.

# @title Синтез голосаfrom TTS.api import TTSimport torchfrom IPython.display import Audio, display  # Импортировать модули Audio и displaydevice = "cuda" if torch.cuda.is_available() else "cpu"# Инициализируем TTStts = TTS("tts_models/multilingual/multi-dataset/xtts_v2").to(device)

XTTS в настоящее время поддерживает 16 языков. Вот ISO-коды языков, которые поддерживает модель xTTS.

print(tts.languages)['en','es','fr','de','it','pt','pl','tr','ru','nl','cs','ar','zh-cn','hu','ko','ja','hi']

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

Для этого проекта мы будем использовать язык хинди, вы также можете экспериментировать с другими языками.

Итак, первое, что нам нужно сделать, это перевести транскрибированный текст на хинди. Это можно сделать с помощью пакета Google Translate или с использованием LLM. По моим наблюдениям, GPT-3.5-Turbo работает гораздо лучше, чем Google Translate. Мы можем использовать OpenAI API, чтобы получить наши переводы.

import openaiclient = openai.OpenAI(api_key = "api_key")completion = client.chat.completions.create(  model="gpt-3.5-turbo",  messages=[    {"role": "system", "content": "You are a helpful assistant."},    {"role": "user", "content": f"переведите текст на хинди {whisper_text}"}  ])translated_text = completion.choices[0].messageprint(translated_text)

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

text_chunks = translated_text.split(sep = "।")final_chunks = [""]for chunk in text_chunks:  if not final_chunks[-1] or len(final_chunks[-1])+len(chunk)<250:    chunk += "।"    final_chunks[-1]+=chunk.strip()  else:    final_chunks.append(chunk+"।".strip())final_chunks

Это очень простой разделитель. Вы можете создать другой или использовать рекурсивный разборщик текста Langchain. Теперь мы передадим каждый кусок модели TTS. Полученные аудиофайлы будут объединены с помощью FFmpeg.

def audio_synthesis(text, file_name):  tts.tts_to_file(      text,      speaker_wav='output_audio.wav',      file_path=file_name,      language="hi"  )  return file_namefile_names = []for i in range(len(final_chunks)):    file_name = audio_synthesis(final_chunks[i], f"output_synth_audio_{i}.wav")    file_names.append(file_name)

Поскольку все файлы имеют одинаковый кодек, мы легко можем объединить их с помощью FFmpeg. Для этого создайте файл Txt и добавьте пути к файлам.

# это комментарийfile 'output_synth_audio_0.wav'file 'output_synth_audio_1.wav'file 'output_synth_audio_2.wav'

Теперь запустите приведенный ниже код, чтобы объединить файлы.

import subprocesscmd = "ffmpeg -f concat -safe 0 -i my_files.txt -c copy final_output_synth_audio_hi.wav"subprocess.run(cmd, shell=True)

Это приведет к созданию окончательного объединенного аудиофайла. Вы также можете воспроизвести аудио в Colab.

from IPython.display import Audio, displaydisplay(Audio(filename="final_output_synth_audio_hi.wav", autoplay=False))

Шаг 5: Лип-синхронизация

Теперь перейдем к части лип-синхронизации. Для синхронизации нашего синтетического аудио с оригинальным видео мы будем использовать репозиторий Wav2lip. Чтобы использовать Wav2lip для синхронизации аудио, нам нужно установить точки контроля модели. Но перед этим, если вы работаете на T4 GPU runtime, удалите модели xTTS и Whisper в текущей сессии Colab или перезапустите сессию.

import torchtry:    del ttsexcept NameError:    print("Модель голоса уже удалена")try:    del modelexcept NameError:    print("Модель Whisper удалена")torch.cuda.empty_cache()

Теперь склонируйте репозиторий Wav2lip и установите точки контроля.

# @title Зависимости%cd /content/!git clone https://github.com/justinjohn0306/Wav2Lip!cd Wav2Lip && pip install -r requirements_colab.txt%cd /content/Wav2Lip!wget 'https://github.com/justinjohn0306/Wav2Lip/releases \/download/models/wav2lip.pth' -O 'checkpoints/wav2lip.pth'!wget 'https://github.com/justinjohn0306/Wav2Lip/releases \/download/models/wav2lip_gan.pth' -O 'checkpoints/wav2lip_gan.pth'!wget 'https://github.com/justinjohn0306/Wav2Lip/releases \/download/models/mobilenet.pth' -O 'checkpoints/mobilenet.pth'!pip install batch-face

У Wav2lip есть две модели для синхронизации губ. wav2lip и wav2lip_gan. По словам авторов моделей, модель GAN требует меньше усилий для обнаружения лица, но дает немного худшие результаты. В отличие от этого, модель без GAN может давать лучшие результаты при большем ручном увеличении размера и масштабировании области обнаружения. Вы можете попробовать оба варианта и посмотреть, какой работает лучше.

Запустите вывод с путем к модели, видео и аудиофайлами.

%cd /content/Wav2Lip#Это настройка области обнаружения, отрегулируйте в случае плохих результатов. #Как правило, проблема заключается в нижней частиpadding_top =  0padding_bottom =  15padding_left =  0padding_right =  0rescaleFactor =  1video_path_fix = f"'../{video_path}'"!python inference.py --checkpoint_path 'checkpoints/wav2lip_gan.pth' \--face $video_path_fix --audio "/content/final_output_synth_audio_hi.wav" \--pads $padding_top $padding_bottom $padding_left $padding_right --resize_factor $rescaleFactor --nosmooth \ --outfile '/content/output_video.mp4'

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

Итак, вот репозиторий для блокнота и нескольких примеров.

Репозиторий GitHub: sunilkumardash9/voice-clone-and-lip-sync

Примеры использования в реальной жизни

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

Развлечения: Развлекательная индустрия будет самой затронутой отраслью. Мы уже наблюдаем изменения. Голоса знаменитостей сегодняшнего и прошлого времени могут быть синтезированы и повторно использованы. Это также вызывает этические проблемы. Использование синтезированных голосов должно осуществляться ответственно и в рамках закона.

Маркетинг: Персонализированные рекламные кампании с привычными и понятными голосами могут значительно увеличить привлекательность бренда.

Коммуникация: Язык всегда был препятствием для различных видов деятельности. Межъязыковая коммуникация остается проблемой. Реальное время от начала до конца перевода с сохранением акцента и голоса изменит способ общения. Это может стать реальностью в ближайшие годы.

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

Заключение

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

Основные моменты

  • TTS, библиотека на Python от Coqui-ai, обслуживает и поддерживает популярные модели текста в речь.
  • xTTS – это модель клонирования голоса на нескольких языках, способная клонировать голос на 16 разных языках.
  • Whisper – это модель ASR от OpenAI для эффективной транскрипции и перевода на английский язык.
  • Wav2lip – это инструмент с открытым исходным кодом для синхронизации губ в видео.
  • Клонирование голоса – это одна из самых перспективных областей генеративного искусственного интеллекта, с значительным потенциальным влиянием на отрасли от развлечений до маркетинга.

Часто задаваемые вопросы

Изображения, показанные в этой статье, не принадлежат Analytics Vidhya и используются по усмотрению автора.