В прошлом году мне выдалась возможность впервые поиграться 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 для генерации не самого красивого мужчины и не в самом расцвете сил.
Мне понравились 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 утра по Московскому времени. Случайно зайдя на свою почту я увидел следующее:
Да! Наконец они выпустили нормальный 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, то и другого пользователя нейросеть определит ровно так же:
Ещё Комуто ранее реагировал на абсолютно все сообщения, в том числе на бесполезные, которые были адресованы вообще не ему, из-за этого схему действия пришлось изменить:
Как только мы связываемся с переполнением запроса, теперь мы создаем бэкап, в который уносим всю предыдущую переписку пользователя, а в новую сохраняем последние 2 вопроса и 2 ответа.
Комуто теперь реагирует только на сообщения вида “… Комуто …” вне зависимости от регистра
Информация сохраняется персонально в .json файл для каждого участника общения с Комуто.
Примеры работы
З.Ы. Статья дополняется по мере введения новых функций, а исходный код будет доступен после основных доработок.
Araki_Satoshi
Интересно вот как некоторые стримеры анимации делают. Да, вероятно, Live2D, но с чего картинка двигается? Неужто с камеры и движений самого стримера?
hiimluck3r Автор
Если говорим о реальных VTube-рах, то картинка хватается через Live Studio с вебкамеры. С нейростримерами тяжелее: либо реакция на звук (видел такой плагин), либо чтение документации и скриптовое вызывание анимации через апи, полагаю, такое возможно, раз само API есть (ручаться пока не буду).