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

Чуть позже широкую огласку получил ИИ-стример Neuro-sama, созданный vedal987.

В целом, тогда я и решил запустить этот эксперимент и попробовать сделать максимально дешево и сердито русскоговорящего стримера на основе GPT-моделей.

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

Что необходимо для стримера?

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

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

Таким образом мы можем выделить основные инструменты для современного стриминга:

  • Темы для разговора

  • Образ стримера

  • Рот

  • Веб-камера

  • Геймплей (опционально)

Рассмотрим всё по порядку.

Темы для разговора

Для того, чтобы трансляция не была скучной, стример должен комментировать, общаться с аудиторией, причем не только на игровые темы. В качестве «мозга» нашего бюджетного стримера было решено выбрать GPT-3 (davinci-003) от OpenAI с перспективой апгрейда до GPT-3.5 (ChatGPT) сразу после её выхода (так я и сделал, но об этом в конце статьи). Решения от OpenAI позволяют обрабатывать ответы на их же серверах, а значит, нам не придется использовать мощное железо и обучать нейронную сеть с нуля.

О том, как получить доступ к OpenAI из России, написано здесь. В отличие от того же ChatGPT, API можно использовать без VPN.

Получать сообщения мы будем из чата YouTube (проверка перед переходом на Twitch) с помощью библиотеки pytchat.

Полученное сообщение и ответ сохраняем в файл (только для записи). Он пригодится нам далее.

Образ стримера

Сегодня трудно пробиться через тонны контента без какого-то запоминающегося образа или выделяющейся особенности, поэтому и нашему Франкенштейну нужен имидж. Размышляя об этом за кружечкой кофе и играя в "Disco Elysium" я пришёл к выводу, что миру нужен пьяница-бездомный, который может объективно рассказать всем за жизнь. Так как у нас всё еще есть аккаунт OpenAI, используем DALLE 2 для генерации не самого красивого мужчины и не в самом расцвете сил.

prompt = “homeless portrait stinky dirty, alone bearded, brown hair, digital art, portrait, white background”
prompt = “homeless portrait stinky dirty, alone bearded, brown hair, digital art, portrait, white background”

Мне понравились 1 и 4 изображения в 3 ряду, однако, чтобы окончательно решить этот вопрос, я обратился в свой Телеграм канал:

Теперь необходимо увеличить изображение в размерах, не потеряв качества. Для этого можно использовать разные решения. Самый простой вариант - UpscaleMedia.

Имя не менее важно, за ним я обратился в тот же канал.

Комуто Херовато - благородный сын клана Комуто
Комуто Херовато - благородный сын клана Комуто

Сеттинг будет простой: заброшенный город в далеком будущем. А для того, чтобы сделать речь GPT-3 более похожей на «пьяную» добавим переводчик с любого языка на русский.
Как переводчик было решено использовать модуль translate, изначально задумывалось делать два перевода — текст пользователя в английский язык, а ответ переводить на русский, однако модуль наотрез отказывался переводить что‑либо на английский язык, поэтому решено было просто оставить его как автоперевод сообщений с любого языка.

Рот

Стример должен говорить, чтобы поддерживать интерес аудитории. Для реализации «рта» возьмём Silero‑TTS. Плюс Силеро заключается в неплохих заранее заготовленных голосах, которым не требуется подключение к интернету, что значит, задержка будет минимальная (время уйдёт только на саму генерацию аудио).

Проблема, с которой я столкнулся — обрезание предложений, причём только на пресете «Aidar», поэтому её пришлось решать радикальным добавлением мягкого знака в конец текста. Еще Силеро не работает с другими языками (для этого есть другие модели) и числами — для этого нужно подключить нормализатор по типу natasha. К сожалению, до этого руки не дошли.

Веб-камера и способ трансляции

Изначально задумывалось, что из полученного при помощи DALLE 2 изображения, получится сделать rig в той же Live 2D Studio, однако спустя несколько часов гайдов, я понял, что Комуто обойдётся статичным изображением его во всей красе. По крайней мере пока что. Выбрав красивый апокалиптический фон и немного его подредактировав в фотошопе, я залил всё это в ОБС, ровно как и текст, генерируемый GPT-3. Пока Комуто будет его читать, ОБС будет выводить субтитры из файла на экран. Для сброса файла после того, как Комуто договорит, просто еще раз открываем файл для записи и тут же его закрываем.

Геймплей

На самом деле, это сложный вопрос. Каждый стример стримит что‑то своё, а некоторые просто общаются с аудиторией. Однако паузы (которые хоть и заполняются болтовнёй о том, как ему плохо жить) могут напрягать зрителя, поэтому было решено добавить хоть какой‑то геймплей. В конечном счёте выбор упал на Clone Hero, так как это rhythm игра с классной и в том числе кастомной музыкой, бесплатная, да еще и со своим ботом! Тем не менее, в будущем хочется добавить:

  • Тетрис

  • Шахматы

  • Minecraft

  • Еще что-нибудь смешное или интересное

UPD. Мозг v.2.0

Эта статья пишется 02.03 в 3 утра по Московскому времени. Случайно зайдя на свою почту я увидел следующее:

OpenAI - gpt-3.5-turbo api official release
OpenAI - gpt-3.5-turbo api official release

Да! Наконец они выпустили нормальный API, который к тому же в 10 раз дешевле, чем тот же используемый GPT-3 Davinci. Однако главная особенность заключалась не в этом и даже не в улучшении производительности и качества генерации текста.

ChatGPT (далее GPT-3.5) имеет особенность запоминать ваши сообщения с целью последующего использования информации в диалоге с вами (для того, чтобы не терять нить повествования), что позволяет нам задать изначальные установки его поведения и образ, причем его поведение меняется в зависимости от вопросов зрителей.

Для обучения Комуто будем сохранять теперь не только субтитры, но и словари с системными установками, сообщениями из чата, а также ответами самого Комуто.
GPT-3.5 намного быстрее отвечает на сообщения, не требует перевода, поскольку достаточно креативен и на русском языке, а также почти не имеет проблем с обрезанными предложениями.

UPD_2. Twitch

Основная стримерская площадка на данный момент, без сомнений - Twitch, каким бы сумбурным в плане правил он не казался. 

Чат Twitch можно читать при помощи IRC (вебскрапперы - просто тяжело и долго). Использовать его впервые было тяжело, но реализовать удалось. Позже нашлась twitch-chat-irc. Если не хочется заморачиваться - можно использовать и её.

Для того, чтобы Комуто не вышел за рамками дозволенного (хотя GPT-3.5 хорошо держит себя в руках) добавим список банвордов, которые Комуто озвучивать не будет, но примет для обучения, а в субтитрах зацензурит. 

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

Первая схема работы хоть и является простой, но имеет большой недостаток — Нет никакой персонализации пользователя: если один человек из чата попросит называть его Миша123, то и другого пользователя нейросеть определит ровно так же:

Упрощённая старая логика
Упрощённая старая логика

Ещё Комуто ранее реагировал на абсолютно все сообщения, в том числе на бесполезные, которые были адресованы вообще не ему, из-за этого схему действия пришлось изменить:

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

  2. Комуто теперь реагирует только на сообщения вида “… Комуто …” вне зависимости от регистра

  3. Информация сохраняется персонально в .json файл для каждого участника общения с Комуто.

Примеры работы

З.Ы. Статья дополняется по мере введения новых функций, а исходный код будет доступен после основных доработок.

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


  1. Araki_Satoshi
    00.00.0000 00:00
    +1

    Интересно вот как некоторые стримеры анимации делают. Да, вероятно, Live2D, но с чего картинка двигается? Неужто с камеры и движений самого стримера?


    1. hiimluck3r Автор
      00.00.0000 00:00

      Если говорим о реальных VTube-рах, то картинка хватается через Live Studio с вебкамеры. С нейростримерами тяжелее: либо реакция на звук (видел такой плагин), либо чтение документации и скриптовое вызывание анимации через апи, полагаю, такое возможно, раз само API есть (ручаться пока не буду).