概述 😄📜
互动LLM驱动的NPCs是一个开源项目,彻底改变你与任何游戏中的非玩家角色(NPCs)的互动体验!通过这个项目,你可以使用麦克风与任何游戏中的NPC对话。
该项目使用sadtalker来同步角色的嘴唇运动,使用面部识别技术来识别不同的角色,使用向量存储为NPC提供无限的记忆容量,并使用预会话文件来塑造每个角色的对话风格。通过分析你正在与之互动的特定NPC,包括他们的个性、知识和沟通风格,系统会作出相应调整。此外,NPC甚至可以通过你的摄像头感知你的面部表情,增加交互的深度。
这个项目的目标是像《赛博朋克2077》、《刺客信条》、《GTA 5》等以前发布的游戏。这些游戏中拥有丰富的NPC和美丽的环境,长期以来一直渴望一种缺失的功能:让玩家能够与任何想交谈的NPC进行对话。通过这个项目,我们旨在填补这一空白,为这些游戏带来身临其境的对话冒险,让玩家在这些虚拟世界中释放未被发现的潜力。目标是提升那些原开发者不太可能提供这个功能的已发布游戏的体验。
这个项目的一个显著特点是它的多功能性。你不需要修改游戏的源代码或进行复杂的moding程序。相反,它通过替换游戏生成的面部像素实现其魔法,无缝地将面部动画整合到你的游戏环境中。
无论你是在《刺客信条:英灵殿》中探索古老的地牢,还是在《赛博朋克2077》中走在霓虹灯闪烁的街道,互动LLM驱动的NPCs都会将你的游戏体验提升到新高度。准备好迎接与NPC的有趣、真实和有意义的互动,这些互动将赋予你的虚拟世界生命。
演示 🚀✨
演示链接: https://twitter.com/Akshit2089/status/1673687342438051847
解释视频: https://twitter.com/cohere/status/1687131527174672384
教程视频: https://youtu.be/6SHTlKYKCbs
Discord服务器: https://discord.gg/CfK7DCWKwy
工作原理 🤔💭
这个项目的功能与它所实现的对话一样迷人。以下是互动LLM驱动NPCs工作原理的概述:
🎙️ 麦克风输入:对着麦克风讲话,你的声音会被转换成文本。
👥 面部识别:系统采用面部识别技术识别你正在互动的NPC,无论是背景角色还是次要角色。
🔍 角色识别:基于对话和角色识别,为背景NPC生成唯一的个性和名字。对于次要角色,访问他们的特定性格特征和知识。
🧠 LLM集成:转录文本和角色信息传递给大型语言模型(LLM),根据给定的上下文生成响应。LLM还利用包含角色特定和世界信息的向量存储。
📁 预会话文件:为了确保NPCs说话的真实性,项目使用包含角色经典台词和反映其谈话风格的预会话.json文件。在生成响应时,随机从该文件中抽取台词传递给LLM,增强生成的对话。
🗣️ 面部动画和语音生成:LLM的响应通过文本转语音转换成语音,然后使用提取的NPC面部图像和音频生成面部动画视频。
🕹️ 与游戏的整合:通过用生成的面部动画替换显示的面部像素,面部动画视频和音频无缝集成到游戏中,使其看起来如同NPC自然地在说话。
😃 情感识别:通过使用你的摄像头,系统捕捉你的面部表情,使NPCs能够相应调整他们的回应,创造更个性化和沉浸式的体验。
🐎 非视觉交互:项目不仅限于面对面的对话,还能够在NPC面部不可见时进行交互,例如在骑马或激烈战斗场景中。要与NPC交谈,只需先叫他们的名字,然后再说你的对话。系统将按照相同的流程转录、生成响应并将其转换成语音,即使在动作场面中也能提供无缝和不中断的对话体验。所以,无论你是在乡村中奔驰还是在与强敌战斗,你都可以与NPCs交流并享受互动对话功能的全面体验。
🌐 游戏兼容性:无需游戏修改或更改游戏的源代码即可无缝工作。
先决条件 🚀🔧
🐍 Python 3.10.6
你可以从这里下载并安装此版本的Python https://www.python.org/downloads/release/python-3106/
运行安装程序时确保点击添加到路径选项。
🐙 GIT
安装GIT,一个版本控制系统,以便轻松管理你的代码并与他人协作。https://git-scm.com/downloads
🌐 wget
安装wget,一个命令行实用程序,方便地从网上下载文件。
🛠️🔍 Microsoft Build Tools和Visual Studio
安装Microsoft Build Tools和Visual Studio,这是在Windows上编译和构建项目所必需的。
https://visualstudio.microsoft.com/downloads/?q=build+tools#visual-studio-professional-2022
https://visualstudio.microsoft.com/downloads/?q=build+tools#build-tools-for-visual-studio-2022
🎥🔊 FFmpeg
安装FFmpeg,一个强大的多媒体框架,用于处理音频和视频处理任务。
按照此处的说明进行操作 https://www.wikihow.com/Install-FFmpeg-on-Windows
安装 🔌✨
- 打开终端。
- 执行以下命令克隆代码库:
git clone https://github.com/AkshitIreddy/Interactive-LLM-Powered-NPCs.git
- 导航到克隆的代码库:
cd Interactive-LLM-Powered-NPCs
- 创建一个名为.venv的Python虚拟环境:
python -m venv .venv
- 激活虚拟环境:
.venv\scripts\activate
- 安装所需的依赖项:
pip install -r requirements.txt
- 打开一个Git Bash终端。
- 将目录更改到“Interactive-LLM-Powered-NPCs”文件夹:
- 进入SadTalker目录
cd sadtalker
- 下载必要的模型
bash scripts/download_models.sh
-
在文件浏览器中打开“sadtalker”目录,找到名为“webui.bat”的文件并双击它。这将创建另一个名为“venv”的Python环境。等到显示“WebUI launched”消息,然后关闭由webui.bat打开的终端。
-
创建一个Cohere账户(免费)并将你的Cohere试用API密钥添加到apikeys.json中。(可选:如果你有GPT-4访问权限并希望使用它,你需要对代码进行一些小修改)
-
删除video_temp和temp文件夹内的所有文件和文件夹。
带有Jupyter Notebook支持的Vscode安装 👨💻📔
在你的设备上下载并安装Visual Studio Code。点击左侧工具栏上的扩展图标,看起来是一个由四个正方形组成的正方形图标。在扩展面板中,使用顶部的搜索栏搜索“Jupyter”。在搜索结果中查找由Microsoft提供的“Jupyter”扩展并点击旁边的“安装”按钮。这个扩展在Visual Studio Code中启用Jupyter Notebook支持。然后安装python扩展程序。打开终端并导航到项目的根目录。这是包含项目文件的主文件夹。在终端中输入code .并按下回车键。此命令将在Visual Studio Code中打开当前目录。或者,你可以使用Visual Studio Code中的文件浏览器导航到项目的根目录。一旦项目在Visual Studio Code中打开,你应该会看到编辑器右侧显示的项目文件。
在运行Jupyter Notebooks时,确保选择内核为.venv(在右上角显示)。如果你看不到选择.venv的选项,请点击文件,然后点击打开文件夹,选择主项目文件夹(Interactive-LLM-Powered-NPCs),然后笔记本应能检测到.venv。
使用说明 🛠️🤓
-
📁 在项目的根目录下创建一个文件夹。文件夹名称应为你的游戏名称,将空格替换为下划线,避免使用特殊字符。例如,如果你的游戏名称是“Assassins Creed Valhalla”,则文件夹名称可以是“Assassins_Creed_Valhalla”。
-
📝 在游戏文件夹内创建一个名为“world.txt”的文本文件来描述游戏和游戏世界。你可以从https://www.fandom.com/等网站获取关于游戏的详细信息。
-
📝 在游戏文件夹内创建另一个名为“public_info.txt”的文本文件。这个文件应包含关于游戏世界、主要事件以及任何在该游戏世界中居住的人应该知道的细节信息。你可以从前面提到的网站获取这些信息。
-
📔 打开位于根目录的Jupyter Notebook名为“create_public_vectordb.ipynb”。在第一个单元格中设置变量“game_name”为你的游戏名称。运行第一个单元格以创建公共向量数据库。然后运行第二个单元格以测试其性能。向量数据库就像提供各种主题相关信息的活图书馆。
-
📝 在你的游戏文件夹中创建一个名为npc_personality_creation的文件夹,然后将Cyberpunk_2077文件夹中的两个文件audio_mode_create_personality.py和video_mode_personality.py复制进去。这些文件负责为背景NPC生成独特个性,因此你需要根据你的游戏修改模板变量。这些模板变量有三个名字及其个性,你需要将这些名字替换为游戏中常见的NPC名称,并将这些个性替换为游戏中常见的个性,你可以借助ChatGPT来创建个性。这些示例将指导LLM如何生成个性。完成后将这些文件复制到functions目录,替换之前个性创建文件。
-
📂 在游戏文件夹中创建一个名为 "characters" 的文件夹。从 "Cyberpunk_2077/characters" 文件夹中复制 "default" 文件夹,并将其粘贴到新创建的 "characters" 文件夹中。您需要修改 "default" 文件夹中的 "pre_conversation.json" 文件。该文件应包含游戏世界中人们常说的通用台词。您可以请求 ChatGPT 提供特定于您的游戏的此 JSON 格式的对话。以下是您可以使用的提示:
给出30个Cyberpunk 2077中人们常说的通用对话,格式如下:
{
"pre_conversation": [
{ "line": "对话1" },
{ "line": "对话2" }
]
}
将 "pre_conversation.json" 文件的内容替换为生成的对话。
默认文件夹用于背景 NPC,随着您与不同的 NPC 交谈,其传记、名字、声音和照片会不断变化。
-
📂 在 characters 文件夹中创建一个以您希望与之交谈的任何配角名字命名的文件夹,将空格替换为下划线。在这个角色文件夹中,创建一个 "images" 文件夹,并放置 5 张该角色的 JPG 照片(这些照片中不应有其他人物)。
-
📔 打开 "create_face_recognition_representation.ipynb" 笔记本,并在两个单元中设置 "character_name" 和 "game_name" 变量。运行两个单元以创建角色面部的表示。这一步有助于项目在您玩游戏时识别您正在与哪个角色互动。
-
📝 在角色文件夹中创建一个名为 "bio.txt" 的文本文件。该文件应包含关于您角色的简要概述,您可以从 fandom 或类似来源中收集这些信息。
-
📝 在角色文件夹中创建一个名为 "character_knowledge.txt" 的文本文件。此文件应包含您的角色知道但不在公共向量数据库中的信息。您可以从 fandom 或类似来源找到这些信息。
-
📔 使用 "create_character_vectordb.ipynb" 笔记本来创建角色的向量数据库。打开笔记本,在第一个单元中设置 "character_name" 和 "game_name" 变量,然后运行该单元。
-
📝 在角色文件夹中创建一个 "pre_conversation.json" 文件,内含该角色常说的对话。这些对话应抓住角色的精髓,并将用于指导响应的风格。您可以参考 Cyberpunk 2077 角色文件夹中现有的 "pre_conversation.json" 文件。
-
📝 在角色文件夹中创建一个 "conversation.json" 文件。您可以从 Cyberpunk 2077 中 Jackie Welles 的角色文件夹中复制该文件,并将第一个对话更改为符合您角色的内容。
-
📂 创建一个 "voice" 文件夹。在此文件夹中,放置一个名为 "voice.py" 的 Python 脚本,其中包含一个名为 "create_speech" 的函数。该函数应接受文本和输出路径作为参数,以存储生成的音频文件。您可以从 Jackie Welles 复制脚本,并修改语音以匹配您的角色声音。您可以使用 voice_selection.ipynb 查找与您角色声音相似的声音。如果您想使用语音克隆或其他技术,请确保角色声音文件夹中的 "voice.py" 文件具有相同的 "create_speech" 函数签名,并且不使用相对路径。
-
♾️ 对您希望在游戏中与之互动的任何其他角色重复上述步骤。
完成这些步骤后,您就可以开始玩游戏了。确保您的网络摄像头和麦克风已打开,以充分体验互动元素。🎮🌟
开始游戏! 🎮🚀
首先,启动游戏并打开 "main.ipynb" 文件。在第一个单元中,您会找到 "player_name"、"game_name" 和 "interact_key" 变量。根据您的喜好设置这些变量。完成后,运行第二个单元。如果您的 GPU 在渲染面部动画时出现困难,您可以选择在参数中禁用它。
通过运行第二个单元,将出现一个新窗口。将此窗口拖到显示游戏的显示器以外的另一个显示器上(确保您的显示器设置为扩展而不是复制,您可以在系统 > 显示中找到此设置)。如果您没有另一个显示器,请将 miscellaneous/Single Monitor 中的文件复制到主项目目录(确保在 main.ipynb 中输入 game_screen_name 变量)。现在,将游戏中的相机对准您想与之交谈的非玩家角色 (NPC)。
单击新窗口并按住互动键,直到右上角出现 "说话" 字样。说出您的信息,您会注意到您说的话出现在角落里。片刻之后,角色会以面部动画和语音回复您。
如果由于某种原因,您想要交谈的角色没有出现在屏幕上,您仍然可以按照相同的步骤进行。即使看不到角色,您也会收到音频回复。当与另一个 NPC 骑马或与您的同伴进行战斗时,这一功能非常有用。
结论与贡献 🤝🎮
互动式 LLM 驱动的 NPC 为增强任何游戏中的 NPC 互动打开了令人兴奋的可能性,为您的游戏体验带来了新的真实感和沉浸感。
我们邀请您通过将游戏添加到 "Games" 文件夹中,帮助扩展互动式 LLM 驱动的 NPC 的兼容性。这样,您可以帮助其他人省去适应新游戏的努力,并增加兼容游戏的数量。
如果您已创建了与互动式 LLM 驱动的 NPC 兼容的游戏,我们鼓励您提出拉取请求并与社区分享您的游戏。通过将您的游戏添加到集合中,您为支持游戏库的增长做出了贡献,并使更多玩家能够享受动态和真实的 NPC 互动。
此外,您还可以通过改进现有功能、修复漏洞或提出新想法来为项目做出贡献。随意探索代码库,加入讨论,并与其他开发人员合作进一步增强项目。
让我们共同塑造游戏中的 NPC 互动未来,为全球玩家创造难忘的体验。所以,加入我们这段激动人心的旅程,让我们为每个人打造更具互动性和吸引力的游戏对话!
使用的工具 🚀🔧
- 🍪 Cohere 的语言模型和嵌入模型与 Langchain 用于 LLM Agent
- 🍩 SadTalker 用于面部动画
- 🍰 Edge-TTS 用于默认语音
- 🧁 DeepFace 用于面部识别、检测、性别、年龄、情感检测
- 🍭 Chromadb 用于本地向量存储
- 🍬 SpeechRecognition 包用于语音识别
❤️ 感谢
如果您对此感兴趣,请查看 Alystria AI 获取更多有趣的项目
https://www.linkedin.com/company/alystria-ai
- 🌐 Github: https://github.com/AkshitIreddy
- 💡 LinkedIn: https://www.linkedin.com/in/akshit-ireddy
- ✍️ Medium: https://medium.com/@akshit.r.ireddy