解决方案

数字生命计划:我要给派蒙完整的一生

seo靠我 2023-09-23 03:27:44

前言

看完流浪地球2之后,我对数字生命计划产生了不小兴趣。因为带着整个地球去流浪,显然可行性较差。而得益于最近自然语言处理领域的快速发展,数字生命计划越来越接近于落地。

本文将使用Chat GPT+VITSEO靠我S+Live2d+Renpy这几项技术,来实现一个数字派蒙机器人

下面的演示视频是实现的效果,先睹为快:

我要给派蒙完整的一生

项目开源地址:https://github.com/zstar1003/DiSEO靠我gitalLife

Renpy

Ren’Py是一个视觉小说引擎,可以使用文字、图像和声音讲述在计算机和移动设备上运行的交互式故事。

Renpy的中文官方文档:https://www.renpy.org/doSEO靠我c/html/

Renpy嵌入Live2d

Live2d本身是一款软件,该软件可以生成Live2d模型,这些模型设定了一系列动作,可以实现插画的动态效果。

Renpy提供了Live2d的相关接口:

Live2SEO靠我D(filename, zoom=None, top=0.0, base=1.0, height=1.0, alias={}, loop=False, fade=None, seamless=NoneSEO靠我, attribute_function=None, attribute_filter=None, update_function=None, **properties)

参数的具体含义可查阅官方文档。SEO靠我

Socket通讯

Renpy内置了python2和python3.9的环境,不过预装包十分有限。虽然官方支持导入其它依赖包,不过经实测,仍然会遇到各种各样的奇怪问题。

因此,为了处理用户在前端Renpy输SEO靠我入的信息,更方便的方式是构建一个后端,用来在外部接受信息和处理信息。前后端的信息传递,可以使用socket通讯方式。

下面是一个socket的简单实例:

首先构建服务端,服务端通常需要使用一个循环来持续监SEO靠我听请求:# 服务端 import sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(SEO靠我(127.0.0.1, 12313)) s.listen(5) print("已启动,等待连接中")while True:sock, addr = s.accept()SEO靠我client_data = sock.recv(400000)print(client_data.decode())sock.send(你好.encode())

这里服务端绑定了一个本地ip127.0.SEO靠我0.1和端口号12313。

客户端需要向该ip和端口发送请求,才能够建立连接,下面是客户端的示例:

# 客户端 import sockets = socket.socket(socket.SEO靠我AF_INET, socket.SOCK_STREAM) s.connect((127.0.0.1, 12313)) # 服务端IP地址, 该地址为服务端的IP地址 sSEO靠我.send("这是输入的内容".encode()) print(s.recv(1024).decode()) # 端口号,与服务端暴露的端口号一致 s.close()

SEO靠我这个示例中,客户端建立连接后,先发送一次内容,再接收一次内容。值得注意的是,服务端和客户端的通讯数据必须为二进制数据,因此这里进行了encode和decode的操作。

Renpy脚本

下面构建Renpy的SEO靠我脚本,设定三个状态:

status = 1:该状态等待用户输入status = 2:该状态等待后台处理,等待status = 3:该状态渲染返回的信息,并播放语音

完整脚本

define e = CharaSEO靠我cter("派蒙") define config.gl2 = True image e = Live2D("paimeng", top=0.2, base=0.9, hSEO靠我eight=0.7, loop=True, seamless=True, _live2d_fade=True) define u = Character("User")label stSEO靠我art:python:r = ""jump chatlabel chat:scene 1show e 身体不太舒服python:import socketimport threadingi = 0stSEO靠我atus = 1global statusif status == 1:your_text = renpy.input(,length=100)prompt = str(your_text)def sSEO靠我end_txt():s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect((127.0.0.1, 12345))s.send(pSEO靠我rompt.encode())s.recv(1024).decode()status = 2thread = threading.Thread(target=send_txt())thread.staSEO靠我rt()if (status == 2):show e 派蒙一直支持着你哦python:s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.cSEO靠我onnect((127.0.0.1, 12345))s.send(发送空串用于占位.encode())r = s.recv(1024).decode()status = 3if (status == SEO靠我3):show e 知道你要说什么 吃到好吃的 陪你旅行到现在 这么说来你就是我的妹妹了 派蒙一直支持着你哦 难道你在外面还有其他的应急食品吗 嗯 知道你要说什么 吃到好吃的 咕嘟咕嘟 好无聊voicSEO靠我e "audio/output.ogg"e "[r]"voice sustainjump chat

注:这里的show e 后面的内容为live2d中的动作,输入多个动作后,将按顺序进行播放。

GPT3.SEO靠我5

ChatGPT名噪一时,目前,GPT4都出现了,但目前Api仍未完全开放,因此本项目仍使用GPT3.5这个接口。下面是个调用的测试用例:

import json import openSEO靠我aidef ask_gpt(msg):openai.api_key = 自己的keycompletion = openai.ChatCompletion.create(model="gpt-3.5-tSEO靠我urbo",messages=[{"role": "user", "content": msg}])result = json.loads(str(completion.choices[0].messSEO靠我age))return result[content]if __name__ == __main__:answer = ask_gpt("你好,你是谁啊")print(answer)

openai.apSEO靠我i_key修改为自己的key。

项目使用

克隆项目 git clone https://github.com/zstar1003/DigitalLife 安装依赖 SEO靠我 pip install -r requirements.txt

下载模型

下载派蒙的vits模型,放置在model文件夹下,重命名为Paimon.pth

下载连接:https://pan.baidSEO靠我u.com/s/1aF6Q_rA5tBQv7YaU0jizuA?pwd=bya7

运行test_gpt.py,测试gpt3.5是否可用。

运行main.py,开启服务端,持续监听。

打开renpy/PaimSEO靠我on.exe,选择开始游戏,即可和派蒙对话了。

参考

本项目参考或使用了以下开源项目或模型:

[1] Vits派蒙模型:https://www.bilibili.com/video/BV16G4y1B7EySEO靠我

[2] live2d派蒙模型:https://www.bilibili.com/video/BV1pA411j78k

[3] live2d-chatgpt-vits:https://github.comSEO靠我/balmung08/live2d-chatgpt-vits
“SEO靠我”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与 我们联系删除或处理,客服邮箱:html5sh@163.com,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同 其观点或证实其内容的真实性。

网站备案号:浙ICP备17034767号-2