最新要闻
- 当前焦点!比亚迪李云飞:比亚迪今年要卖300万台车
- 德国玩家竟如此钟爱AMD显卡!销量超过NVIDIA几乎20% 每日速讯
- 青岛国家深远海绿色养殖试验区养殖鱼类首次成功度夏-天天快讯
- 环球观点:尚无特效药!国产带状疱疹疫苗全国接种启动:一针能管10年
- 半价手慢无:卜珂巧克力夹心蛋卷14.9元/3罐 速递
- 电影情节成真!加拿大机场1.6吨黄金被盗 价值超亿美元_世界快讯
- 上演“史诗级灾难公关”:宝马蒸发市值可买约5亿个冰淇淋
- 可以再等等!iQOO 12系列在路上:200W超快闪充-天天新资讯
- 香菜饼最简单的做法,只需一把香菜,2个鸡蛋!
- 天天热讯:三峡艺术高中分数线(三峡艺术高中)
- 新华指数|钢“财”说:库存延续下行,基本面仍待改善|今日要闻
- 环球热点!长峰医院火灾系医院内部施工引燃可燃涂料所致
- 榴莲批发价1斤低至20元:海南国产榴莲也快上市了
- 2023新款超轻超弹:匹克轻弹风逸跑鞋119元狂促(原价249元)
- 《惊奇队长2》创纪录!62万踩成漫威最讨人厌的预告
- 男子被贴膏药秒倒地 官方通报:涉事膏药无迷药成分
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【GPT开发】人人都能用ChatGPT4.0做Avatar虚拟人直播
0 前言
最近朋友圈以及身边很多朋友都在研究GPT开发,做了各种各样的小工具小Demo,AI工具用起来是真的香!在他们的影响下,我也继续捣鼓GPT Demo,希望更多的开发者加入一起多多交流。上一篇结合即时通 IM SDK捣鼓了一个Demo ChatGPT群聊机器人Demo ,也收到了一些还不错的反馈,有伙伴用于客服场景解放了一部分人工重复工作提升了效率。趁着周末我捣鼓了一个ChatGPT虚拟人直播,结合了同样热门的元宇宙技术。
(资料图)
本文将通过详细开发流程来为大家举例如何快速实现一个虚拟人直播,可用于无人直播场景。ChatGPT虚拟人可抓取直播中粉丝弹幕和评论并回复来进行用户互动,提升直播间的活跃与用户体验。
最终实现效果如下所示:GPT虚拟人直播
1 实现思路
ChatGPT4.0虚拟人直播,首先得要有2个最基本的能力:ChatGPT4.0接口和虚拟人交互能力,这两块我们后面具体讲。整个流程如下图所示:
1.需要有具备文字驱动能力的虚拟人。具体来说,需要将文字转为语音,然后虚拟人能根据语音对口型。这里推荐使用即构Avatar,即构Avatar可以捏脸定制,同时具备文字驱动口型能力。2. 直播推流。抖音、快手可以用直播伴侣实时截屏推流。3. 获取实时弹幕/评论。虚拟人根据观众发的弹幕或者评论文本数据发送给ChatGPT,可以去github找开源代码。这里提供一个最简单的思路:在网页版注入JS代码,js实时读取网页上的弹幕。4. 调用ChatGPT。将实时弹幕/评论数据发送给ChatGPT并获取回复。5. 虚拟人播报ChatGPT的回复。
2 ChatGPT接入
目前openAI提供的接口是ChatGPT3.5,可以直接调用。bing在最新版Edge浏览器提供ChatGPT4.0体验,有一些开源库对其做了二次封装,只需提供Cookie即可体验。这里我们把两种方式都讲解。
2.1 ChatGPT 4.0 接入
首先注册bing账号:1.前往https://www.microsoft.com/zh-cn/edge/download?ch&form=MA13FJ 下载最新的Edge浏览器。2. 注册用户或使用已有账号登录,点击右上角「设置」图标,将所在区域设置如下3. 打开Edge,输入网址https://www.bing.com/search?form=MY0291&OCID=MY0291&q=Bing+AI&showconv=1接下来在代码里面封装ChatGPT4.0接口,先安装第三方基于Edge浏览器的库:
npm i @waylaidwanderer/chatgpt-api
接下来二次封装
import { BingAIClient } from "@waylaidwanderer/chatgpt-api";export class BingGPT { /* * http_proxy, apiKey **/ constructor(http_proxy, userCookie) { this.api = this.init(http_proxy, userCookie); } init(http_proxy, userCookie) { console.log(http_proxy, userCookie) const options = { // Necessary for some people in different countries, e.g. China (https://cn.bing.com) host: "https://www.bing.com", // "_U" cookie from bing.com userToken: userCookie, // If the above doesn"t work, provide all your cookies as a string instead cookies: "", // A proxy string like "http://:" proxy: http_proxy, // (Optional) Set to true to enable `console.debug()` logging debug: false, }; return new BingAIClient(options); } //调用chatpgt chat(text, cb) { var res="" var that = this; console.log("正在向bing发送提问", text ) this.api.sendMessage(text, { toneStyle: "balanced", onProgress: (token) => { if(token.length==2 && token.charCodeAt(0)==55357&&token.charCodeAt(1)==56842){ cb(true, res); } res+=token; } }); }}
注意到,除了需要提供vpn地址以外,还需要提供cookie数据。cookie可以在Edge浏览器中按F12打开开发工具,点击应用程序Tab,从左侧Cookie中找到_U的value即为想要的cookie,如下图所示:
2.2 ChatGPT 3.5接入
因为ChatGPT4.0基于浏览器,非官方提供的API,整体会有些不太稳定。而OpenAI官方提供了ChatGPT3.5,相比之下更稳定。
首先要有OpenAI的ChatGPT账号,在这里我们不细讲,不了解的同学可以参考我另一篇文章,链接: 《当我把ChatGPT拉进群聊里,我的朋友都玩疯了》接下来只需安装ChatGPT库:
npm install chatgpt
注意要使用nodejs 18.0以上版本安装,因为国内的IP无法使用ChatGPT,因此必须要有VPN代理。再安装一个代理库:
npm install https-proxy-agent node-fetch
接下来,二次封装一下:
import { ChatGPTAPI } from "chatgpt";import proxy from "https-proxy-agent";import nodeFetch from "node-fetch";export class ChatGPT { constructor(http_proxy, apiKey) { this.api = this.init(http_proxy, apiKey); this.conversationId = null; this.ParentMessageId = null; } init(http_proxy, apiKey) { console.log(http_proxy, apiKey) return new ChatGPTAPI({ apiKey: apiKey, fetch: (url, options = {}) => { const defaultOptions = { agent: proxy(http_proxy), }; const mergedOptions = { ...defaultOptions, ...options, }; return nodeFetch(url, mergedOptions); }, }); } //调用chatpgt chat(text, cb) { let that = this console.log("正在向ChatGPT发送提问:", text) that.api.sendMessage(text, { conversationId: that.ConversationId, parentMessageId: that.ParentMessageId }).then( function (res) { that.ConversationId = res.conversationId that.ParentMessageId = res.id cb && cb(true, res.text) } ).catch(function (err) { console.log(err) cb && cb(false, err); }); }}
注意到除了需要提供VPN地址,还需要提供apiKey。登录OpenAI后,打开链接https://platform.openai.com/account/api-keys 即可获取apiKey,如下图所示
3 虚拟人接入
虚拟人提供商有很多,由于目前我们不仅仅需要有虚拟形象,还需要虚拟人能够说话(ChatGPT提供逻辑思维能力)。因此,我们这里直接选用 即构Avatar,它内置了文本驱动能力,可以很方便将ChatGPT的回复文字内容直接读出来,并有口型匹配。非常适合我们这个场景。
官方提供了非常详细的教程:官方教程地址,本文简单讲解一些关键实现,具体完整代码可以参考文末资源附件。
设置虚拟人形象:
private void setCharacter(User user) { String sex = ZegoCharacterHelper.MODEL_ID_MALE; if (!user.isMan) sex = ZegoCharacterHelper.MODEL_ID_FEMALE; // 创建 helper 简化调用 // base.bundle 是头模, human.bundle 是全身人模 mCharacterHelper = new ZegoCharacterHelper(FileUtils.getPhonePath(mApp, "human.bundle", "assets")); mCharacterHelper.setExtendPackagePath(FileUtils.getPhonePath(mApp, "Packages", "assets")); // 设置形象配置 mCharacterHelper.setDefaultAvatar(sex); // 角色上屏, 必须在 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"); initTextApi(); updateUser(user); }
可以看到,只需简单几行代码即可定制虚拟人“皮肤”,使用非常友好。在文字驱动虚拟人说话方面就更简单:
public void playText(String text) { if (mTextApi == null) return; mTextApi.playTextExpression(text); }
当然了,这里展示的是最关键代码。要想使用即构avatar还需要做一些权鉴认证、引擎初始化等工作,直接复用本文文末提供的代码附件即可。需要注意的是,官方提供的Demo源码中只有基础资源。换句话说,还有很多非常酷炫的“皮肤”可以使用。但是因为资源太大,不方便打包。如果读者有更多资源需求,可以直接去官网找客服索要。
下面列出一些官方能提供的虚拟形象“皮肤”示例:
还有很多捏脸能力,这里不一一描述,感兴趣的同学可以直接去官网 (点击这里)去下载体验app,直接感受一下即构Avatar的强大。
4 基于即构SDK实现虚拟直播
对于B站、抖音、快手等第三方平台,想要做虚拟直播得借助官方提供的推流工具,如直播伴侣等。但官方没有提供实时获取直播间评论(或弹幕)的接口,当然了,你可以用一些技术手段来获取,这里不过多讲解。接下来我们讲解不用第三方平台,自己简单几行代码实现搭建直播平台。
4.1 搭建虚拟人直播平台思路
搭建虚拟直播平台有2个思路:
1.主播实时传输手机画面,观众实时接收主播发送的内容(图像),即构实时音视频RTC 该方案实现 可查看,RTC+Avatar方案可查看。我之前基于抖音平台做的虚拟人直播Demo, B站、快手等第三方直播平台的实现原理类似。
2.基于即构ZIM,实时传输文字(文字)
虚拟人直播与其他直播有一个差别是虚拟人是在用户端上使用固定算法渲染出来的,而不是主播实时拍摄的画面。因此我们完全不需要主播实时传输画面(图像),只需通过广播文字内容(相当于群组聊天),观众接收到文字内容后实时渲染虚拟人表情即可。这样可以大大节省带宽成本。
即构ZIM提供全面的IM能力,支持单聊/群聊/房间聊天,可根据实际业务自由组合IM能力。群聊消息稳定可靠、延迟低,全球任何一个地区都有接入服务的节点保障消息到达。 了解更多
4.2 具体实现
从上面两个方案可以看到,对于虚拟直播间来说,使用文字实时传输到每个端上,再本地渲染虚拟人画面,可以做到最低成本。具体来说,一个直播间可以通过一个房间(room)来管理,在即构IM的房间内,可以使用弹幕功能来实现收发文字。相比发送聊天消息,发送弹幕消息不会被存储,更适合直播间评论功能。用户创建直播间时,底层代码创建的是一个房间,并自动加入ChatGPT这个群成员。ChatGPT在群里接收到数据时,调用ChatGPT接口,得到文字回复后,再转发到群里。每个观众接收到ChatGPT回复的文字后,自动渲染虚拟人播报文字内容。
同样的,这里我们只展示关键代码。创建房间、加入房间、收到实时评论(弹幕)。创建房间、加入房间:
//创建房间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() { @Override public void onRoomCreated(ZIMRoomFullInfo roomInfo, ZIMError errorInfo) { if (errorInfo.code == ZIMErrorCode.SUCCESS) { inviteJoinRoom(masterId, roomId, CHATGPT_ID, cb);//这里把chagpt的用户id硬编码 } else { cb.complete(false, "房号已存在,请更换一个房间号!"); } } });}//加入房间public void joinRoom(String roomId, CB cb) { zim.joinRoom(roomId, new ZIMRoomJoinedCallback() { @Override public 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); } } });}
接收到消息
//接收到文字消息@Overridepublic void onRcvMsg(Msg msg) { switch (msg.proto) {//判断消息类型 case ChatGPT: {//来自ChatGPT的消息,语音播报文字 mZegoMngr.getAvatarMngr().playText(msg.msg); sendDM(msg.msg.replace("\n", ""), 0); break; } case DanMu: {//收到弹幕消息,直接在屏幕上展示 sendDM(msg.msg, msg.extInt); break; } case DismissRoom: {//收到解散房间消息,退出房间 mZegoMngr.getZIMMngr().leaveRoom(msg.msg, new CB() { @Override public void complete(boolean succ, String msg) { ShowUtils.alert(RoomActivity.this, "提示", "房间已解散!", new ShowUtils.OnClickOkListener() { @Override public void onOk() { back(); } }); } }); break; } }}
5 开源-Github源码
- ChatGPT调用代码(nodejs)https://github.com/RTCWang/ChatGPT-Avatar-live?source=cnblogarticle66
- 直播客户端客户端(android)https://github.com/RTCWang/ChatGPT-Avatar-live?source=cnblogarticle66
6 ChatGPT虚拟人直播Demo 使用工具
- 直播产品:RTC SDK Android Java实时音视频实现流程 - 开发者中心
- 语聊房:ZIM SDK Android即时通讯SDK实现基本消息收发功能 - 开发者中心
- GPT4.0: New bing
- GPT3.5: ChatGPT
关键词:
【GPT开发】人人都能用ChatGPT4.0做Avatar虚拟人直播
浅谈日出日落的计算方法以及替代工具 - 日出日落 API-精彩看点
这款产品,竟然用了二千多年才爆火?|世界最资讯
当前焦点!比亚迪李云飞:比亚迪今年要卖300万台车
德国玩家竟如此钟爱AMD显卡!销量超过NVIDIA几乎20% 每日速讯
青岛国家深远海绿色养殖试验区养殖鱼类首次成功度夏-天天快讯
环球观点:尚无特效药!国产带状疱疹疫苗全国接种启动:一针能管10年
半价手慢无:卜珂巧克力夹心蛋卷14.9元/3罐 速递
电影情节成真!加拿大机场1.6吨黄金被盗 价值超亿美元_世界快讯
上演“史诗级灾难公关”:宝马蒸发市值可买约5亿个冰淇淋
可以再等等!iQOO 12系列在路上:200W超快闪充-天天新资讯
香菜饼最简单的做法,只需一把香菜,2个鸡蛋!
焦点热门:AIGC的阿克琉斯之踵
超过50多个热门的免费可用 API 分享|滚动
火山引擎 DataTester 3 大功能升级:聚焦敏捷、智能与易用,帮助企业降本增效
天天热讯:三峡艺术高中分数线(三峡艺术高中)
新华指数|钢“财”说:库存延续下行,基本面仍待改善|今日要闻
环球热点!长峰医院火灾系医院内部施工引燃可燃涂料所致
榴莲批发价1斤低至20元:海南国产榴莲也快上市了
2023新款超轻超弹:匹克轻弹风逸跑鞋119元狂促(原价249元)
《惊奇队长2》创纪录!62万踩成漫威最讨人厌的预告
男子被贴膏药秒倒地 官方通报:涉事膏药无迷药成分
驾驶舱可变大床!五菱龙卡本月上市:横竖都能拉
天语e66怎么开机?天语e66手机可以拍视频吗?
华为T8951什么时候上市的?华为T8951手机参数
中兴v987是什么型号?中兴V987手机参数
七月未央作者_七月未央
三星S3850如何恢复出厂设置?三星S3850手机参数
摩托罗拉MT620上市价格是多少?摩托罗拉MT620手机参数
C#写一套最全的SQL server帮助类(包括增删改查)
秦都区吴办吴家堡社区新时代文明实践站开展党建引领 “童”行同乐活动
热点!110万的比亚迪大把人买!仰望U8预售48小时:订单已超1.3万份
NVIDIA大失所望:RTX 4070卖崩了!AMD成市场赢家
天天资讯:用户自驾突发紧急情况!最后用华为P60 Pro获救:用一次续一生
五一假期十大热门城市:看看有你想去的吗?
升空后人工引爆!下次再来 成功三分之一的Starship 新动态
长安C401将被称为长安辛特克斯动力来自马自达1.6 天天微资讯
JS中的进程和线程-动态
linux下查看文件内容工具发布啦!
04 设置工作模式与环境(下)收集信息
天天速讯:全国首单绿色及能源保供双主题ABS在深交所完成发行
环球速讯:园企智推官“我为企业代言”推介大赛开启
全球通讯!苹果版余额宝收益4%?我可一点都不羡慕 背后有猫腻
世界视讯!你信吗?宝马MINI再道歉:吃冰淇淋的“老外”是同事 求宽容2位小姐姐
1499元起!荣耀X50i手机发布:标配256GB超大存储
环球快资讯:我国天文学家为银河系精确“称重”:约为8050亿个太阳质量
高速上惊现喷气式汽车 车尾一路滚滚浓烟 涡轮增压器坏了
海南省白沙县2023-04-20 12:36发布雷电黄色预警
MYSQL---主从同步概述与配置
Docker基础知识和命令使用入门
网络流的C++代码实现与过程讲解
每日关注!南昌大学举办潘际銮教育思想研讨会
伛偻提携往来而不绝者滁人游也翻译_伛偻提携_焦点热文
嫁入豪门?前世界首富目不转睛盯着谷爱凌,搂着爱凌合影很兴奋
绿色转型湾区“债”持续——中央结算公司2023年二季度债市研判六人谈举行
“星级酒店”旅游专列今日发车:双人大床房 24小时管家
暗黑4再次公测
当前速读:上海一商场特斯拉展车喇叭响不停 销售员束手无策 路人纷纷堵耳
华为实现自主可控的MetaERP研发:我们已经突破封锁 我们活了下来-环球速看
环球即时:德国男单全军覆没!世界冠军1:3输球,世界第六现场脱衣服换球服
双鱼座今日运势_双鱼座男生讨厌女生_今日看点
四大证券报精华摘要:4月21日
仰望U8市区上路 体型硕大:一旁70万的途锐秒变高尔夫
马斯克不止星舰发射失败 特斯拉暴跌近10%:市值一夜蒸发3780亿元
全球视讯!剧情够毁灭!漫威宣布《复仇5》 明年开拍:国人不爱看 不符合文化观?
世界速递!2399元起加量还减价!小米平板6 Pro今日首销:升级神U骁龙8+
探访风波中的宝马mini展台
读SQL进阶教程笔记13_SQL中的分组和层级
笔趣阁校花的贴身高手小说_笔趣阁校花的贴身高手 每日简讯
超预期!世界打开中国经济“一季报”的正确姿势
北京军地检察机关推动监管部门加强保护管理
【环球新要闻】提前感知这次“五一”假期有多火:酒店预订量涨4倍、淄博订单涨20倍
KMeans_世界观热点
全球热点!Rust编程语言入门之Rust的面向对象编程特性
【Visual Leak Detector】源码下载 世界热讯
【全球报资讯】手机系统相册在哪里(手机系统相册在哪里打开)
世界今日讯!邓紫棋的祝福
4nm Zen4!宏碁全球抢发AMD锐龙9 7940H笔记本:配个RTX 4050 焦点快报
环球热文:苹果最强对手来了!小米13 Ultra首销:5999元买安卓影像之王
马斯克准备了7年的超级火箭炸了!但员工们乐得开起了香槟
世界百事通!迪士尼真人版《小美人鱼》新写真出炉:黑美人鱼海底双手托腮
五一民宿预订现涨价退单潮 房东找奇葩理由:破产不干了
ST时万(600241)2023年一季报财务简析:净利润减48.39%
当前最新:用户侧100千瓦时锌溴液流电池系统并网运行
全球观天下!上市险企财险2022年年报:综合费用率均有下降
一带一路、中字头个股午后反弹 西藏天路反包涨停
女生戒指戴法的含义图解_女生戒指戴法的含义|速读
农村厕所要怎么改造
世界今热点:三只小山羊创始人杨玉勇:专业、专注、全力以赴,成就羊绒大衣专家
已致270人死亡,2600余人受伤!中国驻苏丹使馆:请尽快登记! 今日播报
21世纪仅有7次!罕见日全环食今天来了|最新
天天看点:LCD面板行业复苏,产能向大陆集中,TCL科技等龙头企业有望受益
世界实时:次新股回调多少可以买入?如何买入?
jrsnba直播吧 a直播吧 焦点精选
世界读书日|重读雷锋日记 弘扬雷锋精神 天天新视野
vivo X Fold2:更易用的折叠屏旗舰 “减重不减质”-环球热讯
亮相第十三届中国轻工业信息化大会,360数字中枢引瞩目-全球热门
一季度我国经济发展实现良好开局_全球微动态
霍勒迪:赛前告诉字母哥会为他拿下G2 我们大家都支持他-精选
记录.Net部署Docker-v指令使用