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

前言

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

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

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

我要给派蒙完整的一生

项目开源地址:https://github.com/zstar1003/DigitalLife

Renpy

Ren’Py是一个视觉小说引擎,可以使用文字、图像和声音讲述在计算机和移动设备上运行的交互式故事。
Renpy的中文官方文档:https://www.renpy.org/doc/html/

Renpy嵌入Live2d

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

Renpy提供了Live2d的相关接口:

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

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

Socket通讯

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

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

下面是一个socket的简单实例:
首先构建服务端,服务端通常需要使用一个循环来持续监听请求:

# 服务端
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 12313))
s.listen(5)
print("已启动,等待连接中")

while True:
    sock, addr = s.accept()
    client_data = sock.recv(400000)
    print(client_data.decode())
    sock.send('你好'.encode())

这里服务端绑定了一个本地ip'127.0.0.1'和端口号12313

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

# 客户端
import socket

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

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

Renpy脚本

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

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

完整脚本

define e = Character("派蒙")
define config.gl2 = True
image e = Live2D("paimeng", top=0.2, base=0.9, height=0.7, loop=True, seamless=True, _live2d_fade=True)
define u = Character("User")

label start:
    python:
        r = ""
    jump chat

label chat:
    scene 1
    show e 身体不太舒服
    python:
        import socket
        import threading
        i = 0
        status = 1
        global status
        if status == 1:
            your_text = renpy.input('',length=100)
        prompt = str(your_text)
        def send_txt():
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect(('127.0.0.1', 12345))
            s.send(prompt.encode())
            s.recv(1024).decode()
            status = 2
        thread = threading.Thread(target=send_txt())
        thread.start()
    if (status == 2):
        show e 派蒙一直支持着你哦
        python:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect(('127.0.0.1', 12345))
            s.send('发送空串用于占位'.encode())
            r = s.recv(1024).decode()
            status = 3
    if (status == 3):
        show e 知道你要说什么 吃到好吃的 陪你旅行到现在 这么说来你就是我的妹妹了 派蒙一直支持着你哦 难道你在外面还有其他的应急食品吗 嗯 知道你要说什么 吃到好吃的 咕嘟咕嘟 好无聊
        voice "audio/output.ogg"
        e "[r]"
        voice sustain
        jump chat

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

GPT3.5

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

import json
import openai


def ask_gpt(msg):
    openai.api_key = '自己的key'
    completion = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "user", "content": msg}
        ]
    )
    result = json.loads(str(completion.choices[0].message))
    return result['content']


if __name__ == '__main__':
    answer = ask_gpt("你好,你是谁啊")
    print(answer)

openai.api_key修改为自己的key。

项目使用

  1. 克隆项目
git clone https://github.com/zstar1003/DigitalLife
  1. 安装依赖
pip install -r requirements.txt
  1. 下载模型
    下载派蒙的vits模型,放置在model文件夹下,重命名为Paimon.pth
    下载连接:https://pan.baidu.com/s/1aF6Q_rA5tBQv7YaU0jizuA?pwd=bya7

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

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

  4. 打开renpy/Paimon.exe,选择开始游戏,即可和派蒙对话了。

参考

本项目参考或使用了以下开源项目或模型:
[1] Vits派蒙模型:https://www.bilibili.com/video/BV16G4y1B7Ey
[2] live2d派蒙模型:https://www.bilibili.com/video/BV1pA411j78k
[3] live2d-chatgpt-vits:https://github.com/balmung08/live2d-chatgpt-vits

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud学习笔记【服务注册与发现-Eureka】

文章目录什么是服务治理什么是服务注册与发现Eureka两组件Eureka搭建搭建单机Eureka ServerEureka客户端注册user服务user服务单点测试搭建集群Eureka Server集群启动测试子服务集群搭建服务调用和负载均衡测试效果什么是服务治理 服务治理是一种管理和控制分布式系统中各个服…

基于51单片机的智能计算器Protues仿真设计

目录 一、设计背景 二、实现功能 三、硬件设计 3.1 总体硬件设计 ​3.2 键盘电路的设计 3.3 显示电路的设计 四、仿真演示 五、源程序 一、设计背景 随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发展&am…

【数据结构】基础知识总结

系列综述: 💞目的:本系列是个人整理为了数据结构复习用的,由于牛客刷题发现数据结构方面和王道数据结构的题目非常像,甚至很多都是王道中的,所以将基础知识进行了整理,后续会将牛客刷题的错题一…

大数据技术之Sqoop——SQL to Hadoop

一、简介sqoop (sql to hadoop)是一款开源的工具,主要用于在 Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MSQL,Oracle,Post…

Unity脚本练习

在C# 中 class 是创建类的标志,要创建类的话得现有class上面这个的逻辑是 类的访问权限, 关键字,类名以及类继承的父类在Unity中创建一个脚本或者添加一个组件,就相当于在Unity命名空间中创建了一个可以访问的类。这些类能够直接在…

2023秋招前端面试必会的面试题

浏览器存储 我们经常需要对业务中的一些数据进行存储,通常可以分为 短暂性存储 和 持久性储存。 短暂性的时候,我们只需要将数据存在内存中,只在运行时可用持久性存储,可以分为 浏览器端 与 服务器端 浏览器: cookie: 通常用于存储…

springboot健身房管理系统

springboot健身房管理系统 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍&#xf…

Vue 3.0 单文件组件 【Vue3 从零开始】

#介绍 在很多 Vue 项目中,我们使用 app.component 来定义全局组件,紧接着用 app.mount(#app) 在每个页面内指定一个容器元素。 这种方式在很多中小规模的项目中运作的很好,在这些项目里 JavaScript 只被用来加强特定的视图。但当在更复杂的…

HTTP 3.0来了,UDP取代TCP成为基础协议,TCP究竟输在哪里?

TCP 是 Internet 上使用和部署最广泛的协议之一,多年来一直被视为网络基石,随着HTTP/3正式被标准化,QUIC协议成功“上位”,UDP“取代”TCP成为基础协议,TCP究竟“输”在哪里? HTTP/3 采用了谷歌多年探索的基…

< CSS小技巧:那些不常用,却很惊艳的CSS属性 >

文章目录👉 前言👉 一. background-clip: text - 限制背景显示(裁剪)👉 二. user-select - 控制用户能否选中文本👉 三. :focus-within 伪类👉 四. gap - 网格 / 弹性布局间隔设置👉…

【C++笔试强训】第三十一天

🎇C笔试强训 博客主页:一起去看日落吗分享博主的C刷题日常,大家一起学习博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话:夜色难免微凉,前方必有曙光 🌞。 选择题 &#x…

Golang每日一练(leetDay0005)

目录 13. 罗马数字转整数 Roman to Integer ★ 14. 最长公共前缀 Longest Common Prefix ★ 15. 三数之和 3Sum ★★★ 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 13. 罗马数字转…

我从功能测试到python接口自动化测试涨到22k,谁知道我经历了什么......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 常见的接口&#xf…

C++高并发内存池的设计和实现

一、整体设计 1、需求分析 池化技术是计算机中的一种设计模式,内存池是常见的池化技术之一,它能够有效的提高内存的申请和释放效率以及内存碎片等问题,但是传统的内存池也存在一定的缺陷,高并发内存池相对于普通的内存池它有自己…

卷王都在偷偷准备金三银四了...

年终奖没发; 简历石沉大海; 发消息只读不回 打开某招聘,看了看岗位,这个厂还不错,可是要求好高,我啥都不会。 “哎,算了,我简历还没更新呢,我躺到6月份拿到年终奖再跑…

3-1 SpringCloud快速开发入门: Ribbon 是什么

接上一章节Eureka 服务注册中心自我保护机制,这里讲讲Ribbon 是什么 Ribbon 是什么 通常说的负载均衡是指将一个请求均匀地分摊到不同的节点单元上执行,负载均和分为硬件负载均衡和软件负载均衡: **硬件负载均衡:**比如 F5、深信…

记第一次面试的过程(C++)

说实话三月份上旬过得很充实,而且感觉蛮值,但还有不足的地方,今晚特地看完资料分析来复盘复盘。 时间还要回到3.2中午13.35(别问我为什么那么准确,刚刚掏手机看的),我正在吃着饭看着王者荣耀的直…

STL sort 分析

前言 STL 中提供了很多算法,sort 是我们经常使用的,那它究竟是如何实现的呢? STL 的 sort 算法,数据量大时采用快速排序,分段递归。一旦分段的数据量小于某个门槛,为避免快速排序的递归调用带来过大的额外…

三天吃透计算机网络面试八股文

本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址:https://github.com/…

Linux常用命令

个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。个人主页:小李会科技的…