Skip to content

fuyueagain/LARP_VLM

Repository files navigation

LARP_VLM

Quick Start

  1. 安装依赖

    pip install -r requirements.txt
  2. 配置环境变量

    • 重命名或者复制 .env.example 文件为 .env
    • 编辑 .env 文件,填入你的API密钥:
      ZHIPU_API_KEY=your_actual_api_key_here
      ``
      

    👀.env 文件包含敏感信息,已被添加到 .gitignore 中,不会被提交到版本控制系统。

  3. 运行项目

    python src/GameMaster.py

Todo list

  • 摄像头输入模块 (Camera Input Module - OpenCV)【通过 cv2.VideoCapture(0) 初始化默认摄像头。在一个循环中,使用 cap.read() 逐帧捕获图像】,可考虑基本的图像预处理,若VLM有特定要求。

  • 依据硬件配置,配置开发环境并选择准确率高反应速度较快的的VLM模型实现物体识别【大模型API考虑Qwen2.5-Omni、Seed1.5-VL、GPT、Gemini 1.5 Pro或者预训练模型进行手中物体识别YOLOv8n/RT-DETR】

  • 实现视频流的物体识别,提高识别的准确率和速度

  • 将VLM识别出的物品名称添加到一个 identified_item变量中

  • 实现NPC状态管理逻辑:定义 npc_stage 变量和 stage_triggers 字典。创建函数检查 identified_item是否满足当前阶段的触发条件并更新 npc_stage。

  • 生成NPC Prompt:创建generate_npc_prompt 函数,根据 npc_stage 和identified_item返回简单的NPC对话字符串。

  • [x]

  • 提交物品的时候,在chatbot里面展示物品图片 而不是展示 提交物品 x

  • 完善chatbot流中的接口

Detailed TODO

  • DONE by 鲁叔, 参考了王莹莹的原始代码 调通一个openai形式的response
  • (DONE by 鲁叔) 在gamemaster引入config配置(一个gamemaster载入一个yaml文件)
  • (DONE by 鲁叔) 准备一堆物品照片,确定gamemaster的物品载入格式
  • (DONE by 鲁叔) gradio和GM增加图片上传接口
  • 鲁叔, 完成剧情内物体 调试物品在chatbot的submit功能
  • 剧情外物体在chatbot的submit
  • (DONE by 鲁叔)在yaml中定义物品-台词的对应关系
  • 鲁叔 fix prompt, 鲁叔 fix解析 DONE by 王莹莹 实现根据prompt 物品 生成台词的函数
  • [x](DONE by 鲁叔) 接通chat history - 鲁叔
  • VLM接口识别物体
  • 调通语音生成
  • 装修界面
  • 每个阶段都可以看到所有物品,感觉有点乱,我们可以限制每个阶段看到的物品不一样
  • 目前每个物品的台词暂时是单一的 不受到阶段的控制, 可以之后升级定义为 支持某个阶段 某个物品的台词(单阶段响应)

改为gradio_state

当前gradio_interface.py的代码可以顺利运行

但是在全局使用了game_master这个变量,使得多个用户使用的时候,会发生串扰

这个时候我希望使用gradio的state功能,在gradio_with_state.py中,实现一个不会串扰版本的gradioUI

图片识别需求

使用VLM的接口

输入一个图片 输出一个物品名称

可选参数 剧情内 candidate 物品s list of string 双节棍

如果有canddates物品, 先输出物品名

  • Captions 详细描述图像
  • Major_Object 物品名称
  • echo 重复字符串: 我将检查candidates中的物品,如果major_object有同义词在candidates中,则修正为candidate对应的名字,不然则保留major_object
  • fixed_object_name:

一个例子

cond本身是一个set,展示任何set中的物品 cond就算满足 进入阶段可以设置多个cond,多个cond必须同时满足

道士,一阶段只是算命

cond1:展示任意修仙物品 进入二阶段

二阶段的道士传授了你功法,但是要你收集五行灵物,土属性的他已经有了,让你先去身边找个金属性灵物

cond1:展示任意金属性灵物 进入三阶段

三阶段 道士让你找一个木属性和一个水属性灵物

cond1:展示任意木属性灵物 cond2:展示任意水属性灵物

四阶段 道士帮你炼制筑基丹,并答应解答你修仙相关的问题

TODO 刘济帆

  • 提供至少一套故事,最好有两组

一套故事的定义为

  • 至少两个阶段的system prompt,最好有三个阶段
  • 物品列表和对应的图片
  • 物品对应的台词
  • system prompt阶段和物品之间的关系,提交什么物品之后进下一个阶段

核心组件与流程:

  1. 视觉语言模型 (VLM) 集成:

  2. 物品识别与存储:

  3. NPC状态管理:

    • NPC的状态可以用一个变量表示(例如 npc_stage,初始可能是“阶段1”)。
    • 需要定义哪些物品是“关键道具”,以及这些道具会如何改变NPC的状态。例如,一个字典可以存储这种映射关系:{'道具A': '阶段2', '道具B + 道具C': '阶段3'}
  4. NPC Prompt (行为/对话) 生成:

    • NPC的行为或对话(prompt)将是一个函数,它的输入是当前 identified_item 集合和 npc_stage
    • 根据这些输入,函数会生成相应的NPC反应。

关键考虑点:

  • 鲁棒性: 真实环境中,光照、角度、物品遮挡等都会影响VLM识别效果,需要考虑如何提高系统的鲁棒性。
  • 用户交互: 如何提示用户展示物品,以及如何反馈识别结果,改善用户体验。

生成yaml的prompt

‘’‘ 我正在制作一个聊天游戏

这个聊天游戏的角色是通过yaml载入的

我现在定义角色中很重要的是一个叫prompt_steps的变量

prompt_steps的每个元素prompt_step有三个字段,分别是

- prompt: 当前阶段角色的系统prompt
- conds: list of cond,角色进入下个阶段的条件,要满足所有cond才能进入下一个阶段
    - cond: 目前默认情况下, cond是一组list of string, 也就是list中任何一个物品被展示,当前的cond就算满足, 比如 铁锭, 金灵珠, 菜刀
- welcome_info: 当进入这个阶段时候的欢迎信息, 比如"小子,看来你找到xx了,那我们。。"

然后我在设置一个 四阶段道士 信息如下,帮我根据这个信息,写出道士的yaml信息

<example_info>

道士,一阶段只是算命,一个在路边算命的道士

cond1:展示任意修仙界的物品 进入二阶段

二阶段的道士传授了你功法,但是要你收集五行灵物,土属性的他已经有了,让你先去身边找个金属性灵物

cond1:展示任意金属性灵物 进入三阶段

三阶段 道士让你找一个木属性和一个水属性灵物

cond1:展示任意木属性灵物 cond2:展示任意水属性灵物

四阶段 道士帮你炼制筑基丹,并答应解答你修仙相关的问题

</example_info> ’‘’

About

VLM part

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •  

Languages