Skip to content

RibomBalt/webgal-llm-puppet

Repository files navigation

本项目为WebGAL基础上的衍生项目,利用外部脚本驱动WebGAL演出内容,并与WebGAL内部获取用户输入的界面交互,并在此基础上实现大语言模型对话。演示视频

This is a derivative project based on WebGAL, using external scripts to drive the content of WebGAL engine, interacting with WebGAL's internal user input interface, and building a LLM chatbox app on top of that. Check a demo video here

部署方式

大模型 API KEY

  1. 获取一个支持使用python openai库调用的API KEY(我用的deepseek)
  2. backend/secrets.yml中,并按格式添加内容:
    1. 前面的名字:默认为deepseek,需要和system_prompts.ymlsakiko - model保持一致
    2. model: 模型内部名,是传入openai客户端的名称,以deepseek为例,应该填deepseek-chat
    3. api_key: 你的KEY
    4. base_url: 你的模型URL

或者你有条件也可以本地部署大模型,让base_url指向对应URL即可。

本项目(fastapi后端)

  • 准备一个Python=3.11环境(其他版本没测试)
  • 安装依赖:cd backend && pip install -r requirements.txt
  • 运行:cd backend && uvicorn app:app --port=10228 --reload。这个服务需要挂在后台。

WebGAL

我的WebGAL版本:4.5.9

从零开始准备环境:

1. 准备带MyGO素材 + L2D库的WebGAL环境

首先你需要一个包含了mygo立绘和L2D的WebGAL引擎源码。如果你在WebGAL的MyGO二创群里,你可以把群文件的MyGO2.2文件夹里的内容复制到packages/webgal/public(或者你也可以选择手动写脚本从bestdori直接下载)。目前版本的常服祥子的L2D模型会位于packages/webgal/public/game/figure/mygo_avemujica_v6/sakiko/341_casual-2023_rip/model.json,其中路径中figure的后的部分和system_prompt.ymllive2d_model_path相同,可以自行修改。

之后你还需要按照官方文档的指南下载L2D运行库并注释掉相关代码。

2. (可选)WebGAL界面美化/魔改

在此基础上,我还使用了群里的仿Bestdori UI,可以直接放到放packages/webgal/public/game/template中。另外处理用户输入的getUserInput组件不能用template修改,我直接修改了部分组件源码,包括调整输入框的位置、字体,用textarea支持多行输入,以及加入Ctrl+Enter直接提交输入的快捷键。

所有改动详见webgal.git.diff。你可以视情况接受这些改动。

3. start.txt 入口场景

WebGAL是从start.txt这个场景脚本启动的。我们需要让它最终以一个changeScene跳转到后端的程序入口。比如:

choose:客服小祥📞:llm|README.MD:help;
label:llm
bgm:http://localhost:10228/static/assets/office/office-ambience.mp3
changeScene:http://localhost:10228/webgal/newchat.txt?bot=sakiko;
label:help
changeFigure:none
changeScene:http://localhost:10228/webgal/readme.txt

4. 编译/部署WebGAL

完成修改后,你可以:

  • 在WebGAL目录下yarn dev拉起一个临时服务器,然后访问控制台弹出的链接。
  • 或者先yarn build后,在packages/webgal/dist下找到编译后的静态网页,然后用任何可以部署静态服务器的方式部署(例如python -m http.server 3000,或者nginx, apache2等等)
    • 不要直接用文件管理器打开index.html

如果你有WebGAL Terre MyGO专版:

编辑好启动脚本后,点击上方标签页——导出——导出为网页,然后在Exported_Games\{你的项目名}\web目录找到导出后的网页,等价于第三步编译后的静态网页。

当然这种情况下第二步美化界面只能跳过了……

修改配置

修改配置后需要重新启动后端才能生效。重新启动后正在进行的对话聊天记录会消失,无法继续对话。

系统提示词 & 定制

提示词、模型参数和表情配置等默认保存backend/system_prompts.yml中,每一组是一个【预设】(对应到源码中即BotPreset或者L2dBotPreset类)

其他参数不说自明(懒得写了)。需要特别说明的参数:

  • mood: 这个字典项,都是一个表情名称到多个l2d动作/表情代号的字典。表情代号除了listening是刚接受用户输入后使用,其他表情都是mood_analyzer这个预设的系统提示词返回的信息。程序对每句回复会请求mood_analyzer判断这一句的情感倾向,然后找到mood中对应项的列表,随机抽取一个作为这句话的动作/表情。
  • voice: 可选的配音模块。
    • type值如果为fish,则使用fish-speech项目,此时api为以HTTP API模式启动的fish-speech后端的路径,voice_line会设定reference_id参数,你需要提前在fish-speech主目录下建立references/<reference_id>文件夹,并放入参考音频和对应label文件。
    • type值如果为edge,则使用edge-tts项目,即用于微软edge浏览器的TTS。声线不可定制,但是响应速度快且效果稳定。如果懒得配AI祥子配音的环境,这个是最好的替代方案。
    • type值如果为mahiruoshi,则使用Mahiruoshi老师用Bert-VITS2配置的 BangDream-Bert-VITS2的API,此时voice_line需指定为祥子api会忽略。不建议使用,响应速度慢+效果随机,不如本地配一个fish-speech
    • type为其他值会禁用声音模块。

如果你需要加新的预设(比如用其他L2D,表情,提示词等),你可以:

  1. 把原本sakiko的预设复制一组,并填入内容
  2. 在WebGAL的start.txt中,给changeScene的URL加上?bot={你的预设名字}

其他环境变量

.env中可以修改backend的部分配置。

  • DEBUG: 设为1可以看到backend的详细日志。如果你需要反馈BUG,记得把这个设为1后附上程序的相关输出。
  • HOST, PORT: backend绑定的地址端口。还用于生成WebGAL要访问backend的URL地址。
  • PROXY_URL: 可选。访问大模型时可以给一个代理,比如http://127.0.0.1:7890
  • REDIS_HOST, REDIS_PORT, REDIS_NAMESPACE(未使用), REDIS_PASSWORD: 可选。这几个参数可以让后端用redis缓存,如果没有设置或设置错误,会自动fallback到用一个全局变量字典缓存。

主要素材借物

部分其他素材:

About

Convert WebGAL framework into a LLM chatbox

Resources

License

Stars

Watchers

Forks

Packages

No packages published