Пиф Эдвардс: Меня зовут Пиф Эдвардс (Pif Edwards), я докторант Торонтского университета и сооснователь JALI Research. В этой презентации мы расскажем о том, как применили в Cyberpunk 2077 результаты своей статьи, опубликованной в 2016 году.

Крис Ландрет: Привет, меня зовут Крис Ландрет (Chris Landreth), я аниматор и разработчик ПО, а также один из основателей JALI Research Inc.

Матош Поплавски: Привет, меня зовут Матош Поплавски (Matosh Poplawski), я ведущий технический директор по работе с персонажами в CD Project Red, приветствую вас в нашей презентации с SIGGraph.

После завершения работы над Witcher 3 у нас уже была довольно неплохая система синхронизации движения губ (lipsync). Мы задались вопросом: как можно сделать её лучше, как повысить качество, не тратя сотни часов на создание анимаций? Было решено, что липсинк Cyberpunk 2077 должен быть лучше, чем в Witcher 3; также мы хотели добавить управляемую мышцами систему эмоций. Эта система должна использоваться во всём открытом мире игры и в каждом персонаже. Кроме того, нам требовалась поддержка нескольких языков, а конкретно десяти. Из-за огромного объёма работы мы не могли использовать захват движений (motion capture). В этой презентации мы расскажем, как нам удалось нарисовать сову.


Всё началось здесь, на SIGGraph. В 2016 году я нашёл статью о генерации липсинка, написанную Пифом и Крисом. В ней описывалась уникальная функция, замечательно подходящая для Cyberpunk 2077, а также способ поддержки различных стилей речи, от шёпота до крика. Я решил, что это хорошая идея, и связался с JALI. Наше сотрудничество оказалось идеальным, потому что у JALI имелась технология, но не было видеоигры, в которой её можно было бы применить. Поэтому мы решили помочь компании воплотить технологию в жизнь, превратить её в нечто особенное, в продукт, который можно использовать в игре с открытым миром уровня AAA. Мы создали систему, которая изменит подход к созданию эмоциональных персонажей в видеоиграх с открытым миром. Итак, перенесёмся в 2020 год; я покажу вам созданный вручную бенчмарк, созданный внутри CD Projekt Red. Нужно было сделать так, чтобы процедурная технология JALI соответствовала ему.

Начнём с Джуди, это довольно спокойный персонаж:


Следующим идёт Декс, чуть более энергичный и загадочный:


Наконец, Пласид, опасный киберпанк-хакер:


Я вкратце расскажу о том, какие компоненты нужны для создания таких анимаций. Нужна сама речь, нужны стили речи (от шёпота до крика), далее глаза с естественным движением и морганием, движение бровей, сами эмоции, проявляющиеся на лице во время разговора, а также движения головы и шеи, соединяющие всё естественным образом.

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


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

Методики на основе правил открыты к изменениям и более гибки, чем другие способы, например, на основе машинного обучения. Например, в процессе работы Матош давал нам прекрасные идеи, которые я встраивал в нашу модель речи всего на несколько часов или дней. В частности, в игре была фраза с заминкой: «Shh… Sss… Shh… She said she loved me». Матош предложил, чтобы постальвеолярный SH продолжал звучать, «наползая» на своих соседей. К обеду следующего дня мы уже добавили эту опцию с возможностью включения и отключения. И таких примеров очень много. Создавая наш инструмент, мы стремились сосредоточить в нём все научные исследования, принципы анимации, а также человеческую интуицию. Давайте посмотрим клип:


Крис: В стандартном конвейере анимирования игровых персонажей то, что называется синхронизаций движений губ, реализуется отдельно от того, что называется мимикой лица, однако в человеческой речи происходит гораздо больше, чем механическое соединение положений фонем. В ней есть большое количество экспрессивности, передаваемой только стилем речи персонажа. Поэтому для Cyberpunk 2077 мы нашли чрезвычайно эффективный, по нашему мнению, способ встраивания этой выразительности в процесс липсинка. Вот сравнение анимаций. В обеих анимациях используется совершенно одинаковая анимация, соответствующая показанным посередине параметрам фонем. Посмотрите, как Пласид закрыт в первой части своей фразы, но в конце неё он взрывается. Обычный липсинк слева не передаёт этот взрыв, однако справа он чётко виден:


Давайте сделаем ударение на это i («ee») на вдохе. Пласид может произнести это i множеством разных способов. Квадрат на видео ниже показывает все эти возможные способы. Мы можем разложить мимику этой фонемы на два отдельных компонента — движения только губ и только челюсти. Все фонемы отображаются на человеческом лице как сочетание этих двух аспектов.


Этим сочетанием можно управлять при помощи системы, которую мы называем JALI-джойстиком.


Мощь этого джойстика заключается в том, что его параметры можно не только задавать, но и анимировать. Посмотрите, как он перемещается, когда персонаж кричит.

Пиф: Глаза придают модели жизнь. Моргание и естественное движение глаз делают лицо живым, даже если остальная часть лица совершенно неподвижна. Почему же мы моргаем? На то есть две причины: вспомогательная — моргание смачивает глаза и когнитивная — мы мыслим, и наши мысли заставляют нас моргать. На игровую модель влияют три параметра: аудиоанализ звукозаписи, лексический анализ транскрипта и время, прошедшее с последнего моргания. Сумма этих параметров даёт время следующего моргания. Давайте взглянем на пример:


Саккадами в науке называются дёрганые и быстрые движения глазного яблока. Влияющий на них процесс является неосознанным. Мозг просто даёт глазу команду двигаться по полю видимости для формирования в сознании сцены. Мы не обладаем осознанным контролем над этим поведением. Яркие огни, лица и движение — вот некоторые из факторов, заставляющих глаз двигаться по сцене. Мы создали статистическую модель для генерации реалистичного поведения зрачка. Важно понимать, что мы не выбираем направление взгляда, а создаём естественные отклонения для симуляции человеческой системы восприятия. Взгляните на результат:


Паралингвальные движения параллельны речи. Они имеют тот же корень, ту же выразительную цель, но не являются частью артикуляции слов. Паралингвальные движения играют важную роль в речи. Важнейшими паралингвальными элементами являются брови, они поднимаются и опускаются вместе с смысловыми ударениями говорящего. Подъём или опускание бровей зависят от эмоционального состояния. Отрицательные эмоции заставляют морщить и напрягать брови, положительные эмоции — поднимать и расслаблять. Глубина тона при речи позволяет нам определять, когда и насколько сильно нужно анимировать бровь. Чтобы передать характер персонажа, мы создаём профиль каждого на основании минут или часов произносимых актёрами текстов. Голоса некоторых актёров имеют высокий тон, некоторые говорят быстро, другие — мягко. Для подстройки автоматизированной анимации под персонажа мы применяем анализ — профиль для индивидуальной настройки анимации конкретного персонажа. Также при этом задействуется ручное редактирование. Оно может быть прямым, например, изменение параметра нода синхронизации в Maya при помощи редактора атрибутов, или же принимать вид меток в стиле XML. Эти метки можно применять для анимирования изменений в эмоциональном состоянии в течение одной фразы. В них используется формат «эмоция-процентное значение» (<emotion-percent>). Например, здесь мы видим <happy-50>, за которым следует страх <fear>, а затем крик с высоким значением страха. И всё это в рамках одной фразы.

<happy-50>You’re home!</happy-50> <fear-20>Wait, what?</fear-20>
<fear-130>AAAAA!</fear-130>

Это очень обширная тема, но нам нужно быть краткими, так что давайте посмотрим клип:


Убедительное эмоциональное исполнение важно для погружения игрока в игру. Наша модель эмоций состоит из двух больших частей — эмоция используется и как неподвижный холст, и как фоновое выражение, сохраняющееся до смены эмоции, а акценты, проявляют и усиливают эмоциональную выразительность слов на пике эмоционального возбуждения. Мы используем аудиоанализ для определения уровня эмоционального возбуждения голоса, после чего применяем акценты, когда он поднимается выше определённого порога, а затем убираем акценты, когда возбуждение падает ниже порога. Здесь важно то, чтобы выразительность не влияла на речь. Например, широкая самодовольная ухмылка не должна влиять на одновременное сжимание говорящих «Нет» губ. Давайте посмотрим клип:


Как и в случае с глазами, для сохранения иллюзии жизни нужны движения шеи. Изначально мы решили, что хоть какие-нибудь движения лучше их полного отсутствия. Мы потратили много времени на просмотр видео. Нам кажется, что вполне достаточно небольших движений, поэтому получившаяся модель шеи в основном состоит из естественных движений. Давайте взглянем:


Крис: Настало время объединить всё вместе. Вот Джуди, демонстрирующая анатомию мимики, анимированной с помощью JALI. Мы один за другим покажем все упомянутые выше слои:


Матош: Показанное Крисом вполне соответствует нашему бенчмарку. Однако на самом деле я вас немного обманул: все эти видео, которые я вам показывал, не создавались аниматорами вручную. Все ролики были созданы с помощью технологии JALI. Все они являются полностью процедурными сгенерированными анимациями, которых не касался ни один аниматор.


Каждый персонаж в нашей игре, каждый персонаж открытого мира имеет такой тип липсинка и такой уровень качества выражения эмоций. Теперь я покажу, как это выглядит в игре:


Надеюсь, вам понравилась Джуди с технологией JALI. Но есть и jeszcze jedno («кое-что ещё») — нам была необходима поддержка нескольких языков. Крис расскажет, как удалось её реализовать.


В JALI мы учим персонажей говорить на каждом из языков при помощи трёх элементов: акустической модели, словаря произношений и модели «графема-фонема» (grapheme to phoneme, или g2p). Акустическая модель предсказывает фонемы персонажа на основании голосового исполнения и текстовых слов. Все акустические модели JALI обучены по наборам данных, состоящим из десятков, а иногда и сотен часов голосовых записей и текста на каждом из языков. Словарь произношений — это таблица лексем, выдающая все возможные способы произношения слов на одном из языков. Все словари JALI были разработаны нами самостоятельно при помощи алфавита записи фонем для английского и x-sampa для всех остальных языков. Модель g2p пытается создать правильное произношение всех слов, не найденных в словаре — имён собственных, бессмысленных слов и т.п. Хорошая модель g2p особенно важна для логографических языков наподобие японского, и я рад сообщить, что наши модели g2p чрезвычайно точны. Давайте посмотрим, как Джуди разговаривает на четырёх из этих десяти языков. Мы хотели увидеть на каждом из этих языков не только хороший липсинк, но и качественную мимику. Начнём с английского:


Я остановлюсь на слове cortisol. Джуди делает ударение на этом слове, и её брови морщатся как раз в момент его произнесения.

Теперь французский:


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

Теперь немецкий:


Останавливаемся на слове Atmet. Немецкий — очень флективный язык, и её брови сильно реагируют на это слово.

Теперь японский:


Японский — не флективный язык, и JALI реагирует на это, смещая брови очень незначительно.

В Cyberpunk 2077 существует дополнительная сложность с языками — бывают ситуации, когда персонаж говорит одну фразу диалога на нескольких языках. Например, Пласид билингв, и довольно часто переключается между языками. Мы решили эту проблему, добавив возможность разметки транскрипта. Пиф уже показал вам такую разметку на примере паралингвальных движений бровей. Похожий подход применяется и к разметке языков. Вот, например, фраза из диалога, в которой Пласид переходит с английского на французский и обратно. Разметка сообщает JALI, что нужно анализировать каждый фрагмент диалога на соответствующем языке, указанном в XML:

<LANG=english>It is called</LANG=english> <LANG=french>Ki vale limye</LANG=french> <LANG=english>he who swallow de light.</LANG=english>

А вот результат: