GPT Demo 分享|日不落直播间接入虚拟人AI互动

摘要

虚拟人和数字人是人工智能技术在现实生活中的具体应用,它们可以为人们的生活和工作带来便利和创新。在直播间场景里,虚拟人和数字人可用于直播主播、智能客服、营销推广等。接入GPT的虚拟人像是加了超强buff,具备更强大的自然语言处理能力和智能对话能力,可以实现更加智能化、自然化的人机交互。

  • 直播主播:虚拟人可以作为直播间的主播角色,通过与粉丝的对话和互动,提高粉丝的互动效果和兴趣
  • 代替客服:数字人可以作为客服角色,通通过自然语言处理和智能对话,解决客户的问题,并提高客户满意度。
  • 营销推广:虚拟人可以作为品牌形象进行推广,数字人可以通过客观数据进行精准营销,提高粉丝的黏性和忠诚度。

前言

续上一篇文章《「GPT实战」GPT接入直播间实现虚拟人互动》 ,我们实现了ChatGPT与ZIM的对接。使得加入聊天群组就相当于加入了直播间,实时与ChatGPT文字互动。但还缺了点什么:直播间可不是只有文字,还有主播!接下来进入本文主题:如何接入虚拟人直播。

虚拟主播我们可以通过即构Avatar进行个人化定制,之前在他们《官网》体验过Avatar Demo,一键可以打造多元化风格,支持Q版、二次元、动漫、拟人等多种风格,即构自研虚拟形象引擎强大AI驱动能力,四种驱动方式:表情驱动、声音驱动、文本驱动、肢体驱动。根据本期Demo需求定制了拟人版本的主播小姐姐。即构AvatarQ版形象软萌可爱含丰富的服饰和妆容素材库,推荐大家去体验。即构Avatar的文本驱动方式刚好符合咱们的业务需求。

微信图片_20230529131522.png

1 加入ZIM房间,实时收发消息

加入ZIM房间跟上一篇文章介绍的nodejs版原理一致:

  1. 先登录ZIM
  2. 加入房间或创建房间
  3. 发送弹幕
  4. 监听房间消息,如果来自ChatGPT则朗读

1.1 创建ZIM对象

首先引入ZIM库后,可以调用ZIM的create函数创建ZIM对象,然后调用ZIM对象的setEventHandler函数,将ZIMEventHandler对象传入。ZIMEventHandler主要用于处理一些回调事件如用户上线等回调事件。

public class ZIMMngr {/*** 创建ZIM对象*/private ZIM createZIM(Application app, ZIMEventHandler handler) {// 创建 ZIM 对象,传入 APPID 与 Android 中的 ApplicationZIM zim = ZIM.create(KeyCenter.APP_ID, app);zim.setEventHandler(handler);return zim;}//其他代码略...
}

1.2 群聊-登录、创建房间、加入房间

登录即构服务首选需要token,生成token算法在附件源码已经给出,直接调用即可。但是需要注意,在这个Demo中直接在客户端上生成了,这是非常危险的操作,因为你的密钥和appid暴露出来了,黑客可以通过密钥和appid蹭你的额度费用。因此,建议把token计算放在服务器端生成。

ZIM的createRoom函数用于创建房间,需要提供房间号;joinRoom函数用于加入房间,同样也需要提供房间号。具体代码如下所示:

public class ZIMMngr {//其他代码略..../*** 登录zim*/public void login(String userId, CB cb) {String token = ZIMMngr.getToken(userId);ZIMMngr.login(zim, token, userId, new ZIMLoggedInCallback() {@Overridepublic void onLoggedIn(ZIMError errorInfo) {if (errorInfo.getCode() != ZIMErrorCode.SUCCESS) {Log.e(TAG, "login error:" + errorInfo.getMessage());cb.complete(false, "登录失败");} else {cb.complete(true, null);}}});}/*** 加入房间*/public void joinRoom(String roomId, CB cb) {zim.joinRoom(roomId, new ZIMRoomJoinedCallback() {@Overridepublic void onRoomJoined(ZIMRoomFullInfo roomInfo, ZIMError errorInfo) {Log.e(TAG, ">>" + errorInfo.code);if (errorInfo.code == ZIMErrorCode.ROOM_DOES_NOT_EXIST) {cb.complete(false, "房间不存在!");} else if (errorInfo.code == ZIMErrorCode.SUCCESS || errorInfo.code == ZIMErrorCode.THE_ROOM_ALREADY_EXISTS) {cb.complete(true, roomInfo.baseInfo.roomName);}}});}/*** 创建房间*/public void createRoom(String masterId, String roomId, String roomName, CB cb) {ZIMRoomInfo groupInfo = new ZIMRoomInfo();groupInfo.roomID = roomId;groupInfo.roomName = roomName;zim.createRoom(groupInfo, new ZIMRoomCreatedCallback() {@Overridepublic void onRoomCreated(ZIMRoomFullInfo roomInfo, ZIMError errorInfo) {if (errorInfo.code == ZIMErrorCode.SUCCESS) {inviteJoinRoom(masterId, roomId, CHATGPT_ID, cb);//这里把chagpt的用户id硬编码} else {Log.e(TAG, "创建房间失败:" + errorInfo.message);cb.complete(false, "房号已存在,请更换一个房间号!");}}});}
}

1.3 即时通讯实现收发消息

接下来实现消息收发,主动发送消息与监听接收消息。注意,这里因为我们只关注弹幕消息,因此非弹幕消息过滤。发送消息封装两类:

  • P2P
  • ROOM

注意,因为我们这里只用弹幕消息,因此ROOM消息只表示弹幕消息。

public class ZIMMngr {//定义属性略..../*** 收到房间消息*/private void onRcvMsg(ArrayList<ZIMMessage> messageList) {if (mListener == null) return;for (ZIMMessage zimMessage : messageList) {if (zimMessage instanceof ZIMBarrageMessage) {//只看弹幕消息ZIMBarrageMessage zimTextMessage = (ZIMBarrageMessage) zimMessage;if (zimMessage.getTimestamp() < this.startTime)continue;String fromUID = zimTextMessage.getSenderUserID();ZIMConversationType ztype = zimTextMessage.getConversationType();String toUID = zimTextMessage.getConversationID();Msg.MsgType type = Msg.MsgType.P2P; String data = zimTextMessage.message; Msg msg = Msg.parseMsg(data, fromUID, toUID, ztype == ZIMConversationType.ROOM);mListener.onRcvMsg(msg);}}} /*** 发送zim消息* */public void sendMsg(Msg msg, CB cb) {//p2p消息则发送Text,room发送弹幕类型消息ZIMMessage zimMsg = null;ZIMConversationType type;if (msg.type == Msg.MsgType.P2P) {ZIMTextMessage m = new ZIMTextMessage();m.message = msg.msg;zimMsg = m;type = ZIMConversationType.PEER;} else {ZIMBarrageMessage m = new ZIMBarrageMessage();m.message = msg.msg;zimMsg = m;type = ZIMConversationType.ROOM;}ZIMMessageSendConfig config = new ZIMMessageSendConfig();// 消息优先级,取值为 低:1 默认,中:2,高:3config.priority = ZIMMessagePriority.LOW;// 设置消息的离线推送配置ZIMPushConfig pushConfig = new ZIMPushConfig();pushConfig.title = "离线推送的标题";pushConfig.content = "离线推送的内容";config.pushConfig = pushConfig; zim.sendMessage(zimMsg, msg.toUID, type, config, new ZIMMessageSentCallback() {@Overridepublic void onMessageAttached(ZIMMessage message) {} @Overridepublic void onMessageSent(ZIMMessage message, ZIMError errorInfo) { cb.complete(errorInfo.code == ZIMErrorCode.SUCCESS, errorInfo.message); }}); }  // 其他代码略....
}

上面代码只挑选了关键函数, 更多关于即构ZIM接口与官方Demo可以点击参考这里,或者参考附录源码。

2 创建虚拟形象-即构Avatar

接下来需要创建虚拟形象,读者可以参考官方文档获取更多详细信息。

需要注意的是,通过官方封装的ZegoCharacterHelper可以非常简单的创建Avatar。创建虚拟形象封装到setCharacter函数中,在程序初始化期间,需要执行initRes函数,将资源拷贝到SDCard。作为演示,这里是将Assets里面的相关资源拷贝到SDCard。在实际项目中,建议将资源存放在服务器端,通过离线下载的方式存储到SDCard。这样既可以降低安装包的大小,也更灵活。

public class AvatarMngr implements ZegoAvatarServiceDelegate {//属性定义略.... /*** 设置虚拟形象如衣服、头发、性别等*/private void setCharacter(User user) {  // 创建 helper 简化调用// base.bundle 是头模, human.bundle 是全身人模mCharacterHelper = new ZegoCharacterHelper(FileUtils.getPhonePath(mApp, "human.bundle", "assets"));mCharacterHelper.setExtendPackagePath(FileUtils.getPhonePath(mApp, "Packages", "assets"));// 设置形象配置mCharacterHelper.setDefaultAvatar(ZegoCharacterHelper.MODEL_ID_FEMALE);// 角色上屏, 必须在 UI 线程, 必须设置过avatar形象后才可调用(用 setDefaultAvatar 或者 setAvatarJson 都可以)mCharacterHelper.setCharacterView(user.avatarView, () -> {});mCharacterHelper.setViewport(ZegoAvatarViewState.half);mCharacterHelper.setPackage("ZEGO_Girl_Hair_0001");mCharacterHelper.setPackage("ZEGO_Girl_Tshirt_0001_0002");mCharacterHelper.setPackage("facepaint5");mCharacterHelper.setPackage("irises2");  updateUser(user);  }   private void initRes(Application app) {// 先把资源拷贝到SD卡,注意:线上使用时,需要做一下判断,避免多次拷贝。资源也可以做成从网络下载。if (!FileUtils.checkFile(app, "AIModel.bundle", "assets"))FileUtils.copyAssetsDir2Phone(app, "AIModel.bundle", "assets");if (!FileUtils.checkFile(app, "base.bundle", "assets"))FileUtils.copyAssetsDir2Phone(app, "base.bundle", "assets");if (!FileUtils.checkFile(app, "human.bundle", "assets"))FileUtils.copyAssetsDir2Phone(app, "human.bundle", "assets");if (!FileUtils.checkFile(app, "Packages", "assets"))FileUtils.copyAssetsDir2Phone(app, "Packages", "assets");}//...//其他代码略....//...
}

除了衣服、首饰、发型等"装饰类"形象定义,还可以捏脸,这里不详细描述,建议读者前往官网查看。即构Avatar官网。

4 直播间虚拟人与粉丝互动聊天

创建完虚拟人后,接下来将收到的ChatGPT消息朗读出来,使虚拟主播嘴巴动起来,互动玩法更好。首先执行initTextApi函数,初始化本地文字驱动引擎。接下来就可以调用ZegoTextAPI的playTextExpression函数,驱动虚拟人语音播报文字内容。

/*** 朗读文字(嘴唇+语音)
*/
public void playText(String text) {if (mTextApi == null) return;mTextApi.playTextExpression(text);Log.e(TAG, ">>>>已播放" + text);
}
/*** 初始化文本驱动接口
*/
private void initTextApi() {mTextApi = new ZegoTextAPI(mCharacterHelper.getCharacter());mTextApi.setTextExpressionCallback(new ITextExpressionCallback() {/*** 文本驱动播放启动时,回调*/@Overridepublic void onStart() {Log.d(TAG, "text drive start");}/*** 文本驱动播放出错时,回调* @param errorCode 错误码,详情请参考 [常见错误码 - 文本驱动](https://doc-zh.zego.im/article/14884#2)。*/@Overridepublic void onError(int errorCode, String msg) {}/*** 文本驱动播放结束时,回调*/@Overridepublic void onEnd() {Log.d(TAG, "text drive end");}});
}

文本驱动部分代码比较简单,也反映了官方对这块封装的比较好。播报文字主要借助即构avatar的文本能力,读者可以查看官方文档描述:官方文档。仔细阅读可以发现,关键核心代码非常少,附件里面的其他代码主要是开发App非核心代码。

本文演示了从0开发、无须服务端开发完成的基于ChatGPT的虚拟人直播,任何人下载该App即可加入直播间。一些小伙伴可能并不需要开发一个虚拟人直播平台,而是想着在抖音、快手、视频号等平台实现虚拟人直播。这里提供一个实现思路:

  1. 复用本文代码,可以实现ChatGPT回复、并将回复的文字驱动虚拟人
  2. 使用直播伴侣等工具录制虚拟人,推流到抖音平台
  3. 去github找开源工具,实时爬取直播间的弹幕
  4. 读取到弹幕后,调用ChatGPT得到回复,再回到第1步。

未来想象方面,虚拟人接入GPT可以实现更加智能化、个性化的服务,可以预见的是,未来的虚拟人将更加人性化,通过情感计算等技术,可以实现更加真实、自然的人机交互。虚拟人还可以与物理机器人结合,成为未来的机器人助手,为人们的生活和工作提供更加便利的服务。

5 Github源码

供一个实现思路:

  1. 复用本文代码,可以实现ChatGPT回复、并将回复的文字驱动虚拟人
  2. 使用直播伴侣等工具录制虚拟人,推流到抖音平台
  3. 去github找开源工具,实时爬取直播间的弹幕
  4. 读取到弹幕后,调用ChatGPT得到回复,再回到第1步。

未来想象方面,虚拟人接入GPT可以实现更加智能化、个性化的服务,可以预见的是,未来的虚拟人将更加人性化,通过情感计算等技术,可以实现更加真实、自然的人机交互。虚拟人还可以与物理机器人结合,成为未来的机器人助手,为人们的生活和工作提供更加便利的服务。

5 Github源码

  1. ChatGPT虚拟直播源码

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

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

相关文章

虚拟数字人成短视频/直播主阵地,虚拟人提升数字内容生产效率

由于短视频在传播便携性、功能性和交互性等多个方面的优势&#xff0c;短视频已逐渐成为现代社会情感表达和信息传播的重要载体。尤其随着移动互联网的普及和碎片化信息迅捷传播需求的高涨&#xff0c;各行各业的内容创作者纷纷涌入视频内容赛道&#xff0c;短视频成为了许多企…

AI数字人主播营销崛起,李佳琦还能继续保持领先地位吗?

“你们能想象我们的客户1万多平方米办公室只剩下几千个数字人在通宵直播吗&#xff1f;一个晚上赚几百万&#xff0c;基本上成本一晚上就赚回来了。”这是一名网友对数字人的发言。 随着今年ChatGPT掀起的人工智能大模型热潮&#xff0c;数字人又迎来一轮更加磅礴的爆发&#…

chatgpt赋能python:Python并行线程介绍:提高程序运行效率

Python并行线程介绍&#xff1a;提高程序运行效率 概述 随着计算机硬件的发展&#xff0c;越来越多的应用需要充分利用计算机的资源来提高程序运行效率。并行计算通过同时使用多个计算资源&#xff08;如CPU或GPU&#xff09;来加速计算过程。Python语言作为一种高效、易读易…

上市公司高管CEO员工数据大全 1991-2021年上市公司高管CEO教育背景学历结构薪酬职务任期年龄出生地 员工学历结构人员结构

&#xff08;1&#xff09;上市公司高管教育背景、学历结构&#xff0c;且含有多份不同来源的100多万数据集&#xff1b;包含 简历、出生地、年龄、教育背景、学历结构、薪酬、职务、股权期权等 &#xff08;2&#xff09;上市公司CEO教育背景、学历结构数据集&#xff0c;包含…

2004-2020中小企业板上市公司财务报表股票交易董事高管等面板数据

1200变量&#xff01;中小企业板上市公司面板数据大全 2004-2020年 1、时间&#xff1a;2004-2020年 2、数据范围&#xff1a;共计973家上市公司 3、数据指标&#xff1a;包括财务报表、股票交易、董事高管等1200变量 4、用途&#xff1a;进行上市公司高管股权激励与公司绩…

【AI实战】快速搭建中文 Alpaca 33B 大模型 Chinese-Alpaca-33B

【AI实战】快速搭建中文 Alpaca 33B 大模型 Chinese-Alpaca-33B 中文 33B 大模型 Chinese-Alpaca-33B环境配置搭建过程1.拉取 chinese-alpaca-lora-33b2.合并lora权重3.llaa.cpp量化模型准备模型权重转换为ggml的FP16格式对FP16模型进行4-bit量化 测试参考 中文 33B 大模型 Chi…

OpenAI的人工智能语音识别模型Whisper详解及使用

1 whisper介绍 拥有ChatGPT语言模型的OpenAI公司&#xff0c;开源了 Whisper 自动语音识别系统&#xff0c;OpenAI 强调 Whisper 的语音识别能力已达到人类水准。 Whisper是一个通用的语音识别模型&#xff0c;它使用了大量的多语言和多任务的监督数据来训练&#xff0c;能够在…

Mixlab助力生态伙伴:ChatGPT火种节,开始报名了

10年推动100万大学生创业 ChatGPT火种节 是什么&#xff1f; ChatGPT火种节是校园VC与清华x-lab主办的创客马拉松活动。目的是挖掘AI大语言模型相关的早期项目&#xff0c;激活清华周边的人工智能创业者社群&#xff0c;活跃北京中关村的高校数字创业生态。 火种节将用48小时&a…

如何更好地蒸馏ChatGPT模型能力:Lion闭源大型语言模型的对抗性蒸馏模型原理及实验工作介绍...

来自&#xff1a;老刘说NLP 进NLP群—>加入NLP交流群 如何将ChatGPT的能力蒸馏到另一个大模型&#xff0c;是当前许多大模型研发的研发范式。当前许多模型都是采用chatgpt来生成微调数据&#xff0c;如self instruct&#xff0c;然后加以微调&#xff0c;这其实也是一种数据…

ChatGPT提示词工程师教程-摘要

我觉得这一期的内容比较划水&#xff0c;实际上还是上一期“迭代”的内容&#xff0c;只是将迭代的内容更具体地落到“摘要”这个功能上。 实际应用&#xff1a;可以对网站上大量的用户评论进行摘要&#xff0c;生成一个面板&#xff0c;可以通过点击摘要看具体的评论。

爆火的Auto-GPT:实战及运行体验

Auto-GPT可以说是目前AI应用方向最火爆的项目了&#xff0c;自从3月份上线以来&#xff0c;一个月疯狂拦下将近7万star&#xff08;截至本文写稿时69.5k&#xff09;。它的目的是探索诸如GPT-4这样的大语言模型自主完成任务的能力。业界也有一些大佬出来表示这个项目真的很有趣…

把你的阿里巴巴图标库转成你自己的@ant-design/icons

背景 我们使用iconfont-阿里巴巴矢量图标库来管理自己的一套图标&#xff0c;并且基于它的js资源&#xff0c;封装了自己的icons图标组件。封装的方法是使用了antd提供的createFromIconfontCN方法 但随着图标库越来越大&#xff0c;JS资源文件也变得越来越大。在业务中&#x…

智能设计-阿里巴巴Banner设计

阿里巴巴Banner设计的核心在于优化会场页面拓展及Banner尺寸拓展两部分低水平重复建设工作&#xff0c;提升设计效率&#xff0c;压缩设计周期&#xff0c;为设计师保留充裕的创意时间。 色彩转移与页面拓展设计 分会场设计工作大致分为&#xff1a;色彩拓展、产品组合设计、…

阿里 ChatUI 开源:让对话美而简单

作者 | 孙辉 背景 对话式交互一直存在于我们的日常生活中&#xff0c;工作时使用的钉钉&#xff0c;联系朋友使用的微信&#xff0c;都属于对话式交互应用。 随着技术的发展&#xff0c;我们正在经历从「移动互联网时代」走向「人工智能时代」的过程中&#xff0c;人工智能扩大…

Prompt Engineering | 文本转换prompt

LLM非常擅长将输入转换成不同的格式&#xff0c;例如多语种文本翻译、拼写及语法纠正、语气调整、格式转换等。 文章目录 1、文本翻译1.1、中文转西班牙语1.2、识别语种1.3、多语种翻译1.4、翻译正式语气1.4、通用翻译器 2、语气 / 风格调整3、格式转换4、拼写及语法纠正5、一个…

vue3 实现 chatgpt 的打字机效果

在做 chatgpt 镜像站的时候&#xff0c;发现有些镜像站是没做打字机的光标效果的&#xff0c;就只是文字输出&#xff0c;是他们不想做吗&#xff1f;反正我想做。于是我仔细研究了一下&#xff0c;实现了打字机效果加光标的效果&#xff0c;现在分享一下我的解决方案以及效果图…

Haproxy--高可用代理

一、haproxy简介 软件&#xff1a;haproxy---主要是做负载均衡的七层&#xff0c;也可以做四层负载均衡。 负载均衡是通过OSI协议对应的。 7层负载均衡&#xff1a;用的是7层http协议&#xff1b; 4层负载均衡&#xff1a;用的是tcp协议加端口号做的负载均衡。 ha-proxy概…

2021-03-11

idea创建mybatis的maven项目 用idea创建Maven Web项目 添加依赖 创建编写实体类 创建持久层接口 创建SqlMapConfing.xml

mybatis初学

创建一个mybatis的maven项目 环境&#xff1a;IDEA19.3.3&#xff0b;jdk1.8mysq 新建maven项目 项目名字 maven 大体框架 导包&#xff08;要在pom.xml中dependencies标签里面&#xff09; 2 <!-- mybatis核心包 -->3 <dependency>4 <…

2021-03-21

MyBatis-Plus创建 创建数据库 -- 创建测试表 CREATE TABLE tb_user ( id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键ID, user_name varchar(20) NOT NULL COMMENT 用户名, password varchar(20) NOT NULL COMMENT 密码, name varchar(30) DEFAULT NULL COMMENT 姓名, …