Что ж, MANTELLA на месте не стоит, на сегодня рабочая версия MANTELLA v 0.13.1
Ниже инструкция, опять же от Хельмута, как запустить это добро и наслаждаться им.
Но сначала ролик на ютубе — маленькая демонстрация, как ИИ работает в Скае: Хельмут взаимодействует с трактирщиком, задавая вопросы про покушать и политику, и можно видеть (и даже слышать, несмотря на то, что фоном орёт проклятый скайримский бард) как трактирщик отвечает:
Итак, Хельмут пишет:
Наконец-то стало возможно поиграть с новой версией Мантеллы, получившей ряд новых интересных возможностей. Но и ряд критических багов тоже. К счастью, комьюнити пока еще достаточно небольшое, и разработчики оказались вполне доступными для общения. Удивительно, но факт: они не знали о баге, делающем невозможной игру с локальной моделью ИИ. Видимо, большинство пользователей предпочитает онлайн модели. В результате была оперативно выпущена версия Мантеллы 13.1 с исправлением самых критических багов. Осталось еще несколько некритичных, но достаточно неприятных. Надеюсь, мои багрепорты помогут избавиться от них в следующих версиях. Заодно я узнал от разработчиков много интересного о принципах работы моделей ИИ. Хотя и не все понял. Но я стараюсь.
Кстати, насчет моделей. Я до сих пор развлекаюсь с моделями на основе Мистраль. Это хорошая нейросетка, часто выдающая весьма интересные диалоги. Но, как водится, не без недостатков. Во-первых, это неистребимый пацифизм. Изначально эта нейросетка создавалась как дружелюбный помощник, и эти директивы прошиты где-то в самом ядре, так что все авторы, дообучающие нейросетку и выкладывающие образы, не в состоянии перебороть это. Так что, во избежание разрыва шаблонов, лучше не начинать диалоги, подразумевающие какую-нибудь агрессию. Когда ассассин Темного Братства вместо обсуждения предстоящего убийства начинает рассуждать о понимании, толерантности и терпимости - это несколько портит впечатление от игры.
Во-вторых, Мистраль часто сбивается на диалог сама с собой, начиная выдавать реплики и за персонажа, и за игрока, что откровенно бесит. Частично это лечится инициализирующим промтом, прописанным в конфиге Мантеллы. Мне удалось значительно уменьшить вероятность такого сбоя, но надо продолжать экспериментально подбирать оптимальный вариант.
Для работы нейросетки важны количество ядер CUDA и объем видеопамяти. Образ следует выбирать исходя из имеющейся видеопамяти. Два основных параметра, как правило, отражаются в имени образа: контент (число B, грубо говоря общее количество нейронов) и квантование (число Q, грубо говоря, число связей между нейронами). При этом, при выборе между одинаково весящими образами специалисты рекомендуют выбирать тот, у кого больший контент при меньшем квантовании.
Насчет оптимизации есть еще один момент. Как мне объяснили, у базовой модели отличается токенизация английского языка и всех остальных. Для кодирования одного английского слова используется один токен, а для слова на другом языке - несколько, вплоть до одного токена на каждую букву, что сильно сказывается на объеме обрабатываемого контента. Поэтому, для игры на русском языке с Mistral-Large-Instruct-2407 лучше использовать drafter модели (7B-Instruct-v0.3). Видимо, имелось ввиду что-то типа вот такой или такой. Я пока еще не успел поэкспериментировать, но надо будет заняться и проверить. Да, и надо будет еще посматривать в сторону хваленой китайской DeepSeek. Я пока не видел ни одного локального образа, заслуживающего внимания, но, возможно, в будущем они еще появятся.
Итак, мы по-прежнему ориентируемся на запуск Скайрима в окне с одновременным доступом к окнам консолей ИИ. И на текстовый ввод, без микрофона. Подробности были расписаны в предыдущей заметке, повторяться не будем.
Skyrim.
Начинаем с установки самого Скайрима. Новые версии Мантеллы отказываются работать со стимовской пираткой. Вероятно, это можно победить, воссоздав правильную структуру. Но мне лень. Проще скачать ГОГ-овскую версию Skyrim AE v1.6.1179. Например, отсюда. Качаем и ставим, как в прошлый раз, в E:\SkyrimAI\Skyrim\.
Сразу вдогонку качаем Skyrim Script Extender (SKSE), берем второй сверху вариант для GOG Anniversary Edition (game version 1.6.1179). Распаковываем в папку с установленной игрой.
xVASynth.
Скачиваем софтину xVASynth v3. Качаем как саму софтину "xVASynth v3.0.0 Main app", так и патч для нее, "v3.0.2 PATCH - DON'T FORGET THIS". Распаковываем прогу в E:\SkyrimAI\xVASynth\. Патч распаковываем поверх.
Скачиваем обновленный Russian Dictionary для xVASynth. Распаковываем его в E:\SkyrimAI\xVASynth\resources\app\python\xvapitch\text\dicts\ с заменой существующего.
Скачиваем .lip and .fuz plugin for xVASynth. Распаковываем в папку E:\SkyrimAI\xVASynth\.
Скачиваем FaceFXWrapper 0.4. Первым в списке там идет CK64Fixes Release 3.2, его качать не нужно. Распаковываем куда-нибудь во временную папку и файл FaceFXWrapper.exe переносим в E:\SkyrimAI\xVASynth\resources\app\plugins\lip_fuz\, где уже лежит предыдущий плагин.
Скачиваем xVADict — Elder Scrolls. Распаковываем в E:\SkyrimAI\xVASynth\.
Скачиваем голосовые модели. Для начала качаем "Female Serana" и "Male Nord". Создаем папку E:\SkyrimAI\xVASynth\resources\app\models\Skyrim\ и распаковываем скачанные файлы туда. Переименовываем файлы .json и .pt из архива "Female Serana" в sk_femalenord.*, а файлы из архива "Male Nord" переименовываем в sk_malenord.*. Открываем файлы json редактором и меняем там имена файлов соответственно.
К сожалению, новые версии Мантеллы требуют точное соответствие голосовых моделей, а не загружают наиболее близкую, как раньше. Так что по ходу игры придется либо докачивать недостающие модели, либо делать копии существующих. Я просил разработчиков вернуть, как было, и они вроде бы обещали сделать это в следующих версиях.
Запускаем E:\SkyrimAI\xVASynth\xVASynth.exe. В правом верхнем углу нажимаем на символ паззла и включаем плагин .lip and .fuz file maker. Нажимаем кнопку Apply, соглашаемся с дефолтными настройками и закрываем окно плагинов клавишей Escape.
Там же, в правом верхнем углу нажимаем кнопку AE и в открывшемся окне подключаем все слова в словарях CMUDicT и XVADict — Elder Scrolls. Закрываем окно ескейпом.
В левом верхнем углу нажимаем кнопку со стрелочками и в открывшемся списке выбираем игру Skyrim. Список закроется и в основном окне появится список загруженных нами голосовых моделей.
В самом правом верхнем углу нажимаем кнопку с шестеренкой. В открывшемся окне листаем список настроек вниз. Убираем подключение к дискорду, проверяем выбор динамиков и микрофона, проверяем пути к "Skyrim models path" и "Skyrim output path", еще ниже выбираем "Game (The .lip format)" - Skyrim/Fallout 3/Fallout NV. Под этой опцией ставим галочки: "Delete lip files", "Make fuz files" и "Skip existing". Закрываем окно настроек ескейпом и пока выходим из xVASynth.
KoboldCpp.
Скачиваем интерфейс нейросетки KoboldCpp. Из списка файлов для загрузки нам нужен koboldcpp.exe, размером примерно полгига. Сохраняем его в E:\SkyrimAI\Kobold\.
Скачиваем образ самой нейросетки. Я выбрал два варианта: либо попроще и пошустрее, либо получше, но помедленнее. Сохраняем туда же, в E:\SkyrimAI\Kobold\. Если хотим включить зрение неписей, то докачиваем к ним образ графического распознавания.
Запускаем koboldcpp.exe. Ждем загрузки окна интерфейса. В открывшемся окне снимаем галку с пункта Launch Browser, а ниже нажимаем кнопку GGUF Text Model: Browse и выбираем скачанный образ нейросетки. Заодно увеличиваем размер контекста до 8192.
Чтобы подключить зрение, переходим на вкладку "Loaded Files" и указываем скачанный образ распознавателя.
Нажимаем кнопку Save config и сохраняем настройки в файл settings.kcpps в ту же папку, где лежит koboldcpp.exe. Можем сделать два отдельных конфига, с зрением и без. Переключать их мы сможем из скрипта запуска сборки.
Mod Organizer.
Скачиваем необходимые моды. Сохраняем пока в какую-нибудь временную папку.
Unofficial SSE Patch;
Unofficial Skyrim Creation Club Content Patch;
Unofficial SSE Patch — RUS;
Unofficial Skyrim Creation Club Content Patch — RUS;
Address Library for SKSE Plugins, выбираем "All in one (1.6.X)";
PapyrusUtil SE, вариант "Version 4.6 for SKSE 2.2.6, Skyrim 1.6.1179(GOG), & Address Library";
SkyUI Russian translation;
UIExtensions;
World Encounter Hostility Fix, качаем "Performance Version";
No NPC Greetings (Special Edition);
Mantella;
FonixData File, вариант "Mod Manager Install";
SSE Russian Fix Console, вариант "SSE Russian Fix Console Only", хотя, по желанию;
Скачиваем Mod Organizer 2. Устанавливаем в E:\SkyrimAI\MO2\ и запускаем.
При первом запуске выбираем вариант Portable, а когда спросит про версию игры - указываем GOG. В следующем окне отметим profile-specific INI и сейвы.
Устанавливаем ранее скачанные моды в том же порядке, в котором они указаны в списке на скачивание. Должно получиться как-то так:
Mantella.
Закрываем Mod Organizer. Переходим в папку E:\SkyrimAI\MO2\mods\Mantella\ и открываем в редакторе файл GPT_SECRET_KEY.txt. Вписываем туда строку:
http://localhost:5001/api/
Далее переходим в E:\SkyrimAI\MO2\mods\Mantella\SKSE\Plugins\MantellaSoftware\ и открываем файл custom_user_folder.ini. Указываем там параметр
custom_user_folder = E:/SkyrimAI/Mantella/
Это чтобы не лазить каждый раз в "мои документы", используемые по умолчанию. Не забываем создать саму папку E:\SkyrimAI\Mantella\.
По очереди запускаем xVASynth, KoboldCpp (первый раз может загружаться долго) и Mod Organizer. Запускаем Скайрим из мод органайзера. Ждем, пока запустится игра. Ждем, пока автоматически откроется окно консоли Мантеллы. Любуемся на картину Малевича. Когда раздастся звук лопнувшей струны и откроется браузер, закрываем все к чертям.
Теперь у нас создались все необходимые конфиги. Для начала займемся самой игрой. Несмотря на то, что мы указали использовать локальный конфиг, ГОГ-овская версия, похоже, все равно лазит в "мои документы". Поэтому идем в %USERPROFILE%\Documents\My Games\Skyrim Special Edition GOG\. Удаляем Skyrim.INI, копируем туда файл E:\SkyrimAI\Skyrim\Skyrim_Default_ru.ini и переименовываем его в Skyrim.INI.
далее открываем SkyrimPrefs.ini и правим его руками по вкусу или согласно многочисленным гайдам по оптимизациям и улучшениям. Но это можно и потом, а пока нас особенно интересуют следующие параметры:
iSize W=1280
iSize H=1024
bFull Screen=0
bBorderless=1
bDialogueSubtitles=1
bGeneralSubtitles=1
На всякий случай копируем получившиеся Skyrim.INI и SkyrimPrefs.ini в E:\SkyrimAI\MO2\profiles\Default\.
Теперь открываем E:\SkyrimAI\Mantella\config.ini и вносим следующие изменения (актуально для Mantella v13.1):
Код:
game = Skyrim
skyrim_mod_folder = E:\SkyrimAI\MO2\mods\Mantella
llm_api = KoboldCpp
model = Custom model
custom_token_count = 8192
llm_params = {
"max_tokens": 500,
"stop": ["#"]
}
tts_service = xVASynth
xvasynth_folder = E:\SkyrimAI\xVASynth
fast_response_mode = True
fast_response_mode_volume = 15
low_resolution_mode = False
save_screenshot = False
image_quality = 100
custom_vision_model = True
vision_llm_api = KoboldCpp
vision_model = Custom Model
language = ru
auto_launch_ui = False
automatic_greeting = False
Далее, находим в этом же конфиге раздел [Prompts] и в нем многострочный параметр skyrim_prompt. Находим в нем строку:
Remember to stay in character.
И заменяем на
Don't write instructions. Remember to stay in character.
Кстати, новые версии Мантеллы теперь имеют свой гуй, доступный в браузере по адресу http://localhost:4999/ui/?__theme=dark
Там можно, например, оперативно включить или выключить зрение NPC, в зависимости от ситуации или чтобы увеличить скорость ответа. Но нужно учесть, что изменение параметра завершит текущий диалог, если он уже начат.
Можно сразу создать ярлык для этого адреса, в папке E:\SkyrimAI\. Пусть будет.
После первого уже нормального запуска Скайрима не забываем зайти в настройки Мантеллы уже в самой игре (Система -> Настройки модов -> Mantella -> General). Отключаем микрофон и назначаем кнопки для End Conversation и Add Custom Game Event. У меня это обычно [\] и [=] соответственно.
Внутриигровые настройки пишутся в сейв игры, поэтму, если загрузиться с более раннего сейва, то придется выставлять заново.
AutoHotkey.
Раз мы не хотим каждый раз запускать всю эту порнографию вручную, пишем скрипт на AutoHotkey:
Код:
#Requires AutoHotkey >=2.0
if not WinExist('xVA Synth') {
Run('xVASynth\xVASynth.exe', 'xVASynth')
Sleep Floor(IniRead("SkyrimAI.ini", "Delays", "xVASynthDelay", 1) * 1000)
if WinWait('xVA Synth',,10) {
WinMove(0,0,1300,1000,'xVA Synth')
}
}
if not WinExist('koboldcpp.exe') {
if (IniRead("SkyrimAI.ini", "Kobold", "Vision_LLM_load_enable", 0) == 1) {
Run('Kobold\koboldcpp.exe --config settings_vision.kcpps --highpriority', 'Kobold')
}
else {
Run('Kobold\koboldcpp.exe --config settings.kcpps --highpriority', 'Kobold')
}
if WinWait('koboldcpp.exe',,10) {
PosX := IniRead("SkyrimAI.ini", "Kobold", "Kobold_PosX", 1274)
PosY := IniRead("SkyrimAI.ini", "Kobold", "Kobold_PosY", 0)
ResX := IniRead("SkyrimAI.ini", "Kobold", "Kobold_ResX", 670)
ResY := IniRead("SkyrimAI.ini", "Kobold", "Kobold_ResY", 520)
WinMove(PosX,PosY,ResX,ResY,'koboldcpp.exe')
}
}
if not WinExist('ModOrganizer') {
Run('MO2\ModOrganizer.exe "moshortcut://:SKSE"', 'MO2')
WinWait('ModOrganizer',,10)
Sleep Floor(IniRead("SkyrimAI.ini", "Delays", "MO2Delay", 1) * 1000)
if WinExist('ModOrganizer',,10) {
PosX := Floor(IniRead("MO2\profiles\Default\skyrimprefs.ini", "Display", "iSize W", 1280) / 2 - 190)
PosY := Floor(IniRead("MO2\profiles\Default\skyrimprefs.ini", "Display", "iSize H", 1024) / 2 - 70)
if WinExist('xVA Synth') {
WinActivate('xVA Synth')
WinMinimize 'xVA Synth'
}
WinActivate('ModOrganizer')
WinMove(PosX,PosY,,,'ModOrganizer')
}
WinWait('Skyrim Special Edition GOG',,10)
WinSetTitle('Skyrim Special Edition')
if (IniRead("MO2\profiles\Default\skyrimprefs.ini", "Display", "bFull Screen", 0) == 0) {
PosX := IniRead("SkyrimAI.ini", "Skyrim", "Skyrim_PosX", 0)
PosY := IniRead("SkyrimAI.ini", "Skyrim", "Skyrim_PosY", 0)
WinMove(PosX,PosY,,,'Skyrim Special Edition')
}
}
PosX := IniRead("SkyrimAI.ini", "Mantella", "Mantella_PosX", 1274)
PosY := IniRead("SkyrimAI.ini", "Mantella", "Mantella_PosY", 520)
ResX := IniRead("SkyrimAI.ini", "Mantella", "Mantella_ResX", 670)
ResY := IniRead("SkyrimAI.ini", "Mantella", "Mantella_ResY", 520)
DelM := Floor(IniRead("SkyrimAI.ini", "Delays", "MantellaDelay", 1) * 1000)
while WinExist('Skyrim Special Edition') {
Sleep DelM
if (WinExist('Mantella.exe')) {
WinGetPos(&MantX,&MantY,,,'Mantella.exe')
if (MantX != PosX or MantY != PosY) {
WinActivate('Mantella.exe')
WinMove(PosX,PosY,ResX,ResY,'Mantella.exe')
WinActivate('Skyrim Special Edition')
}
}
}
if WinExist('Mantella.exe') {
WinClose 'Mantella.exe'
}
if WinExist('KoboldCpp') {
WinClose 'KoboldCpp'
}
if WinExist('xVA Synth') {
WinClose 'xVA Synth'
}
FileDelete 'Mantella\data\tmp\voicelines\save\*.wav'
Это пока так, черновой вариант по минимуму. Потом может придут светлые идеи, что-нибудь добавить или улучшить. Компилируем скрипт в EXE и кладем в E:\SkyrimAI\. Рядом создаем файл SkyrimAI.ini и пишем туда:
[Delays]
xVASynthDelay = 1
MO2Delay = 1
MantellaDelay = 1
[Skyrim]
Skyrim_PosX = 0
Skyrim_PosY = 0
[Kobold]
Vision_LLM_load_enable = 1
Kobold_PosX = 1274
Kobold_PosY = 0
Kobold_ResX = 670
Kobold_ResY = 520
[Mantella]
Mantella_PosX = 1274
Mantella_PosY = 520
Mantella_ResX = 670
Mantella_ResX = 520
Два момента на заметку: Во-первых, добавлено переименование окна Скайрима. Извращенцы из GOG зачем-то изменили его, а именно на заголовок окна ориентируется функция зрения. Разработчики Мантеллы уже в курсе этой фичи, и в следующих версиях обещают учесть этот момент, тогда из скрипта можно будет убрать.
Во-вторых, в INI добавлен параметр, отвечающий за загрузку образа графического распознавателя в Kobold. Соответственно, нужны два отдельных конфига с соответствующими именами (settings.kcpps и settings_vision.kcpps). Теоретически, можно было бы привязать это непосредственно к конфигу Мантеллы, но он может меняться без перезапуска игры, а Kobold требует перезапуска. Поэтому пусть будут отдельно.
Разные полезности
Шаблон файлов override (вида NPC_Name.json):
{
"base_id": "XXXXXX",
"name": "NPC_Name",
"bio": "NPC_biography",
"gender": "Male",
"race": "Nord",
"species": "Human",
"skyrim_voice_folder": "MaleEvenToned",
"voice_model": "MaleEvenToned"
}
base_id и name используются для идентификации непися. Обычно достаточно name, но если имя не уникально или именно его требуется переопределить, тогда указывается base_id. Из остальных параметров добавляем только то, что нужно переопределить.