Выпросила у Хельмута инструкцию по прикручиванию нейросети к Скайриму.
Для MANTELLA v0.11. (актуальной на сегодня, так как свежая версия пока глючит) он также написал скрипт, позволяющий автоматически запускать все необходимые приблуды, а также скрипт для перезапуска при сбое нейросети. Оба скрипта есть в инструкции.
Прикрутить диалоговую нейросетку к игровым неписям - классаня идея, несмотря на очевидные ограничения в возможностях. Полностью меняет игровой опыт. Я вообще не любитель Скайрима, но теперь прошел с большим удовольствием. И наверняка буду играть снова.
В самом деле, теперь больше нет такой удручающей ситуации, когда понравившийся при прохождении квеста непись после завершения квеста грустно стоит, потому что с ним больше не о чем поговорить. Теперь к нему можно возвращаться снова и снова, и всегда найдется тема для разговора.
Неписи сильно отличаются друг от друга по характеру. Они живо реагируют на окружающий игровой мир и на игрока, его слова и поступки. Комментируют происходящие события или действия игрока в соответствии со своим характером. Способны на творчество и могут самостоятельно придумать небольшую историю, предложив игроку поучаствовать в ней. Могут обижаться на игрока или одобрять его, вплоть до возможной со временем влюбленности. Причем поддаются убеждению и их поведение может измениться. Да, красочную сексуальную сцену тоже вполне реально получить. К сожалению, только текстовую :(
На самом деле, приходится учитывать ограниченные возможности локальной нейросетки, чтобы избежать разочарований от завышенных ожиданий:
- Память у нейросетки не намного лучше, чем у золотой рыбки. Поэтому не получится отыграть какую-то сложную историю с продолжениями.
- Личность непися нейросетка реконструирует по его скудному описанию из игры, самостоятельно додумывая недостающее. Поэтому при разных запусках диалоговой сессии поведение и реакции непися могут отличаться.
- Иногда у нейросетки протекает чердак и непись начинает нести откровенный бред. Как правило, лечится перезапуском диалоговой сессии.
- Взаимодействие нейросетки непосредственно с неписем в игре ограничено еще сильнее. Нейросетка по ходу диалога может заставить непися сделать только самые простые вещи: пойти за игроком, взять или бросить предмет, напасть и т.д., в соответствии с возможностями скрипт екстендера. Поэтому все самое интересное остается только текстовым описанием каких-либо действий, больше всего напоминая форумную ролевку.
Железо, на котором я все это запускаю. Хватает впритык, так что для запуска на другом компе должно быть как минимум не хуже.
Мать: ASUS Rampage V Edition 10
Камень: Xeon E5-2699v4
Память: 64Gb HyperX DDR4 2133MHz CL14
Видео: ASUS RTX 2080 Super
Некоторые особенности, выясненные на практике.
а) С неписями можно общаться голосом через микрофон. И это реально работает. Но через довольно короткое время начинает сильно тормозить. Где-то что-то недооптимизировали. Поэтому дальше описывается вариант с отключенным микрофоном и вводом своих сообщений текстом через диалоговое окно.
б) При игре в полноэкранном режиме нейросетка тоже ощутимо подтормаживает. После некоторых экспериментов я выбрал следующий вариант. Игра запускается в окне в разрешении 1280x1024 (при разрешении монитора 1920x1080), игровое окно располагается слева. А в правой части экрана остается достаточно места, чтобы разместить окна нейросетки: вверху Kobold, внизу Mantella. Это позволяет видеть, что там происходит по ходу пьесы. В целом, играть получается достаточно комфортно и удобно, если немного привыкнуть.
Теперь приступим. Для начала качаем сам ванильный Skyrim: Special Edition, версию 1.6.1170.0, например отсюда. Устанавливаем его. Пусть будет E:\Skyrim\.
Теперь скачиваем Skyrim Script Extender (SKSE). Качаем самый верхний вариант, "Current Anniversary Edition build 2.2.6 (game version 1.6.1170)". Распаковываем в папку с игрой.
Создаем на диске папку, куда будем складывать все причиндалы, необходимые для игры с OpenAI. Например, пусть будет E:\OpenAI\.
Скачиваем Mod Organizer 2. Можно обойтись и без него, но с ним будет проще. Устанавливаем в E:\OpenAI\MO2\.
При установке выбираем вариант Portable, а когда при запуске спросит про версию игры - указываем Steam. Потом еще надо будет указать, что запускать стим не нужно, у нас его все равно нет, и глупые вопросы тоже больше не нужно задавать.
Скачиваем необходимые моды. Сохраняем пока в какую-нибудь временную папку.
- Address Library for SKSE Plugins, выбираем "All in one (1.6.X)";
- PapyrusUtil SE, вариант "Version 4.6 for SKSE 2.2.6, Skyrim 1.6.1170, & Address Library AE";
- UIExtensions;
- Unofficial SSE Patch;
- Unofficial SSE Patch — RUS;
- SkyUI Russian translation;
- No NPC Greetings (Special Edition);
- World Encounter Hostility Fix, качаем "Performance Version";
Скачиваем софтину xVASynth v3. Качаем как саму софтину "xVASynth v3.0.0 Main app", так и патч для нее, "v3.0.2 PATCH - DON'T FORGET THIS". Распаковываем прогу в E:\OpenAI\xVASynth\. Патч распаковываем поверх.
Скачиваем обновленный Russian Dictionary для xVASynth. Распаковываем его в E:\OpenAI\xVASynth\resources\app\python\xvapitch\text\dicts\ с заменой существующего.
Скачиваем .lip and .fuz plugin for xVASynth. Распаковываем в папку E:\OpenAI\xVASynth\.
Скачиваем FaceFXWrapper 0.4. Первым в списке там идет CK64Fixes Release 3.2, его качать не нужно. Распаковываем куда-нибудь во временную папку и файл FaceFXWrapper.exe переносим в E:\OpenAI\xVASynth\resources\app\plugins\lip_fuz\, где уже лежит предыдущий плагин.
Скачиваем xVADict — Elder Scrolls. Распаковываем в E:\OpenAI\xVASynth\.
Скачиваем голосовые модели. Для начала качаем "Female Serana" и "Male Nord". Создаем папку E:\OpenAI\xVASynth\resources\app\models\Skyrim\ и распаковываем скачанные файлы туда. Переименовываем файлы .json и .pt из архива "Female Serana" в sk_serana.*, а файлы из архива "Male Nord" переименовываем в sk_malenord.*. Теперь делаем копию файлов Сераны в той же папке и переименовываем их в sk_femalenord.*. Открываем файлы json редактором и меняем там имена файлов соответственно.
Немного забегая вперед, при обращении к неписям в игре, будет подхватываться одна из имеющихся голосовых моделей, если не найдено более подходящей. В логе Мантеллы будет выдаваться ошибка о несоответствии, но модель будет работать.
Нормально работающих и приятно звучащих русскоязычных моделей на данный момент немного, но никто не мешает потом накачать их больше и экспериментировать. Актуальные имена файлов, необходимые, чтобы игра подхватила модель, можно выяснить из лога Мантеллы при старте диалога.
Запускаем E:\OpenAI\xVASynth\xVASynth.exe. В правом верхнем углу нажимаем на символ паззла и включаем плагин .lip and .fuz file maker. Нажимаем кнопку Apply, соглашаемся с дефолтными настройками и закрываем окно плагинов клавишей Escape.
Там же, в правом верхнем углу нажимаем кнопку AE и в открывшемся окне подключаем все слова в словарях CMUDicT и XVADict — Elder Scrolls. Закрываем окно ескейпом.
В левом верхнем углу нажимаем кнопку со стрелочками и в открывшемся списке выбираем игру Skyrim. Список закроется и в основном окне появится список загруженных нами голосовых моделей.
В самом правом верхнем углу нажимаем кнопку с шестеренкой. В открывшемся окне настроек сверху нажимаем кнопку "Change to CPU+GPU", чтобы надпись слева гласила "Current installation: GPU", и ставим выше галочку "Use GPU (requires CUDA)".
Листаем список настроек ниже. Проверяем выбор динамиков и микрофона, проверяем пути к "Skyrim models path" и "Skyrim output path", еще ниже выбираем "Game (The .lip format)" - Skyrim/Fallout 3/Fallout NV. Закрываем окно настроек ескейпом и пока выходим из xVASynth.
Скачиваем интерфейс нейросетки KoboldCpp. Из списка файлов для загрузки нам нужен koboldcpp.exe, размером примерно полгига. Сохраняем его в E:\OpenAI\Kobold\.
Скачиваем образ самой нейросетки mistral-nemo-instruct-2407-q4_k_m.gguf. Сохраняем туда же, в E:\OpenAI\Kobold\.
Запускаем koboldcpp.exe. Ждем загрузки окна интерфейса. В открывшемся окне снимаем галку с пункта Launch Browser, а ниже нажимаем кнопку Model: Browse и выбираем скачанный образ нейросетки.
Нажимаем кнопку Save и сохраняем настройки в файл settings.kcpps в ту же папку, где лежит koboldcpp.exe.
Закрываем окно и там же создаем ярлык для запуска koboldcpp.exe, правым кликом открываем его свойства и дописываем ключ запуска "--config settings.kcpps" (без кавычек). Теперь запускать кобольда будем ярлыком, и окно интерфейса больше не появится.
ИНСТРУКЦИЯ ДЛЯ MANTELLA v0.11.
Теперь скачиваем интерфейс между игрой и нейросеткрой - Mantella Software v0.11.4. И оттуда же, ниже по списку Mantella Spell v0.10.
Распаковываем Mantella Software в E:\OpenAI\MantellaSoftware\, а архив Mantella Spell закидываем туда, где временно сохраняли моды для последующей установки.
Открываем редактором файл E:\OpenAI\MantellaSoftware\GPT_SECRET_KEY.txt. Вписываем туда строку:
http://localhost:5001/api/
Открываем редактором файл E:\OpenAI\MantellaSoftware\config.ini. Меняем в нем следующие настройки:
game = Skyrim
skyrim_folder = E:\Skyrim
skyrim_mod_folder = E:\OpenAI\MO2\mods\Mantella Spell
xvasynth_folder = E:\OpenAI\xVASynth
language = ru
microphone_enabled = 0
player_name = Player
remove_mei_folders = 1
max_tokens = 500
Запускаем Mod Organizer 2. По порядку устанавливаем скачанные ранее моды. Для ручной установки используем кнопку с инструментами непосредственно над окном списка модов, в открывающемся списке выбираем опцию Install Mod, и указываем архив с модом (нераспакованный).
- All in one Address Library
- PapyrusUtil
- UIExtensions
- No NPC Greetings
- World Encounter Hostility Fix
- Mantella Spell
- Unofficial Skyrim Special Edition Patch
- Unofficial Skyrim Special Edition Patch - RUS
- SkyUI
Убеждаемся, что получившийся фактический путь к Mantella Spell совпадает с тем, который мы указали выше в конфиге (skyrim_mod_folder).
Должна получиться следующая картинка. При необходимости руками перетаскиваем вверх или вниз моды в списках как слева, так и справа. После окончания установки закрываем Mod Organizer.
Порядок запуска:
1. xVASynth.
2. Mod Organizer.
3. Запускаем Skyrim через Mod Organizer. Ждем загрузки игрового меню.
4. Запускаем Kobold. Передвигаем окно в удобное место. Ждем, пока полностью загрузится и появится приглашение http://localhost:5001.
5. Запускаем Mantella. Передвигаем окно в удобное место и ждем полной загрузки с появлением сообщения об ожидании начала диалога с NPC.
6. Переключаемся на игру и играем.
При первом запуске не забываем в самой игре зайти в системном меню в настройки модов и проверить настройки Мантеллы. Как минимум - назначить кнопку для диалогового окна игровых событий (Add Custom Game Event), что серьезно разнообразит игру.
Настройки модов сохраняются в сейвах игры, поэтому, если загрузим более ранний сейв, то придется настроить заново.
Скрипт AutoHotkey для автоматического последовательного запуска всей этой байды с выравниванием окон в нужное положение.
#Requires AutoHotkey >=2.0 Run('xVASynth\xVASynth.exe', 'xVASynth') Sleep 500 if WinWait('xVA Synth',,5) WinMove(100,0,1300,1000,'xVA Synth') Run('MO2\ModOrganizer.exe', 'MO2') if WinWait('Mod Organizer',,5) WinMove(95,150,,,'Mod Organizer') Run('Kobold\koboldcpp.exe --config settings.kcpps', 'Kobold') if WinWait('koboldcpp.exe',,3) WinMove(1274,0,670,520,'koboldcpp.exe') Sleep 17000 Run('MantellaSoftware\Mantella.exe', 'MantellaSoftware') if WinWait('Mantella.exe',,3) WinMove(1274,520,670,520,'Mantella.exe')
Скрипт AutoHotkey для перезапуска Кобольда и Мантеллы при глюке нейросетки. Окна также автоматически выставятся в нужное положение.
#Requires AutoHotkey >=2.0 if WinExist('Mantella.exe') WinClose 'Mantella.exe' if WinExist('koboldcpp.exe') WinClose 'koboldcpp.exe' Sleep 1500 Run('Kobold\koboldcpp.exe --config settings.kcpps', 'Kobold') if WinWait('koboldcpp.exe',,3) WinMove(1274,0,670,520,'koboldcpp.exe') Sleep 17000 Run('MantellaSoftware\Mantella.exe', 'MantellaSoftware') if WinWait('Mantella.exe',,3) WinMove(1274,520,670,520,'Mantella.exe')
.
ИНСТРУКЦИЯ ДЛЯ MANTELLA v0.12. Не дописана ввиду бажности новой Мантеллы на данный момент.
Теперь скачиваем интерфейс между игрой и нейросеткрой - Mantella For Skyrim SE/AE/VR. Закидываем архив туда, где временно сохраняли моды для последующей установки.
Запускаем Mod Organizer 2. По порядку устанавливаем скачанные ранее моды. Для ручной установки используем кнопку с инструментами непосредственно над окном списка модов, в открывающемся списке выбираем опцию Install Mod, и указываем архив с модом (нераспакованный).
- All in one Address Library
- PapyrusUtil
- UIExtensions
- No NPC Greetings
- World Encounter Hostility Fix
- Mantella
- Unofficial Skyrim Special Edition Patch
- Unofficial Skyrim Special Edition Patch - RUS
- SkyUI
Должна получиться следующая картинка. При необходимости руками перетаскиваем вверх или вниз моды в списках как слева, так и справа. Проверяем, что фактический путь к Mantella получился E:\OpenAI\MO2\mods\Mantella\ (понадобится ниже).
После окончания установки закрываем Mod Organizer.
Открываем редактором файл E:\OpenAI\MO2\mods\Mantella\GPT_SECRET_KEY.txt. Вписываем туда строку:
http://localhost:5001/api/
Чтобы создался конфиг, запускаем файл E:\OpenAI\MO2\mods\Mantella\SKSE\Plugins\MantellaSoftware\Mantella.exe. После того, как все загрузится с кучей ошибок и предупреждений, закрываем окно.
Переходим в %USERPROFILE%\Documents\My Games\Mantella\. Открываем редактором создавшийся там файл config.ini. Меняем в нем следующие строки:
game = Skyrim
skyrim_mod_folder = E:\OpenAI\MO2\mods\Mantella
llm_api = KoboldCpp
max_tokens = 500
tts_service = xVASynth
xvasynth_folder = E:\OpenAI\xVASynth
stt_language = ru
language = ru
auto_launch_ui = False
remove_mei_folders = True
Порядок запуска:
1. xVASynth.
2. Mod Organizer.
3. Запускаем Kobold. Передвигаем окно в удобное место. Ждем, пока полностью загрузится и появится приглашение http://localhost:5001.
4. Запускаем Skyrim через Mod Organizer. Ждем загрузки игрового меню.
5. Переключаемся на окно автоматически запустившейся Mantella и передвигаем его в удобное место.
6. Переключаемся обратно на игру и играем.
При первом запуске не забываем в самой игре зайти в системном меню в настройки модов и проверить настройки Мантеллы. Как минимум - отключить микрофон и назначить кнопку для диалогового окна игровых событий (Add Custom Game Event), что серьезно разнообразит игру.
Настройки модов сохраняются в сейвах игры, поэтому, если загрузим более ранний сейв, то придется настроить заново.
Специально для nihille написал небольшую утилитку для экспорта диалоговых логов в удобочитаемый формат. Запускается так:
D:\WebServers\usr\local\perl\bin\perl.exe aidecode.pl "NAME"
Где NAME - Имя папки лога, совпадающее с английским именем непися.
#!/usr/bin/perl use JSON::XS; my $json = ''; my $input = $ARGV[0] . '\\' . $ARGV[0] . '.json'; my $output = $ARGV[0] . '.txt'; open (my $fh, '<:encoding(UTF-8)', $input) or err($input, $!); while (my $row = <$fh>) { $json .= $row; } close $fh; my $log = decode_json($json); open (my $fh, '>:encoding(UTF-8)', $output) or err($output, $!); print $fh "STARTING NEW SESSION\n"; foreach my $row (@{$log}) { if (ref $row eq 'ARRAY') { print $fh "\n\nSTARTING NEW SESSION"; foreach my $ses (@{$row}) { print $fh str($ses); } } else { print $fh str($row); } } print $fh "\n\nEND CONVERSATION\n"; close $fh; sub str { my ($row) = @_; my ($role, $cont) = ($row->{role}, $row->{content}); $cont =~ s/\n\n/\n\[$role\]: /g; $cont =~ s/^\*The\stime\sis.*\.\*\n//i; my $str = sprintf("%s[%s]: %s", ($role eq 'user') ? "\n\n" : "\n", $role, $cont, ); return $str; } sub err { my ($file, $err) = @_; print "\nCould not open file '$file' $err\n"; exit(0); }