【开发杂谈】用AI玩AI聊天游戏:使用 Electron 和 Python 开发大模型语音聊天软件

项目地址:

GitHub | wfts-ai-chathttps://github.com/HiMeditator/wfts-ai-chat

前言

最近一个基于 AI 的聊天游戏 Whispers from the Stars(群星低语)的 Demo 版本发布了。《Whispers from the Star》是一款科幻主题互动游戏。背景设定在太空,玩家需要通过文本、语音等形式与受困星球的游戏角色 Stella 实时互动,核心目标是协助她成功撤离险境。

游戏和软件界面

在这个游戏中玩家可以和游戏中的女主进行较为流畅的交流。初见这个游戏让我对 AI 聊天产生了兴趣,我想试试用大模型来玩这个游戏是什么效果。因此我最近花了几天开发了一个项目,可以捕获游戏女主的发言,并调用大模型生成对应的回答。然后再调用语音生成模型,将回答音频输入到游戏中,实现用大模型玩游戏的效果。我还做了一个视频,感兴趣的可以去看看

用AI玩AI聊天游戏!用个人开发的AI聊天项目游玩蔡浩宇AI游戏【星之低语】https://www.bilibili.com/video/BV1unbXzDEjW

项目简介

wfts-ai-chat 是一个尝试使用云端模型来游玩 AI 游戏《Whispers from the Stars》的项目。该项目可以获取和识别游戏主角的发言,并针对主角的求助调用大模型生成回答的音频,从而实现使用大模型来游玩游戏的效果。

该项目仅支持 Windows 系统。本项目目前没有推出发行版,用户需要克隆仓库并自行搭建开发环境来运行项目。或者等待后续推出的发行版。

本项目使用了多个阿里云的云端模型(语音识别模型、大语言模型、语言合成模型)。要使用这些模型首先需要获取阿里云百炼平台的 API KEY,然后将 API KEY 添加到软件设置中或者配置到环境变量中。

Python 后端开发

核心流程

Python 后端程序需要完成的核心任务是:

  1. 获取游戏角色语音
  2. 调用模型转换为文本内容
  3. 调用大语言模型生成回答
  4. 调用音频合成合成转换为音频
  5. 将音频输入到游戏中
  6. 重复上述流程

我之前做过一个实时字幕软件(见上一篇博客),因此获取角色音频部分已经有了基本现成的代码。 主要思路是使用 PyAudioWPatch 库来获取系统的实时音频输出。

有了音频后,项目调用了阿里云的 Gummy 模型来实现实时文本识别。将得到的识别的文本内容整理和拼接起来就得到了游戏主角的发言内容。

然后结合精心编写的系统提示词(如下图),将这些内容发送大模型(目前使用的 qwen-max),就能得到大模型针对游戏场景的回答。

目前软件使用的系统提示词

得到回答的内容后再次调研语音合成模型,将大模型的回答合成为音频内容。这里使用的语音合成模型是阿里云的 cosyvoice-v2,这个模型可以选择输出音频的参数和音色,效果还不错。

然后是需要将合成的音频输出到麦克风,这样游戏才能捕捉到用户的发言。但是无法通过 Python 直接将音频输出到麦克风,因此这里使用了 VB Cable 音频驱动软件。VB Cable 可以创建虚拟的音频设备(CABLE Input 和 CABLE Output),用户输入到 CABLE Input 的音频会被输出到 CABLE Output 中。

VB Cable 软件的网站

因此将游戏的音频输入设备改为 CABLE Output 就能获取到 Python 程序输入到 CABLE Input 中的音频了。但是需要注意的是,输入设置为 CABLE Output 游戏会在开始时检测不到麦克风。需要先改为默认麦克风,然后待游戏开始后再将音频输入设备改回 CABLE Output就可以了。

如果游戏提示连接麦克风需要先修改输出设备为默认

经过上述的流程就搞定了音频获取与识别、回答生成、音频生成和输出的全流程了,也就能实现完整的游戏流程了。

进程通信

另一个重点是 Python 程序和 Electron 程序的通信。因为软件用户界面是用 Electron 开发的,用户发送的请求需要再转发到 Python 程序中才会生效。ELectron 主程序到 Python 后端程序使用了 WebSocket 通信。用户的请求均为指令+内容的格式。

Python 程序创建了一个线程专门处理用户请求。Python 的主要逻辑是一个状态机,其中 chatbot.status 表示程序当前所处状态。Electron 主程序发送的指令主要用于修改 Python 程序所处的状态。Python 程序的主进程通过不同的状态来执行不同的逻辑。

def handle_client(client_socket):global chat_botwhile True:try:data = client_socket.recv(8192).decode('utf-8')if not data:continuedata = json.loads(data)if data['command'] == 'stop':if chat_bot.status == 'listen':chat_bot.stop_listening()chat_bot.status = 'stop'elif data['command'] == 'prompt':chat_bot.add_system_prompt(data['content'])elif data['command'] == 'listen':if chat_bot.status != 'ready':stderr(f'Inappropriate Status: Chatbot is not ready, current status: {chat_bot.status}.')continuechat_bot.start_listening()chat_bot.status = 'listen'elif data['command'] == 'answer':if chat_bot.status != 'listen':stderr(f'Inappropriate Status: Chatbot is not listening, current status: {chat_bot.status}.')continuechat_bot.stop_listening()chat_bot.status = 'answer'elif data['command'] == 'output':if chat_bot.status != 'synthesis':stderr(f'Inappropriate Status: Answer audio not ready, current status: {chat_bot.status}.')continuechat_bot.status = 'output'else:stderr('Command Error: Client command not found.')

然后是 Python 到 Electron 主程序的通信,Python 程序主要将当前状态、语音识别结果和生成的回答发送给主进程。这里没有使用 WebSocket。Python 程序是 Electron 主程序创建的,因此主程序能获取到 Python 程序的标准输出。所以 Python 到 Electron 主程序使用标准输出来发送数据。

Python 程序输出的内容为单行可以被解析为 JSON 对象的数据。Electron 主进程读取 Python 程序的输出,并将字符串解析为 JSON 对象,从而获取 Python 端输出的数据。

def stdout(text: str):stdout_cmd("print", text)def stdout_cmd(command: str, content = ""):msg = { "command": command, "content": content }sys.stdout.write(json.dumps(msg) + "\n")sys.stdout.flush()def stdout_obj(obj):sys.stdout.write(json.dumps(obj) + "\n")sys.stdout.flush()def stderr(text: str):sys.stderr.write(text + "\n")sys.stderr.flush()

Electron 程序开发

这部分主要是需要开发一个前台控制软件,用户可以通过软件界面看到 Python 后端程序所处的实时状态、主角发言的识别结果和大模型生成的回答。用户还需要在这个界面控制音频识别和音频输出的时机。除此之外,用户是在游戏过程中使用该软件,因此软件界面不能太大,不能过于影响用户的游戏体验。

根据上述需求,开发了一个小巧的用户界面。整个界面是半透明的,且界面内容紧凑,完全服务于软件需求。其中的按钮会根据后端程序所处的不同状态进行变化,使用更加方便。

软件界面

Electron 开发部分其他没啥可讲的技术内容了,主要就是 Node.js + Vue 分别开发后端和前端,然后对接 Python 后端程序,将获取的内容展示到前端。前端将用户操作发送到 Node 后端,然后再转发给 Python 程序。

项目修改

这个项目是为玩《群星低语》游戏制作的,但是稍微修改一下就可以用于和用户来聊天。只需要将监听系统音频输出改为监听麦克风,软件就能捕获用户的发言,然后根据自己的需求修改项目的系统提示词,这样大模型就能根据用户的不同需求生成需要的回答。而模型的音频输出默认是同时输出到默认音频输出的 CABLE Input,因此无需修改就能听到合成音频的播放。

修改后变为和用户聊天的程序

本软件的开发比较仓促,方案设计比较简单。比如大模型的聊天生成直接使用完整的聊天记录,聊天内容多,每次回答消耗的 tokens 将飞速增加,对于长对话并不划算。而且对话内容过多模型的注意力会下降,导致回复质量下降,可能输出意外的内容,因此目前直接使用该项目通关不太现实。项目还没有经过严格的测试,鲁棒性还不够强。

项目还有很大的改进空间。不过目前市场上的类似的产品已经有很多了,完成度也更高。本项目只是一个我临时为了玩 AI 聊天游戏而开发的不完整项目。作为一个自己开发的项目,我可以根据自己的需求对它进行多种改进,对我来说自由度更高。

最后贴一张使用该项目通过游戏第一个场景,到达第二个场景的截图。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/916802.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL优化系统解析

MySQL的安装就不讲述了, 本篇文章着重讲解sql优化 本篇是对B站颜群老师视频讲解的笔记梳理, 感兴趣的可以去看下老师的原视频: SQL优化 MySQL原理 1. MySQL逻辑分层: 连接层->服务层->引擎层->存储层(如图) 连接层:提供与客户端连接的服务服务层&#…

【机器学习案列-25】电信用户流失预测:从数据处理到模型评估

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

【MATLAB代码】灰色预测与多项式预测、指数平滑预测的对比,包含预处理、模型构建和和可视化输出。模拟预测若干年的GDP,订阅后可查看完整代码,有中文注释

代码实现了灰色预测模型GM(1,1)在GDP预测中的应用,并结合线性回归、二次多项式回归和指数平滑模型进行对比分析。代码包含数据预处理、模型构建、可视化输出和误差验证四个核心模块,实现了从数据输入到预测结果展示的全流程。 文章目录 运行结果 MATLAB源代码 GM(1,1)模型数学…

搜索二维矩阵Ⅱ C++

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {i…

如何在 Apache Ignite 中创建和使用自定义 SQL 函数(Custom SQL Functions)

这段内容讲的是 如何在 Apache Ignite 中创建和使用自定义 SQL 函数&#xff08;Custom SQL Functions&#xff09;。我们可以分步骤来理解它的含义和用法。&#x1f4da; 一、什么是 Custom SQL Function&#xff1f; Apache Ignite 的 SQL 引擎支持 标准 SQL 函数&#xff08…

Oracle 11g RAC数据库实例重启的两种方式

Oracle 11g RAC数据库实例重启的两种方式 使用SQLPlus重启数据库实例 使用SRVCTL重启数据库实例 Administrator-Managed还是Policy-Managed 📖 关于关闭RAC的数据库实例: 在Oracle RAC中,单独关闭一个实例不会影响到其他正在运行的实例。 要完全关闭Oracle RAC数据库,需要…

分别使用 Java 8 和 Python 调用 Elasticsearch 接口简单获取数据

使用 Java 8 首先,确保在您的 pom.xml 文件中添加了正确的 Maven 依赖: <dependency><groupId>co.elastic.clients</groupId><artifactId>elastic

【通识】数据结构

数据结构逻辑结构物理结构&#xff08;存储结构&#xff09;&#xff0c;数据结构是计算机中存储、组织数据的方式。 其中物理结构是数据的逻辑结构在计算机中的存储形式。而存储器针对内存而言&#xff0c;像硬盘、软盘、光盘等外部存储器的数据组织常用文件结构描述。1. 基础…

Ubuntu22.04提示找不到python命令的解决方案

Ubuntu22.04提示找不到python命令的解决方案 问题背景 在Ubuntu22.04中按照获取Openharmony源码中的如下命令&#xff1a; // 方式一&#xff08;推荐&#xff09;&#xff1a;通过repo ssh下载&#xff08;需注册公钥&#xff0c;请参考码云帮助中心&#xff09;。repo in…

RabbitMQ面试精讲 Day 6:消息确认与事务机制

【RabbitMQ面试精讲 Day 6】消息确认与事务机制 开篇 欢迎来到"RabbitMQ面试精讲"系列的第6天&#xff01;今天我们将深入探讨RabbitMQ中确保消息可靠性的两大核心机制&#xff1a;消息确认与事务机制。这两个特性是面试中高频出现的热点问题&#xff0c;也是生产环…

被困扰的elementplus样式修改问题:select选择器修改和el-input修改

一、Select选择器的原生样式的本来面貌这是原生的没有经过任何加工的面貌&#xff1a;这是没有经过任何加工的选中时出现下拉框的面貌&#xff1a;这是没有经过加工的悬浮下拉菜单的面貌&#xff1a;这是没有经过加工的选中时的面貌&#xff1a;二、如何修改Select选择器&#…

GO 从入门到精通2

Go语言的反射&#xff08;Reflection&#xff09;机制通过 reflect 包实现&#xff0c;允许程序在运行时动态检查、修改和操作变量的类型信息和值。以下是反射的核心概念、用法及注意事项的详细解析&#xff1a;一、反射的基本概念reflect.Type 表示变量的类型信息&#xff0c;…

常用设计模式系列(十二)—享元模式

常用设计模式系列&#xff08;十二&#xff09;—享元模式 第一节 前言 昏昏沉沉的两天过去了&#xff0c;也不知道为什么&#xff0c;突然总觉得很困&#xff0c;可能之前熬夜熬的多了&#xff0c;所以现在可能年纪大了&#xff0c;需要蹦一蹦才能把自己从颓废的边缘拉扯回来&…

基于spring boot的医院挂号就诊系统(源码+论文)

一、开发环境 技术/工具描述MYSQL数据库1. 体积小&#xff0c;安装便捷&#xff1a;MySQL数据库体积小&#xff0c;占用内存小&#xff0c;不影响电脑上其他软件的运行&#xff0c;并且不需要因为安装维护MySQL数据库而重装系统。2. 适合老旧电脑&#xff1a;作为学习开发的电…

spring-security

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency>spring: security: user: name: root password: 123456 这个配置在访问接口时候根据您提供的Spring Secur…

搭建一个自定义的 React 图标库

搭建一个自定义的 React 图标库可以让你在多个项目中复用统一的图标资源&#xff0c;同时支持按需加载、主题化和灵活的配置。以下是详细的步骤指南&#xff1a; 1. 设计图标库结构 首先规划图标库的目录结构和功能&#xff1a; my-react-icons/ ├── src/ │ ├── ico…

宝塔面板如何升级OpenSSL

宝塔面板如何升级OpenSSL&#xff08;亲测可用&#xff09;目前一些服务器的OpenSSL还是1.0.1e版本&#xff0c;今天进行服务器漏洞检测出现OpenSSL存在漏洞&#xff0c;那只能升级OpenSSL了。1、登录SSH&#xff0c;查看OpenSSL版本openssl version2、下载源代码wget https://…

深入理解 C++ 红黑树:从理论到实践

引言 在计算机科学领域&#xff0c;数据结构是构建高效算法的基石。而在众多的数据结构中&#xff0c;平衡二叉搜索树因其优秀的查找、插入和删除性能而备受关注。红黑树&#xff08;Red-Black Tree&#xff09;作为一种自平衡的二叉搜索树&#xff0c;更是在 C 标准库&#x…

外星人笔记本装win11哪个版本好_外星人笔记本装win11专业版教程

外星人笔记本安装win11哪个版本好&#xff1f;答&#xff1a;外星人笔记本还是建议安装win11专业版。Win分为多个版本&#xff0c;其中家庭版&#xff08;Home&#xff09;和专业版&#xff08;Pro&#xff09;是用户选择最多的两个版本。win11专业版在功能以及安全性方面有着明…

自学嵌入式 day37 HTML

HTML:超文本标记语言HyperText Markup Language一种用于创建网页的标准标记语言HTML 运行在浏览器上&#xff0c;由浏览器来解析。https://www.runoob.com/html/html-tutorial.html1.格式 <!DOCTYPE html> <html><head><meta charset"utf-8"&g…