Как использовать плагин
Это руководство проведёт вас через процесс настройки Runtime MetaHuman Lip Sync для ваших персонажей MetaHuman.
Примечание: Runtime MetaHuman Lip Sync работает как с MetaHuman, так и с пользовательскими персонажами. Плагин поддерживает различные типы персонажей, включая:
- Популярных коммерческих персонажей (Daz Genesis 8/9, Reallusion CC3/CC4, Mixamo, ReadyPlayerMe и др.)
- Персонажей с FACS-based блендшейпами
- Модели, использующие стандарты блендшейпов ARKit
- Персонажей с наборами фонем Preston Blair
- Системы фонем 3ds Max
- Любых персонажей с пользовательскими морф-таргетами для мимики
Подробные инструкции по настройке пользовательских персонажей, включая справочники по маппингу визем для всех перечисленных стандартов, см. в руководстве по настройке пользовательских персонажей.
Требования
Перед началом убедитесь, что:
- Плагин MetaHuman включён в вашем проекте
- У вас есть хотя бы один персонаж MetaHuman, загруженный и доступный в проекте
- Установлен плагин Runtime MetaHuman Lip Sync
Дополнительные плагины:
- Если вы планируете использовать захват аудио (например, ввод с микрофона), установите плагин Runtime Audio Importer.
- Если вы планируете использовать функционал текст-в-речь, установите плагин Runtime Text To Speech.
Платформо-специфичная конфигурация
Конфигурация для Android / Meta Quest
Если вы работаете с платформами Android или Meta Quest и сталкиваетесь с ошибками сборки при использовании этого плагина, вам необходимо отключить архитектуру x86_64 (x64) для Android в настройках проекта:
- Перейдите в Edit > Project Settings
- Откройте раздел Platforms > Android
- В секции Platforms - Android, раздел Build, найдите Support x86_64 [aka x64] и убедитесь, что он отключён, как показано ниже
Это связано с тем, что плагин в настоящее время поддерживает только архитектуры arm64-v8a и armeabi-v7a для платформ Android / Meta Quest.
Процесс настройки
Шаг 1: Найдите и измените Blueprint анимации лица
Вам необходимо модифицировать Animation Blueprint, который будет использоваться для мимики вашего персонажа MetaHuman. Стандартный Animation Blueprint для лица MetaHuman находится по пути:
Content/MetaHumans/Common/Face/Face_AnimBP
У вас есть несколько вариантов реализации функции синхронизации губ:
- Редактировать стандартный ассет (самый простой вариант)
- Создать дублика т
- Использовать кастомный Animation Blueprint
Откройте стандартный Face_AnimBP
напрямую и внесите изменения. Любые модификации повлияют на всех персонажей MetaHuman, использующих этот Animation Blueprint.
Примечание: Этот подход удобен, но затронет всех персонажей, использующих стандартный Animation Blueprint.
- Дублируйте
Face_AnimBP
и дайте ему описательное имя - Найдите Blueprint класса вашего персонажа (например, для персонажа "Bryan" он будет расположен по пути
Content/MetaHumans/Bryan/BP_Bryan
) - Откройте Blueprint персонажа и найдите компонент Face
- Измените свойство Anim Class на ваш новый дублированный Animation Blueprint
Примечание: Этот подход позволяет кастомизировать синхронизацию губ для конкретных персонажей, оставляя других неизменными.
Вы можете реализовать смешивание синхронизации губ в любом Animation Blueprint, имеющем доступ к необходимым лицевым костям:
- Создайте или используйте существующий кастомный Animation Blueprint
- Убедитесь, что ваш Animation Blueprint работает со скелетом, содержащим те же лицевые кости, что и стандартный
Face_Archetype_Skeleton
MetaHuman (который является стандартным скелетом для любого персонажа MetaHuman)
Примечание: Этот подход дает максимальную гибкость для интеграции с кастомными системами анимации.
Важно: Смешивание Runtime MetaHuman Lip Sync может быть реализовано в любом ассете Animation Blueprint, имеющем доступ к позе, содержащей лицевые кости из стандартного Face_Archetype_Skeleton
MetaHuman. Вы не ограничены приведенными выше вариантами - это просто распространенные подходы к реализации.
Шаг 2: Настройка Event Graph
Откройте ваш Face Animation Blueprint и переключитесь на Event Graph
. Вам нужно создать Runtime Viseme Generator, который будет обрабатывать аудиоданные и генерировать виземы.
- Добавьте ноду
Event Blueprint Begin Play
, если она еще не существует - Добавьте ноду
Create Runtime Viseme Generator
и подключите ее к событию Begin Play - Сохраните вывод в переменную (наприме р, "VisemeGenerator") для использования в других частях графа
Шаг 3: Настройка обработки аудиовхода
Вам нужно настроить метод обработки аудиовхода. Есть несколько способов сделать это в зависимости от источника аудио.
- Микрофон (реальное время)
- Микрофон (воспроизведение)
- Text-to-Speech (локальный)
- Text-to-Speech (внешние API)
- Из аудиофайла/буфера
- Кастомный источник аудио
Этот подход выполняет синхронизацию губ в реальном времени при разговоре в микрофон:
- Создайте Capturable Sound Wave используя Runtime Audio Importer
- Перед началом захвата аудио, привяжитесь к делегату
OnPopulateAudioData
- В привязанной функции вызовите
ProcessAudioData
из вашего Runtime Viseme Generator - Начните захват аудио с микрофона
Этот подход захватывает аудио с микрофона, затем воспроизводит его с синхронизацией губ:
- Создайте Capturable Sound Wave используя Runtime Audio Importer
- Начните захват аудио с микрофона
- Перед воспроизведением capturable sound wave, привяжитесь к его делегату
OnGeneratePCMData
- В привязанной функции вызовите
ProcessAudioData
из в ашего Runtime Viseme Generator
Примечание: Если вы хотите обрабатывать аудиоданные меньшими порциями для более отзывчивой синхронизации губ, отрегулируйте расчет в функции SetNumSamplesPerChunk
. Например, деление частоты дискретизации на 150 (стриминг каждые ~6.67 мс) вместо 100 (стриминг каждые 10 мс) обеспечит более частые обновления синхронизации губ.
- Обычный
- Стриминг
Этот подход синтезирует речь из текста и выполняет синхронизацию губ:
- Используйте Runtime Text To Speech для генерации речи из текста
- Используйте Runtime Audio Importer для импорта синтезированного аудио
- Перед воспроизведением импортированного sound wave, привяжитесь к его делегату
OnGeneratePCMData
- В привязанной функции вызовите
ProcessAudioData
из вашего Runtime Viseme Generator
Примечание: Если вы хотите обрабатывать аудиоданные меньшими порциями для более отзывчивой синхронизации губ, отрегулируйте расчет в функции SetNumSamplesPerChunk
. Например, деление частоты дискретизации на 150 (стриминг каждые ~6.67 мс) вместо 100 (стриминг каждые 10 мс) обеспечит более частые обновления синхронизации губ.
Этот подход использует потоковый синтез речи из текста с синхронизацией губ в реальном времени:
- Используйте Runtime Text To Speech для генерации потоковой речи из текста
- Используйте Runtime Audio Importer для импорта синтезированного аудио
- Перед воспроизведением streaming sound wave, привяжитесь к его делегату
OnGeneratePCMData
- В привязанной функции вызовите
ProcessAudioData
из вашего Runtime Viseme Generator
Примечание: Если вы хотите обрабатывать аудиоданные меньшими порциями для более отзывчивой синхронизации губ, отрегулируйте расчет в функции SetNumSamplesPerChunk
. Например, деление частоты дискретизации на 150 (стриминг каждые ~6.67 мс) вместо 100 (стриминг каждые 10 мс) обеспечит более частые обновления синхронизации губ.
- Обычный
- Стриминг
Этот подход использует плагин Runtime AI Chatbot Integrator для генерации синтезированной речи от AI-сервисов и выполнения синхронизации губ:
- Используйте Runtime AI Chatbot Integrator для генерации речи из текста с использованием внешних API (OpenAI, ElevenLabs и др.)
- Используйте Runtime Audio Importer для импорта синтезированных аудиоданных
- Перед воспроизведением импортированного sound wave, привяжитесь к его делегату
OnGeneratePCMData
- В привязанной функции вызовите
ProcessAudioData
из вашего Runtime Viseme Generator
Примечание: Если вы хотите обрабатывать аудиоданные меньшими порциями для более отзывчивой синхронизации губ, отрегулируйте расчет в функции SetNumSamplesPerChunk
. Например, деление частоты дискретизации на 150 (стриминг каждые ~6.67 мс) вместо 100 (стриминг каждые 10 мс) обеспечит более частые обновления синхронизации губ.
Этот подход использует плагин Runtime AI Chatbot Integrator для подключения к по токовым TTS API (например ElevenLabs Streaming API):
- Используйте Runtime AI Chatbot Integrator для подключения к потоковым TTS API
- Используйте Runtime Audio Importer для импорта синтезированных аудиоданных
- Перед воспроизведением streaming sound wave, привяжитесь к его делегату
OnGeneratePCMData
- В привязанной функции вызовите
ProcessAudioData
из вашего Runtime Viseme Generator
Примечание: Если вы хотите обрабатывать аудиоданные меньшими порциями для более отзывчивой синхронизации губ, отрегулируйте расчет в функции SetNumSamplesPerChunk
. Например, деление частоты дискретизации на 150 (стриминг каждые ~6.67 мс) вместо 100 (стриминг каждые 10 мс) обеспечит более частые обновления синхронизации губ.
Этот подход использует предзаписанные аудиофай лы или аудиобуферы для синхронизации губ:
- Используйте Runtime Audio Importer для импорта аудиофайла с диска или из памяти
- Перед воспроизведением импортированного sound wave, привяжитесь к его делегату
OnGeneratePCMData
- В привязанной функции вызовите
ProcessAudioData
из вашего Runtime Viseme Generator - Воспроизведите импортированный sound wave и наблюдайте анимацию синхронизации губ
Примечание: Если вы хотите обрабатывать аудиоданные меньшими порциями для более отзывчивой синхронизации губ, отрегулируйте расчет в функции SetNumSamplesPerChunk
. Например, деление частоты дискретизации на 150 (стриминг каждые ~6.67 мс) вместо 100 (стриминг каждые 10 мс) обеспечит более частые обновления синхронизации губ.
Для кастомного источника аудио вам нужно:
- Аудиоданные в формате float PCM (масс ив сэмплов с плавающей точкой)
- Частота дискретизации и количество каналов
- Вызовите
ProcessAudioData
из вашего Runtime Viseme Generator с этими параметрами
Пример стриминга аудио из кастомного источника:
Примечание: Если вы хотите обрабатывать аудиоданные меньшими порциями для более отзывчивой синхронизации губ, отрегулируйте расчет в функции SetNumSamplesPerChunk
. Например, деление частоты дискретизации на 150 (стриминг каждые ~6.67 мс) вместо 100 (стриминг каждые 10 мс) обеспечит более частые обновления синхронизации губ.
Шаг 4: Настройка Anim Graph
После настройки Event Graph переключитесь на Anim Graph
, чтобы подключить генератор визем к анимации персонажа:
Синхронизация губ
- Найдите позу, содержащую лицо MetaHuman (обычно из
Use cached pose 'Body Pose'
) - Добавьте ноду
Blend Runtime MetaHuman Lip Sync
- Подключите позу к
Source Pose
нодыBlend Runtime MetaHuman Lip Sync
- Подключите вашу переменную
RuntimeVisemeGenerator
к пинуViseme Generator
- Подключите вывод ноды
Blend Runtime MetaHuman Lip Sync
к пинуResult
нодыOutput Pose
Когда в аудио будет обнаружена синхронизация губ, ваш персонаж будет динамически анимироваться соответствующим образом:
Анимация смеха
Вы также можете