GPT开发人人都能用ChatGPT4.0做Avatar虚拟人直播

Posted RTCWang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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://<ip>:<port>"
            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);
            
        
    );

接收到消息

//接收到文字消息
@Override
public 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源码

  1. ChatGPT调用代码(nodejs)https://github.com/RTCWang/ChatGPT-Avatar-live?source=cnblogarticle66
  2. 直播客户端客户端(android)https://github.com/RTCWang/ChatGPT-Avatar-live?source=cnblogarticle66

6 ChatGPT虚拟人直播Demo 使用工具

  1. 直播产品:RTC SDK Android Java实时音视频实现流程 - 开发者中心
  2. 语聊房:ZIM SDK Android即时通讯SDK实现基本消息收发功能 - 开发者中心
  3. GPT4.0: New bing
  4. GPT3.5: ChatGPT

实测最像ChatGPT的中文产品:能解释三体懂弱智吧的梗,内测开启人人都能试!...

明敏 发自 凹非寺
量子位 | 公众号 QbitAI

最像ChatGPT的中文产品,出现了!

昨晚,一个名叫Inspo的生成式对话AI,刚刚在“民间”开启内测,马上引发不小反响。

体验过的博主表示:

1分钟搞定3份策划,工作5年没它能写!

有人自己上手试了试,表示效果确实不错,给的答案都很有参考价值。

还有人感慨:最近AI内卷的程度也太可怕了吧。

到底咋样?我们也来实测下。

一个懂点弱智吧的AI

按照官网的介绍,Inspo的定位还是人工智能助手。

具体能力包括写作、获取信息、提供建议,并且记得住前文,能完成连续任务。

首先,来测试下它的写作能力,并和ChatGPT、Notion AI做了比对。

要求写一段对量子位的介绍:

结果来看,Inspo的“思考”过程会相对久一点,然后会一次性快速输出内容。

写作的内容是AI擅长的总分总结构,没出现事实性错误,并且也比较全面。

ChatGPT是直接开始写的,“思考”的过程(顿感)穿插在生成过程里。

Notion AI也是一个主打帮忙生成文案的工具,模型基于GPT-3,它的生成速度上明显更快,不过文段有时候很简短。

再来看看获取信息的能力,也就是知识问答

我们选择了《三体》这个考点,提问“水滴是什么?”。

在这一语境下,它马上反应过来是一种超级武器,而且特点描述上也都对了。

还知道《三体》为什么叫三体。

不仅解释了这是书中的一个关键概念,还从文学层面理解了一下,表示三体也能更好传达书的内涵和主旨。

甚至经典弱智吧问答都考不倒它了。

理解前文方面,如果先给Inspo喂一段疯狂星期四的文案,一开始它会表示懵圈了,而且对文案中涉嫌非法的信息发出警告。

但如果接着让它写个疯狂星期四的段子,它就会马上理解之前的内容是个笑话,还会自己微调下措辞。

不过,Inspo也还是有一些bug存在。

比如生成式对话AI的老毛病:信息出错。

在提问让它介绍《三体》的基本剧情和人物时,它说程心拯救了人类???(╯‵□′)╯︵┻━┻

当我们问到关于《三体》剧版的情况,它的两次回答都有出错。

一个没答对演员,一个说错了开播时间。

除此之外,我们还测试了Inspo的表格生成能力,效果不如ChatGPT。

同样是给一个表格加一行“销售总额”,Inspo理解对了表述的内容,但是计算总额出错。

ChatGPT这边游刃有余。

总结一下,Inspo作为一个以中文为主的对话AI,中文的理解能力确实不错,能快速理解前文,并懂得一些国内互联网梗。

生成速度比较快,是先加载再一口气写完,默认生成的文段都比较长,擅长总分总结构,

准确性上还有待提升,不管是回答问题还是做数学题,都比较容易出错。

那么,这个AI基于的模型是什么?是谁开发的呢?

背后公司获得独角兽级别估值

在和Inspo聊天的过程中,我们就问出了这些信息。

它是由MiniMax公司自主开发,底层是一个大型语言模型。

可能大模型名字就叫MiniMax Language Model。

如果喊它MIMO,也会答应。

它自己说模型训练数据截止于今年2月,是MiniMax的核心技术之一。

模型基于Transformer架构,但是强调了不是GPT-3.5,也就是和ChatGPT不同。

不过更为具体的信息就无法问出了,比如模型参数量、使用了哪些数据库。

官方也没有做更多介绍。

量子位此前了解到,其背后公司MiniMax成立于2021年12月,号称All in AGI。

目前自研了三个基础模型,分别为文本、语音和视觉大模型。

并在基础模型之上构建起一个计算推理平台。

之前很火的AI聊天APP Glow,就是这个平台上支持的第一款产品,能满足每天上亿次用户的调用。

MiniMax已经公开的核心成员有杨斌

他在多伦多大学攻读博士学位,留学期间曾作为创始成员在Uber ATG研究院、自动驾驶初创公司Waabi等团队任职过。

而Inspo和Glow登记的公司北京稀宇科技,法人代表为周彧聪。

这个名字网上能检索到的信息不多,但在AI视觉顶会ICCV 2019 LFR 挑战赛的结果中出现过。

当时周彧聪所在团队获得了ICCV 2019 LFR挑战赛iQIYI-Large 赛道的冠军。这是一个面向轻量级人脸识别的挑战赛,周彧聪所在赛道是爱奇艺视频人脸识别大型识别模型,团队最终以0.7298精度的成绩获得第一名。

该团队由香港中文大学多媒体实验室和商汤共同组成,周彧聪负责整个训练平台的建设和维护。

除此之外,量子位获悉MiniMax已经快速到了独角兽级别估值。

而据游戏葡萄爆料,10亿美元估值这一轮的领投方,正是米哈游。

对Inspo感兴趣的童鞋,可以一起来参与内测~

传送门:
https://inspo.vip/?

参考链接:
https://mp.weixin.qq.com/s/TS-6XwEnWg2Cm3BXgU16bw

「中国AIGC产业峰会」启动

邀您共襄盛举

「中国AIGC产业峰会」即将在今年3月举办,峰会将邀请AIGC产业相关领域的专家学者,共同探讨生成新世界的过去、现在和未来。

峰会上还将发布《中国AIGC产业全景报告暨AIGC 50》,全面立体描绘我国当前AIGC产业的竞争力图谱。点击链接或下方图片查看大会详情:

被ChatGPT带飞的AIGC如何在中国落地?量子位邀你共同参与中国AIGC产业峰会

点这里👇关注我,记得标星哦~

以上是关于GPT开发人人都能用ChatGPT4.0做Avatar虚拟人直播的主要内容,如果未能解决你的问题,请参考以下文章

开发一个人人都能用的操作系统 苹果能做到

如何搭建chatGPT4.0模型-国内如何用chatGPT4.0

某gpt+MidJourney:打不过就加入,AI+人工智能绘画,人人皆可迪士尼,我为AI,AI为我,你有几个咒语了???

人人都能做产品经理吗?

从个人到创业团队都能用的项目开发部署流程!建议收藏!

从个人到创业团队都能用的项目开发部署流程!建议收藏!