Interactive-LLM-Powered-NPCs
用大语言模型为任意游戏NPC注入实时对话能力,让路人也有人格
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
用大语言模型为任意游戏NPC注入实时对话能力,让路人也有人格
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
你正在《赛博朋克2077》的霓虹街头游荡,忽然对路边一个正在淋雨的流浪汉产生了好奇。他是谁?他有什么故事?如果你是这款游戏的NPC,你大概也想知道答案。但现实是,这些路人的台词只有那么几句循环播放的固定台词——他们的存在感只停留在背景板层面。这就是"沉浸式开放世界"与"真实对话体验"之间那条至今无法跨越的鸿沟。
Interactive LLM Powered NPCs 正是为了填补这道鸿沟而生的开源项目。它的核心目标是:在任何已有游戏中,让玩家能够与任意NPC进行真实、连贯、有记忆的对话。 这不是对游戏本身的修改,而是一种外部增强方案——通过AI技术实时生成NPC的语音回复和面部动画,让这些角色真正"活"过来。
这个项目来自独立开发者 Akshit Ireddy(GitHub: AkshitIreddy),由 Alystra AI 团队支持,在 GitHub 上已获得 713 颗星、75 个 Fork,引发了游戏AI社区的广泛关注。
在 Interactive LLM Powered NPCs 出现之前,游戏AI对话领域的主流方案大致分为三类:
第一类是专业游戏引擎集成方案,比如 Inworld AI、Convai。这类方案需要游戏开发商主动接入API,属于"从一开始就设计好"的方式。但对于《赛博朋克2077》《 GTA 5》《刺客信条》这些已经发布多年的3A大作,开发商显然不会回头去做这类集成。
第二类是传统MOD社区的对话补丁,由MOD作者手动编写NPC台词。这类方案工作量极大且无法覆盖所有NPC,更关键的是——台词是写死的,无法根据玩家实时输入产生变化。
第三类是一些研究性的Demo,展示了大语言模型在游戏NPC上的潜力,但这些Demo大多停留在理论验证阶段,缺乏与真实游戏画面的整合能力。
Interactive LLM Powered NPCs 的出现,恰好填补了"已有游戏增强"这个被忽视的需求空白。它不要求任何游戏源码,不要求游戏开发商配合,通过屏幕截图 + 语音输入 + 实时生成 + 画面替换的完整链路,让任何拥有基础硬件的玩家都能在自己的游戏过程中体验到AI驱动的NPC对话。
项目的技术实现分为四个关键环节,环环相扣,构成了一条完整的实时对话流水线。
玩家对着麦克风说话,项目使用 Python 的 SpeechRecognition 库调用 Google Speech Recognition API 将音频转换为文字。这是整个对话流程的起点,也是最自然的交互方式——你不需要打字,直接开口说话就行。代码中通过 sr.Recognizer() 初始化识别器,调用 recognize_google() 完成转换。如果环境噪音较大或识别失败,系统会返回 "NULL" 并记录错误信息。
这一步涉及两个子任务:识别NPC身份和检测玩家自己的情绪状态。
对于NPC身份识别,项目使用了 DeepFace 库配合 retinaface 检测器,从游戏屏幕截图(通过 grabscreen.py 截取当前屏幕)中提取人脸区域。如果检测到一张人脸,直接处理;如果检测到多张人脸,选择置信度最高的一张。提取到的人脸会被裁剪放大(扩展到原始宽高的3倍),用于后续的向量匹配。
系统内部维护了一个角色数据库(每个游戏目录下 characters/ 文件夹),里面存储了每个已知NPC的向量表示(ChromaDB向量数据库)。通过余弦相似度计算,找到当前截图中NPC与数据库中哪个角色的特征最接近。如果数据库中没有匹配的角色(比如随机路人),系统会将其归类为"背景角色"(background character)。
对于玩家情绪识别,项目使用网络摄像头捕获玩家面部图像,通过 webcam_photo_emotion_predictor 分析玩家的情绪状态(高兴、悲伤、愤怒等),这个情绪标签会被传入对话生成阶段,让NPC的回复能够"感知"玩家的情绪。
这是整个系统最核心的部分。项目使用 LangChain 框架调用 Cohere 的 command 模型(temperature=0.9, max_tokens=300)生成NPC的回复文本。
对话生成并非简单的问答,而是一个精心设计的 Prompt Engineering 过程。系统为每个角色构建了一个完整的上下文,包含:
world.txt):描述游戏世界的背景设定bio.txt):描述NPC的性格、背景、经历pre_conversation.json):定义NPC说话的方式和习惯conversation.json):记录本次游戏进程中与该NPC的对话public_info.txt)和角色私有数据(character_data):NPC所知道的公开知识和个人秘密系统会将这些信息组合成一个结构化的 Prompt,引导 Cohere 模型生成符合角色人设的回复。当对话历史超过500个token时,系统会自动调用另一个 LLM Chain 对历史进行摘要压缩,再存入 ChromaDB 向量数据库,同时清空对话历史以控制token消耗。这种"记忆压缩"机制保证了长期对话的可行性。
NPC的文本回复通过 Edge TTS(微软Azure认知服务)转换为自然语音,再结合 SadTalker 进行唇形动画生成。
SadTalker 是集成在项目 SadTalker/ 子目录中的一个完整模块,它接收NPC的头像图片和语音文件,通过深度学习模型生成对应的唇形动画视频。生成的视频会覆盖游戏画面中原有的NPC面部像素,实现无缝替换。
代码中 create_facial_animation.py 通过调用 SadTalker 的推理脚本 inference.py,传入驱动音频、源图片、输出目录等参数,生成增强版唇形动画(--enhancer gfpgan 参数提升生成质量)。最终的视频路径和音频路径被返回给主流程,完成整个对话回合。
整个项目的代码组织体现了良好的工程思维。从目录结构可以看出,项目采用了函数模块化的设计模式:
functions/
├── audio_generate_side_character.py # 具名NPC音频生成
├── audio_generate_background_character.py # 背景NPC音频生成
├── video_generate_side_character.py # 具名NPC唇形视频生成
├── video_generate_background_character.py # 背景NPC唇形视频生成
├── face_detection.py # DeepFace人脸检测
├── conversation_loader.py # 对话历史管理+记忆压缩
├── pre_conversation_loader.py # 角色对话风格加载
├── speech_to_text.py # 语音识别
├── get_emotion.py # 情绪检测
├── webcam_photo_emotion_predictor.py # 摄像头情绪感知
├── create_facial_animation.py # SadTalker调用封装
├── grabscreen.py # 屏幕截图
└── main.py # 主流程编排
每个函数职责单一,通过文件路径传递状态(游戏名、角色名等作为目录层级),这种设计使得添加新游戏支持或新角色变得非常简单——只需要创建对应的目录和配置文件,无需修改代码。
项目还提供了多个 Jupyter Notebook 供用户创建向量数据库和角色人设:create_character_vectordb.ipynb、create_face_recognition_representation.ipynb、voice_selection.ipynb 等,降低了普通用户配置角色的门槛。
技术栈一览:
| 类别 | 技术选型 |
|---|---|
| LLM | Cohere command (via LangChain) |
| 向量数据库 | ChromaDB |
| 人脸检测 | DeepFace (retinaface后端) |
| 唇形动画 | SadTalker |
| 语音识别 | SpeechRecognition (Google API) |
| 语音合成 | Edge TTS |
| 图像处理 | OpenCV |
| 主框架 | Python + LangChain |
坦白说,这个项目的部署门槛不低。项目不提供 Docker 支持,也没有 Web UI,是一个纯 Python 脚本驱动的本地运行工具。部署需要满足以下条件:
硬件要求: 必须有 NVIDIA GPU(显存6GB以上),因为 SadTalker 的深度学习推理需要 CUDA 支持。内存建议8GB以上,磁盘空间10GB以上(包含模型权重)。
软件依赖: Python 3.10+,CUDA + cuDNN,DeepFace、LangChain、ChromaDB 等通过 requirements.txt 安装(包含10个核心依赖)。最麻烦的部分是 SadTalker 的模型权重需要单独下载配置,项目在 SadTalker/ 子目录中内置了 SadTalker 的完整代码,但仍需处理模型下载。
游戏配置: 每个游戏需要单独的配置文件目录(如 Cyberpunk_2077/),包含角色数据、向量数据库、预对话文件等。项目中已内置了《赛博朋克2077》的完整配置,其他游戏需要用户参考文档自行创建。
API Key: 项目使用 Cohere API 生成对话,需要在 apikeys.json 中配置(支持多个Key轮换以避免限流)。
项目的文档质量出乎意料地高——docs/doc.md 长达17KB,详细描述了每个模块的工作原理、配置方法、故障排查等。对于一个独立开发者项目来说,这种文档深度非常难得。
在体验和调研过程中,这个项目的局限性也比较明显:
响应延迟问题。 整个对话链路涉及语音识别→LLM生成→语音合成→唇形动画生成四个步骤,实测总延迟可能在3-10秒量级。对于快节奏游戏来说,玩家可能需要停下来等待NPC"想好怎么回复"。
唇形同步质量不稳定。 SadTalker 虽然是当前较好的音频驱动唇形生成方案,但在侧面角度、遮挡、极端表情等情况下仍可能出现瑕疵。在游戏画面实时覆盖场景中,这些瑕疵会更加明显。
API成本。 Cohere 的 command 模型按token计费,每个NPC对话都在消耗API配额。长期游戏过程中,如果玩家与大量NPC深度对话,成本可能不容忽视。
仅支持PC游戏。 项目通过屏幕截图和像素替换的方式工作,天然只支持PC平台。主机玩家暂时无缘体验。
Interactive LLM Powered NPCs 的价值不仅在于它做了什么,更在于它证明了什么——它证明了在不需要游戏开发商配合的情况下,开源社区有能力为已有游戏带来AI增强体验。
从技术演进角度看,这个项目代表了几个重要趋势的交汇:开源大语言模型(降低对话生成门槛)、开源唇形同步(SadTalker的成熟)、开源向量检索(ChromaDB的普及)。这些技术的组合使用,让"让NPC开口说话"这件事从学术研究变成了普通开发者可以复现的工程实践。
目前项目在 GitHub 上 713 星的收藏量,说明了社区对这类"AI+游戏"交叉创新有着强烈的关注度。虽然距离产品化还有距离,但它的方向是清晰的——未来,每个游戏的NPC都可能成为一个可以深度对话的AI Agent。
如果你有 NVIDIA 显卡、对AI和游戏都有兴趣,不妨clone下来试试。也许下一个让夜之城NPC讲出你自己故事的人,就是你。
项目地址:https://github.com/AkshitIreddy/Interactive-LLM-Powered-NPCs
作者:Akshit Ireddy / Alystra AI
License: MIT