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

Одним из возможных применений нейронных сетей в игровой индустрии является создание "интерактивных" NPC, с которыми игрок может взаимодействовать при помощи голоса. 

Ряд именитых компаний уже экспериментируют в этой области. Так, NVidia представила NVidia ACE, а Ubisoft - Neo NPC.

Есть ряд решений и от менее известных компаний: раз, два.

Признаться, меня результат не сильно впечатлил и я подумал, что, как минимум, смогу его повторить =]. Получилось или нет - решать вам.

Я решил провести небольшой RnD и подготовить "Proof of Concept"- приложение для демонстрации возможностей применения нейронных сетей для создания "интерактивных" NPC в играх.

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

Результат.

Interactive_NPC_Demo

Инструкция

Демо приложение тестировали на ноутбуке со следующими характеристиками:
AMD Ryzen 7 5800H
16Gb DDR4-3200
RTX3080 Laptop

Концепция

Игрок задает вопрос NPC голосом, NPC формулирует ответную реплику и голосом же отвечает. 

У NPC должна быть своя предыстория, и он должен определенным образом реагировать на игрока.

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

Кроме того, хотелось бы, чтобы NPC помнил игрока, чтобы  при начале новой игровой сессии не приходилось начинать общение с самого начала.

Исходя из вышесказанного, наш "интерактивный" NPC должен выполнять следующие функции:

  • Слушать - преобразовывать речь игрока в текст;

  • Понимать - анализировать запрос игрока и формировать ответ в рамках своей предыстории\бэкграунда;

  • Отвечать - преобразовывать текст ответа в аудио файл и синхронизировать аудио с движением губ 3D модели;

  • Помнить - хранить историю общения с игроком.

Сторонние сервисы (ChatGPT, Google Speech и т.п.) использовать не будем - сегодня сервис доступен, а завтра нет (токены инвалидируются, санкции вводятся и т.п.). Плавали, знаем.

Вместо этого подберем готовые open source решения и адаптируем их под нашу задачу.

Реализация

В качестве игрового движка был выбран Unreal Engine 5.3

Одной из причин данного выбора является возможность "из коробки" использовать высоко детализированные модели людей с готовым набором поз и анимаций - MetaHuman.

Функционал разбит на несколько плагинов:

  • SpeechRecognitionSystem - распознавание голоса. В основе лежит библиотека vosk.api.

  • UGpt - генерация ответа на текстовый запрос игрока. Используемая LLM модель - Mistral (7b). В качестве инференса модели используется llama.cpp (CPU).

  • SpeechGenerationSystem - преобразование текста в аудио. Плагин основан на библиотеке piper

  • LipSyncSystem - синхронизация анимации движения губ с аудио. Плагин представляет собой переработанную версию плагина Oculus LipSync. Оригинальный плагин не совместим с UE5 и не работает (почти) в режиме реального времени.

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

Как это работает (в общих чертах)

Все плагины работают по единому принципу:

- при инициализации компонента плагина создается отдельный поток (FRunnableThread для FRunnable объекта) с бесконечным циклом, в котором компонент ожидает задачу на выполнение;

- компонент принимает запрос и складывает его в очередь запросов;

- на очередной итерации цикла запрос извлекается из очереди и обрабатывается;

- результат выполнения запроса складывается в очередь с результатами.

Под катом, для наглядности, приведены blueprint’ы в упрощённом виде для каждого компонента системы и ссылки на документацию к плагинам.

Blueprints

SpeechRecognitionSystem (Doc)

UGpt (Doc)

SpeechGenerationSystem (Doc), LipSyncSystem

Отдельно хотелось бы коснуться такой функции, как настройка предыстории (поведения) "интерактивного" NPC.

Для того, чтобы "прописать персонажа" необходимо прибегнуть к prompt-инжинирингу.

Для примера я решил смоделировать диалог Довакина и ярла Ульфрика из, откуда бы вы думали, игры Skyrim и подготовил вот такой простенький prompt.

Imagine that you are one of the jarls of Skyrim.
You are talking to the great warrior {USER}.
{AI} answers politely and is willing to answer any questions.
{AI} has a job for the hero.
{USER}:
-------------
USER: Dovakin
AI: Ulfric

Результат вы можете посмотреть под катом.

Диалог. Dovakin - Ulfric

Dovakin: Greetings respected Jarl.
Ulfric: Greetings mighty Dovakin, what brings you to my hall?

Dovakin: Is there any work for me? I'm a good fencer.
Ulfric: Indeed, your reputation precedes you.
Ulfric: But I have a task for someone with your skills.
Ulfric: The Stormcloaks have taken over Fort Sungard, and we need it back.
Ulfric: They've been using it as a base to launch attacks against our people.
Ulfric: Can you help us retake it?

Dovakin: What should I do?
Ulfric: Gather some allies and head to Fort Sungard.
Ulfric: The Stormcloaks are led by a high-ranking officer named Captain Arvel.
Ulfric: He's a formidable opponent, but with your skills and the help of your allies, you should be able to defeat him and retake the fort.

Dovakin: What will I get for completing the task?
Ulfric: Our gratitude and the knowledge that you have helped protect the people of Skyrim.
Ulfric: And if you prove yourself to be a valuable ally, perhaps there will be other opportunities for you in the future.

Dovakin: Where should I look for them?
Ulfric: You can find potential allies among the local militia or among the other jarls.
Ulfric: Some may join you out of loyalty or for rewards.
Ulfric: Be cautious, however, as not all will be trustworthy.
Ulfric: Use your judgment wisely.

Dovakin: Where can I get supplies for this mission?
Ulfric: You can acquire supplies from various merchants or by scavenging abandoned structures.
Ulfric: Remember, preparation is key to success on the battlefield.

Dovakin: Good. I am ready to complete this mission.
Ulfric: Excellent.
Ulfric: May the gods go with you, Dovakin.


Страшно представить, что будет, если целенаправленно обучить LLM модель используя весь лор Warhammer 40000 и попросить заняться prompt инжинирингом ярого фаната вселенной…

Что дальше

  • научимся автоматически (ну почти) создавать двойника в MetaHuman по фотографии лица используя 3D face mesh reconstruction;

  • освоим voice-cloning;

  • постараемся еще больше "оживить" нашего NPC, добавив функцию sentiment analysis как для запросов игрока, так и для ответов NPC. Как результат - будет меняться мимика и "поведение" нашего "интерактивного" NPC;

  • улучшим функцию lipsync - попробуем сделать анимацию губ более плавной и "точной".

Задача максимум - создать подобие цифрового двойника человека, который будет визуально, голосом и поведением напоминать оригинал.

Заключение

Лично мне видится, что у "интерактивных" NPC есть будущее в игровой индустрии. Это будущее наступит не сегодня и не завтра, но оно наступит. Уже сейчас можно экспериментировать в попытке создать новый жанр, геймплей и т.п.

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

А что думаете вы? Делитесь своими соображениями в комментариях.

Комментарии (24)


  1. Guestishe
    14.04.2024 09:41
    +1

    Заранее понятно что нужно тренеровать спец нейронку небольшого размера.


  1. JediPhilosopher
    14.04.2024 09:41

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


    1. MimusTriurus Автор
      14.04.2024 09:41

      Да, мне тоже интересно.

      В какой-то мере на этот вопрос ответ дали в этой статье - https://habr.com/ru/companies/cloud4y/articles/806801/

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


      1. Apxuej
        14.04.2024 09:41
        +1

        Мне кажется если игрок будет говорить о реальном мире, NPC должен думать о нём как о "фантазёре" или "сумасшедшем"

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

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


        1. MimusTriurus Автор
          14.04.2024 09:41

          Звучит здраво. Обдумываю.


    1. DGN
      14.04.2024 09:41
      +1

      NPC - Ты должен выполнить квест, чтобы я дал тебе ключ от сундука.

      PC - Дело в том, что моя бабушка выполнила квест, но умерла, перед смертью попросив меня сходить к тебе за ключом. И ещё, она попросила меня поделиться с тобой сокровищами! Как думаешь, я могу оставить без внимания просьбу бабушки? Дай мне ключ!


      1. SparkyJoyteon
        14.04.2024 09:41
        +1

        Ну на такие случаи можно инициировать проверку выполненных квестов что выдавал непись и заставлять его отвечать "мы вам перезвоним"


      1. MimusTriurus Автор
        14.04.2024 09:41

        @SparkyJoyteon прав. Эта проблема решается различными триггерами\проверками.

        Но даже если игрок таким образом уговорит NPC, то ничего страшного - награда заслужена. Игрок просто прокачал навык обмана\убеждения...


    1. DDroll
      14.04.2024 09:41
      +1

      1. MimusTriurus Автор
        14.04.2024 09:41

        Хм. Хорошая песочница для экспериментов. Спасибо.


    1. AbyssII
      14.04.2024 09:41
      +1

      Undertale?


  1. Drugmr1
    14.04.2024 09:41

    Понятно, что скоро во всех рпг будет подобная система "побеседовать за жизнь" с нпс.

    Но к ней быстро все привыкнут. И будут также скипать эти диалоги. Т.е. киллер фичей это будет совсем недолго. Так стоит ли овчинка выделки, ведь сил будет вложено много.


    1. MimusTriurus Автор
      14.04.2024 09:41

      Если функция NPC сводится к "побеседовать за жизнь", то да - эту часть игроки будут скипать.
      А если игра не будет вести игрока за ручку (привет Morrowind) и детали квестов или путь до города игроку надо будет выспрашивать у NPC?


      1. JediPhilosopher
        14.04.2024 09:41

        То это окажется никому не нужным кроме полутора гиков.

        В Fallout 1, вроде, была опция "спросить NPC о чем угодно", где можно было вводить слова, а не выбирать из предложенных. Работало коряво и было в общем-то не нужно, поэтому в других играх серии оно пропало.

        Во всяких ММОРПГ а-ля WoW с годами наблюдался процесс перехода от "расспроси NPC, прочитай описания квестов, сам сообрази где на карте нужная локация по ее приметам, сам туда доберись и найди нужный вид цветочков по их описанию" до "иди по стрелочке к маркеру на карте и press F to win". Внезапно вникать в детали лора до такой степени хочет очень небольшое количество игроков.

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

        Так что приживется оно может только в песочницах каких-нибудь. Ну и играх а-ля ГТА, где и так зачем-то напихано каких-то странных развлечений (типа игры в боулинг или просмотра кино), не связанных с игровым процессом. Ну добавится еще болтовня с NPC.


        1. AzatJ
          14.04.2024 09:41

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


        1. MimusTriurus Автор
          14.04.2024 09:41

          "То это окажется никому не нужным кроме полутора гиков." (с)
          *Смотрит на продажи Farming simulator\Train simulator*

          Как по мне, проблема не в технологии, а в том, что пока никто толком не знает как ее (технологию) использовать.

          Ряд студий уже даже релизит игры с подобным стэком технологий (s2t, t2s, llm).

          Нам нужны кодзимы с нестандартным мышлением, чтобы изобрести новый жанр...


          1. VPryadchenko
            14.04.2024 09:41

            КодзимаГПТ XD


  1. Lexa200v
    14.04.2024 09:41

    Помню не так давно натыкался в Ютубе на игру с реализацией такого концепта где играя за вампира нужно было убеждать ИИшных НПЦ пустить вас в дом. Но как по мне реализация speech - to - speech далеко не то что нужно для игр, куда востребованнее будет text to speech или даже text to text, а то большинство фишек завязанных на голосовом чате обычно в играх простаивают, людям в среднем просто неудобно или неинтересно ими пользоваться, а вот некое подобие реальной переписки с НПЦ в РПГ играх было бы очень классно, хотя и такие моды уже есть на Скайрим ...


    1. MimusTriurus Автор
      14.04.2024 09:41

      Отчасти соглашусь.

      Использовать клавиатуру удобнее чем голосовой ввод (привет людям отправляющим аудио сообщения в Телеграмм).

      Но что если клавиатуры нет или ее неудобно использовать? Я про VR разумеется...


      1. VPryadchenko
        14.04.2024 09:41
        +1

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


        1. MimusTriurus Автор
          14.04.2024 09:41

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

          Т.о. работа сценаристов сводится к определению общего контекста, а LLM генерирует детали.

          ...правда голосовой интерфейс при таком сценарии по-прежнему не нужен.


  1. KnezKiev
    14.04.2024 09:41

    А как удалось заставить Oculus LipSync работать в рантайме? Я делал уже несколько попыток довести плагин до ума, но максимум, что получилось это заставить его работать в редакторе UE5 с уже готовыми WAV. Все попытки динамически генерировать секвенцию на базе ответов чата не увенчались успехом. Правда, в качестве исходного аудиофайла я использовал ответ ChatGPT (он стримит по умолчанию в mp3).


    1. MimusTriurus Автор
      14.04.2024 09:41
      +1

      1. Я использую .wav формат. Будет ли плагин работать с .mp3 я не знаю.

      2. Если кратко, то я "вырезал" логику генерации секвенции из модуля OVRLipSyncEditorModule и обернул ее (логику) в UActorComponent

      Если скинешь (stendhal.syndrome.studio@gmail.com) название своего профиля на GitHub, то я смогу добавить вас в качестве "смотрящего" для репозитория LipSync.

      Сможешь глянуть реализацию и предложить что-нибудь для улучшения его работы.


  1. MimusTriurus Автор
    14.04.2024 09:41

    Я просто оставлю это здесь...