前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数字生命计划:我要给派蒙完整的一生

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

作者头像
zstar
发布2023-03-16 15:32:15
1.1K0
发布2023-03-16 15:32:15
举报
文章被收录于专栏:往期博文往期博文

前言

看完流浪地球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的相关接口:

代码语言:javascript
复制
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的简单实例: 首先构建服务端,服务端通常需要使用一个循环来持续监听请求:

代码语言:javascript
复制
# 服务端
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和端口发送请求,才能够建立连接,下面是客户端的示例:

代码语言:javascript
复制
# 客户端
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:该状态渲染返回的信息,并播放语音

完整脚本

代码语言:javascript
复制
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这个接口。下面是个调用的测试用例:

代码语言:javascript
复制
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. 克隆项目
代码语言:javascript
复制
git clone https://github.com/zstar1003/DigitalLife
  1. 安装依赖
代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • Renpy
    • Renpy嵌入Live2d
      • Socket通讯
        • Renpy脚本
        • GPT3.5
        • 项目使用
        • 参考
        相关产品与服务
        NLP 服务
        NLP 服务(Natural Language Process,NLP)深度整合了腾讯内部的 NLP 技术,提供多项智能文本处理和文本生成能力,包括词法分析、相似词召回、词相似度、句子相似度、文本润色、句子纠错、文本补全、句子生成等。满足各行业的文本智能需求。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档