【開發雜談】用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
英文地址,請注明出處:http://en.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…