GPT虚拟直播Demo系列(二)|无人直播间实现虚拟人回复粉丝

摘要

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

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

前言

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

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

在这里插入图片描述

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/18826.html

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

相关文章

今晚 12:30 RLHF: From Zero to ChatGPT 直播活动

本次演讲&#xff0c;我们将介绍一种称之为从人类反馈中强化学习 (RLHF, Reinforcement Learning from Human Feedback) 的基础知识&#xff0c;以及如何使用 RLHF 驱动实现 ChatGPT 这样的工具。我们将为大家介绍相关联的机器学习模型&#xff0c;涵盖自然语言处理 (NLP) 和强…

2-24财财的财经早报!

早评0224&#xff1a;震荡依旧 【市场判断】 外围方面&#xff0c;美股三大指数收涨&#xff0c;道指涨0.33%&#xff0c;纳指涨0.72%&#xff0c;标普涨0.53%。消息面上,美联储官员在会议纪要中重申了其强硬的立场——与会者都同意在通胀得到实质控制之前继续加息步伐。芝商所…

一个90后关于ZG足球的思考【卡塔尔世界杯】

前言 一个月的时间过得还是非常快的&#xff0c;卡塔尔世界杯马上也要迎来半决赛和决赛。自己一直想动手写写自己关于足球的思考&#xff0c;特别是ZG足球&#xff0c;说得再准确一点&#xff0c;就是ZG男足。 正文 第一次认识足球运动 作为一名90后&#xff0c;自己开始认…

数据可视化之中国足球队在国际足联及亚洲的历史排名看这儿

最近最热的体育盛事莫过于世界杯了&#xff0c;四年一届的足球盛事&#xff0c;正在卡塔尔激战正酣。这时候可能会有球迷疑问&#xff1a;怎么没看到中国队呢&#xff1f;也有网友调侃说中国队被分到工程队去了。 泱泱大国&#xff0c;难道中国十几亿人口&#xff0c;一个足球队…

【花雕学AI】我们如何才能避免被ChatGPT替代?——一个跨学科的视角

ChatGPT是一个由OpenAI开发的AI文本工具&#xff0c;它可以理解和生成自然语言&#xff0c;从而与用户进行对话。ChatGPT是基于GPT-3或者GPT-4模型的&#xff0c;这是目前最大和最先进的语言模型之一。ChatGPT通过在大量的互联网文本数据上进行预训练和强化学习&#xff0c;学习…

开箱即用,ChatGPT 复现方案开源

点击上方“Java基基”&#xff0c;选择“设为星标” 做积极的人&#xff0c;而不是积极废人&#xff01; 每天 14:00 更新文章&#xff0c;每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路&#xff0c;很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应…

【ChatGPT】ColossalChat:目前最接近 ChatGPT 原始技术方案的实用开源项目——以 LLaMA 为基础预训练模型,推出 ColossalChat

ColossalChat:Making large AI models cheaper, faster and more accessible www.colossalai.org GitHub - hpcaitech/ColossalAI: Making large AI models cheaper, faster and more accessible 目录 Col

【hadoop】完全分布式集群部署

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、准备好三台虚拟机1.创建虚拟机2.配置网卡3.配置JDK和HADOOP4.修改主机名 二、修改ip、映射1.修改ip2.修改映射 三、设置免密登录四、关闭防火墙五、配置had…

体验本地部署AI绘画程序

目录 前言 一、AI绘画是什么&#xff1f; 二、Stable Diffusion简介 二、部署步骤 1.克隆代码 2.部署环境 3. 安装 4 一些错误提示的排除 总结 前言 随着人工智能的不断发展&#xff0c;尤其是chatGPT的成熟&#xff0c;AI绘画也获得了热捧&#xff0c;甚至AI画的太空歌…

chatgpt赋能python:Python单机游戏:让你爱不释手的趣味游戏

Python单机游戏&#xff1a;让你爱不释手的趣味游戏 在当今数码化的世界中&#xff0c;单机游戏越来越受欢迎。作为一名有10年Python编程经验的工程师&#xff0c;我想向大家介绍Python单机游戏&#xff0c;这是一种让你爱不释手的趣味游戏。 什么是Python单机游戏&#xff1…

生成式语言大模型压缩技术思考——以ChatGPT为例

ChatGPT引领了生成式语言大模型的应用与技术热潮&#xff0c;首先简单回顾ChatGPT应用范式&#xff1a;将其应用于指定的下游任务时&#xff08;如知识问答、翻译、编码&#xff09;&#xff0c;ChatGPT需要经历三个阶段的训练&#xff08;增强人类语境的猜想&#xff09;&…

我,一名记者,面对ChatGPT慌得一比

出品&#xff5c;网易科技《智见焦点》 作者&#xff5c;赵芙瑶 编辑&#xff5c;丁广胜 人工智能诞生初期&#xff0c;由于技术的不成熟经常被戏谑为“人工智障”&#xff0c;当AI刚刚涉及内容创作领域时&#xff0c;人们也总有“机器缺乏情感”、“语言过于生硬”的刻板印象。…

我(程序大学生)与AI

我与AI的接触历程及感想 首次接触AI 2022年下半年&#xff0c;我开始自学板绘&#xff0c;没过多久&#xff0c;AI绘画横空出世&#xff0c;引起大量关注。在自学板绘的过程中&#xff0c;我逐渐了解到&#xff0c;学习绘画是一件以年为单位的事&#xff0c;有太多知识需要学…

大学生对AI的看法调查

大学生对AI的看法调查 &#xff08;❗主要是对2022届大学生的小范围不全面调查❗&#xff09; AI时代到来&#xff0c;大学生如何看待AI&#xff0c;如何看待AI应用领域大幅扩展后的未来&#xff1f; 对此我非常好奇&#xff0c;于是我自发开展了一次主要围绕本院&#xff08…

谈谈我对ai发展的看法

最近难得有时间&#xff0c;通过白话&#xff0c;聊聊我对AI的看法&#xff0c;仅代表个人观点 首先表明我的观点&#xff1a;人类当前的人工智能成果&#xff0c;仍然停留在一知半解程度。技术的发展是需要长期的积累和进步&#xff0c;目前AI的发展仍处于入门阶段 人类的发展…

GPT-4震撼发布,谁能革了ChatGPT的命?

今晨&#xff0c;OpenAI 发布了多模态预训练大模 GPT-4&#xff0c;OpenAI 老板 Sam Altman 直接开门见山地介绍说&#xff1a;“这是我们迄今为止功能最强大的模型&#xff01;” GTP-4 是目前为止世界第一款高体验、强性能的先进 AI 系统。根据 OpenAI 官方的介绍&#xff0c…

【技术分享】斐讯N1盒子打造智能家居平台

智能家居的概念越来越普及&#xff0c;作为年轻人&#xff0c;尤其是对电子技术爱好者、从业者来说&#xff0c;更加对智能家居控制感兴趣。 斐讯就不用多说了&#xff0c;5-6年前可谓风光无限&#xff0c;无数人“入坑”&#xff0c;我也是其中入局者中的一员&#xff0c;目前…

AIGC接下来的研究思路 生成式AI投资研究框架

AIGC接下来的研究思路 | AIGC 原创 科技周竖人 科技周竖人 2023-04-26 23:22 发表于上海 文 | 科技周竖人 欢迎关注同名公众号获取更详细内容 写在前面&#xff1a;AIGC全称生成式AI&#xff08;AI Generated Content&#xff09;&#xff0c;与传统AI最大的区别体现在其强大…

搜索趋势:微软必应新版集成AI和实时搜索

微软必应的新版已经集成了AI和实时搜索了&#xff0c;而且已经加入基于ChatGPT聊天的搜索功能&#xff0c;新必应上线48小时申请数破百万人申请加入了。大家可以先看看&#xff0c;下文有访问地址。 微软的新版搜索工具必应推出近一周&#xff0c;陆续有用户通过内测申请。与Ch…