摘要

AIGC、GPT、休闲小游戏三者能够怎样结合?

AIGC、GPT与小游戏的结合为游戏体会带来了新的可能性。AIGC(Artificial Intelligence Game Content)作为一种人工智能技术,能够自动生成任务、剧情和人物对话等游戏元素,为小游戏注入丰厚多样的内容。GPT(Generative Pre-trained Transformer)作为一种强大的自然语言处理模型,承担着在AIGC体系中生成各种游戏内容的人物,如对话、任务和地图等。GPT能够从许多的文本数据中学习,生成具有逻辑性和连贯性的游戏元素,为小游戏注入新颖、有趣和个性化的元素。

1、前言

自从 ChatGPT 去年上线以来,各种依据 ChatGPT 的使用层出不穷。笔者之前也写过许多关于 ChatGPT 的文章,帮许多初学者正确运用上了 ChatGPT。得到了许多读者好评反应,最近有读者反应能否依据 ChatGPT 给抖音、快手、视频号等直播间做《你说我猜》互动游戏。

关键词:ChatGPT、AIGC、GPT-4、大模型、RTC实时音视频、休闲小游戏

跟你玩游戏的不一定是真人|AIGC小游戏Demo

2、Demo运用的东西介绍

跟咱们介绍AIGC小游戏完成流程之前,前置先介绍本次Demo运用的东西,以 GPT 为首的 AI 高效生产东西以及直播SDK。

  1. 直播产品:RTC SDK Android Java实时音视频完成流程 – 开发者中心
  2. GPT4.0:New bing
  3. GPT3.5:ChatGPT

3、AIGC直播间休闲小游戏

因为第三方直播渠道不敞开弹幕接口,这儿咱们运用即构 RTC渠道接入小游戏来完成,即构 RTC 官方开发文档:https://doc-zh.zego.im/article/5416.假如读者需求接入到其他直播渠道(如抖音、快手、B 站等),自行查找相关弹幕接口替换本文弹幕接口即可。

依据实操经验,运用即构 RTC 实时音视频服务好处多多,即构的RTC产品采用的全链路自研音视频引擎,最低时延达79ms,79ms是什么概念呢,用户体会是人体毫无感知的。多渠道开发是现在的趋势,我一直用即构RTC完成直播间,接入流程简略便捷简略上手,帮助咱们项目快速上线屡次抢占市场流量。据官网显示,即构实时音视频服务适配多达15000+终端设备、兼容25种开发渠道,一次开发多端上线,为我节省了许多的开发成本,使咱们更能专注事务自身。还有业界领先的Qos战略、强大的3A处理才能,推荐给独立开发者和创业团队,开发者在游戏中经过即构SDK能够快速完成实时语音才能,合适快速验证项目可行性。

先看本文完成的终究效果(gif紧缩的凶猛,读者能够直接跑附件代码或许私信笔者获取demo): 左图:房主视角 右图:玩家视角(观众视角)

跟你玩游戏的不一定是真人|AIGC小游戏Demo

4 游戏规则设置

言归正传,先设置游戏交互过程。首要创立登录界面,用户能够输入房间号和昵称。接下来用户能够点击【进入房间】和【创立房间】按钮。

  • 假如点击进入房间按钮,需求验证房间是否存在,假如存在则进入,假如不存在则提示用户房间不存在。
  • 假如点击创立房间,需求先验证房间是否存在,假如存在提示创立失败,不存在则直接创立房间并进入。

在房间内:

  • 假如是房主,则能够设置猜词,比方“水杯”。然后拼装提示词:”请描绘水杯,10个字以内,不要呈现水杯2个字”。
  • 得到ChatGPT的回复后,将回复的内容作为直播间的“本轮提示”。
  • 房主每次能够点击改写按钮,将相同的提示词发送恳求ChatGPT回复,并改写“本轮提示”
  • 观众依据“本轮提示”猜词,猜词最快的4个用户的头像会呈现在直播间大屏,享用胜者的荣誉。

观众视角(玩家视角)

跟你玩游戏的不一定是真人|AIGC小游戏Demo

游戏登录界面和猜词界面如上所示,机灵的读者可能会发现一个Bug:第一个用户假如回答正确并上墙了,后面的用户能够抄袭了。的确会有这个问题,这儿首要是因为笔者没有建立服务器,所以欠好直接控制用户的弹幕。正确做法应该将回答正确的弹幕用星号(*)替换掉,避免答案被抄袭。这儿留给读者来处理这个小问题。整个游戏逻辑流程如下:

跟你玩游戏的不一定是真人|AIGC小游戏Demo

5 代码完成

5.1 与 ChatGPT 对接

与ChatGPT对接完成代码在前面 **《人人都能用ChatGPT4.0做Avatar虚拟人直播》**一文中有详细描绘怎么调用,这儿不再赘述。在附件下载源码后,履行如下命令装置有必要的库:

npm install

接下来,发动http服务:

node main.js

仍然运用**《人人都能用ChatGPT4.0做Avatar虚拟人直播》** 一文中封装好的接口(包括chatGPT3.5和BingGPT4.0), 这儿咱们运用OpenAI的ChatGPT3.5。如下所示,引进chatGPT接口后,接下引进Express发动Http服务。

var chatGPT = require("./robot/robot").chatGPT
var express = require('express');
var app = express(); 
app.post('/ask', function (req, res) {
    let ask = req.query["ask"];  
    chatGPT(ask, function (succ, txt) {
        if (succ) {
            res.send({ state: 0, txt });
        } else {
            res.send({ state: -1, txt: "" });
        }
    })
})
var server = app.listen(8888, function () {
    var port = server.address().port
    console.log("使用实例,访问地址为 http://%s:%s", '0.0.0.0', port)
})

只包括一个POST接口/ask,用户只需传入提示词,内部传递给ChatGPT,将ChatGPT回复的内容回来的用户。

5.2 接入即构 RTC

即构 RTC是一款实时音视频 SDK,时延最低79ms,70%丢包下坚持流通的视频通话,能给咱们供给安稳、多渠道互通的实时音视频才能。在音视频通话基础上供给超分辨率、布景分割、场景化降噪等高档音视频处理,一起供给万人连麦、状况实时同步等多种兴趣玩法,可使用于多人语音、在线KTV、虚拟国际处理方案。 即构覆盖全球用户,每日服务超30亿分钟。更多概况可进入即构官方开发文档:doc-zh.zego.im/article/541… 接下来咱们借助即构RTC强大的才能开发实时语音以及房间内弹幕同步才能, 以下是接入即构RTC大致流程。

跟你玩游戏的不一定是真人|AIGC小游戏Demo

在官网下载最新SDK: doc-zh.zego.im/article/296… 将SDK引进到项目后,接下来创立即构RTC引擎:

public class RTCMngr implements RTCHandler.IRTCEventListener {
    private static final String TAG = "RTCMngr";
    private ZegoExpressEngine mRTCEngine;
    private static RTCMngr mInstance;
    private RTCHandler mRTCHandler = new RTCHandler(this);
    private ZegoVideoConfig videoCfg = null;
    private IListener msgListener;
    private static Map<String, String> roomInfo = new HashMap<>();
    private RTCMngr(Application app) {
        mRTCEngine = createRTCEngine(app, mRTCHandler);
    }
    public static RTCMngr getInstance(Application app) {
        if (null == mInstance) {
            synchronized (RTCMngr.class) {
                if (null == mInstance) {
                    mInstance = new RTCMngr(app);
                }
            }
        }
        return mInstance;
    }
    private ZegoExpressEngine createRTCEngine(Application app, IZegoEventHandler handler) {
        ZegoEngineProfile profile = new ZegoEngineProfile();
        profile.appID = KeyCenter.APP_ID;
        profile.scenario = ZegoScenario.GENERAL;  // 通用场景接入
        profile.application = app;
        ZegoExpressEngine engine = ZegoExpressEngine.createEngine(profile, handler);
        return engine;
    }

登录房间

接下来完成登录房间,登录房间首要需求获取Token,获取Token的方法封装到RunOnServer类里面。

值得注意的是,RunOnServer类里的一切函数都是需求读者将其移到服务器端运转,不然有安全危险!

有了Token后,接下来调用ZegoExpressEngine的loginRoom函数,经过回调函数中的error参数判断是否登录成功。假如为error=0表示登录成功,不然,需求去官网查询详细过错原因。

//登录房间
public void loginRoom(User user, CB cb) {
    ZegoUser zuser = new ZegoUser(user.userId, user.userName);
    ZegoRoomConfig config = new ZegoRoomConfig();
    config.token = RunOnServer.getToken(user.userId, user.roomId); // 恳求开发者服务端获取
    config.isUserStatusNotify = true;
    mRTCEngine.loginRoom(user.roomId, zuser, config, (int error, JSONObject extendedData) -> {
        if (error == 0) {
            Log.e(TAG, "登录房间:" + user.roomId);
            String hostId = null;
            try {
                hostId = extendedData.getString("hostId");
            } catch (JSONException e) {
                hostId = "";
            }
            cb._complete(error == 0, hostId);
        } else {
            Log.e(TAG, "Login Error, errorCode=" + error);
            cb._complete(error == 0, "login room error code:" + error);
        }
    });
}

退出房间

有登录就会有退出,退出房间之前,先中止拉流,假如有推流则需求中止推流。然后调用ZegoExpressEnginelogoutRoom函数。

    //脱离房间
    public void leaveRoom(String roomId, CB cb) {
        mRTCEngine.stopPreview();
        mRTCEngine.stopPublishingStream();
        mRTCEngine.logoutRoom(roomId, new IZegoRoomLogoutCallback() {
            @Override
            public void onRoomLogoutResult(int errorCode, JSONObject extendedData) {
                cb._complete(errorCode == 0, "");
            }
        });
    }

发送弹幕 前面完成了登录房间和退出房间,有了房间的概念,那么接下来完成向房间发送弹幕音讯,让房间每个人收到弹幕音讯,直接调用ZegoExpressEnginesendBarrageMessage函数即可:

    /**
     * 发送弹幕音讯
     */
    public void sendMsg(Msg msg, CB cb) { 
        mRTCEngine.sendBarrageMessage(msg.toUID,
                msg.decMsg, new IZegoIMSendBarrageMessageCallback() {
                    @Override
                    public void onIMSendBarrageMessageResult(int errorCode, String messageID) {
                        cb._complete(errorCode == 0, messageID);
                    }
                });
    }
    //其他相关代码略.....
}

以上代码创立RTC引擎、登录房间、脱离房间、发送弹幕、推流等函数。依据这些基本才能后,咱们就能够拼装更多杂乱功用了。接下来封装推流才能,因为语音实时画面是4个用户头像,无须实时视频推流。因而只需运用实时语音功用即可,在拉流时,将需求用到 canvas 参数的函数传入null。在推流时,调用 muteVideoPublish函数,禁掉视频的推流。别的,在调用startPreview前,先调用 enableCamera封闭摄像头,以避免SDK恳求摄像头权限。或许爽性不恳求摄像头权限,保证不会调用摄像头对实时画面推流。

//推流
public void pushStream(String streamId) {
    Log.e(TAG, "push streamID" + streamId);
    mRTCEngine.startPublishingStream(streamId);
    mRTCEngine.startPreview(null);
}

5.3 房主设题

房主有命题权限,整个游戏的节奏由房主来把控,比方:换题、改写提示等。其中最重要的接口是与ChatGPT服务对接,大致流程如下:

跟你玩游戏的不一定是真人|AIGC小游戏Demo

详细代码如下:

private void reqGPT() {
    if (wordAns.length() <= 0) return;
    chatGPT.ask("请描绘" + wordAns + ",10个字以内,不要呈现" + wordAns + wordAns.length() + "个字", new CB() {
        @Override
        public void onResult(boolean succ, String res) {
            if (!succ) {
                toast(res);
            } else {
                Msg msg = Msg.newRoundMsg(mUser.roomId, res, mUser.userId);
                rtcMngr.sendMsg(msg, new CB() {
                    @Override
                    public void onResult(boolean succ, String err) {
                        onlineIds.clear();
                        onNewRound(msg);
                    }
                });
            }
        }
    });
}

注意到第三行代码中,拼装了ChatGPT的提示词,加了10个字以内约束,避免ChatGPT回来一大段描绘;别的,加了不要呈现xx关键字,避免ChatGPT在回来的内容上把猜词给暴露了。

答案现在是由房主保存,房主在接收到观众的弹幕后,逐个对比,假如是正确答案而且现在答对的用户不超越4人,就让用户头像上屏。这儿因为咱们没有单独与即构RTC对接的服务器,所以由房主发一条特殊包括了上屏用户信息的弹幕音讯,一切人接收到这条特殊的弹幕后,解析展现上屏用户数据。

5.4 观众猜题

观众猜题逻辑比较简略,用户直接输入猜想的答案后,直接发送弹幕音讯即可。点击发送按钮,对于房主和观众,走两条不同逻辑:

/**
 * 点击发送按钮
 */
public void onClkSendMsgBtn(View view) {
    String txt = sendET.getText().toString().trim();
    if (txt.length() <= 0) return;
    Msg msg = Msg.newRoomMsg(mUser.roomId, txt, mUser.userId, mUser.userName);
    if (mUser.isCreator) {//房主重新设置猜想词
        newRound(txt);
    } else {//观众发送弹幕
        rtcMngr.sendMsg(msg, new CB() {
            @Override
            public void onResult(boolean succ, String err) {
                addBarrageItem(msg);
            }
        });
    }
    sendET.setText("");
}

6、社交小游戏处理方案

现在有越来越多的企业测验经过在泛文娱社交产品中引进小游戏,来提高用户社交互动的兴趣性和产品粘性,一起去验证产品的商业化变现新思路。对于预算不多自研小游戏的中小企业或验证小游戏项目的企业。笔者推荐可选择接入带有小游戏的第三方音视频SDK,例即构RTC实时音视频。

据了解即构与多家头部游戏工作室达成协作,推出了社交+小游戏处理方案,当前已支撑桌球、碰碰大作战、谁是卧底、你画我猜等多款热门休闲游戏,可使用在视频直播、一对一结交、语音电台、语聊房等泛文娱职业常见的事务场景,一起即构也支撑Ludo、Domino、UNO等出海本地化游戏,为中国出海企业的市场竞争供给新助力。

别的,即构的小游戏库继续扩大中,开发者只需接入一次,即可不断更新上线新游戏,合适想要低成本快速验证用户偏好的团队或开发者。即构官方还推出了许多泛文娱职业使用场景的产品demo,就算不想运用即构 RTC,也强烈推荐进去看看相关 Demo,说不定能给你带来许多创业灵感。[官网 Demo 列表网址](doc-zh.zego.im/scene-plan?…

7、小游戏玩法延伸

本文首要经过房主设置标题、GPT供给对应的描绘、观众猜题的逻辑完成“你说我猜”小游戏,GPT的描绘有开盲盒的影响感,是本游戏的亮点。

当然了,游戏玩法能够万变。博主供给几个思路,比方:

  1. GPT命题,无须房主,一切观众猜题
  2. 观众命题,GPT猜词

别的,不仅仅是“你说我猜”小游戏,还能够做一些更杂乱的言语类游戏,比方:谁是卧底、狼人杀等时下流行游戏;别的,还能够结合AI画画完成“你画我猜”小游戏。只需简略几行代码接入即构RTC才能,简直一切实时类游戏都能够简略接入。

8 Github代码 – 你说我猜小游戏Demo

  1. AI服务代码
  2. Android代码

AIGC与小游戏的结合为游戏职业带来了创新与开展的机会,为玩家供给了更丰厚、多样化的游戏体会。也欢迎各位开发者留言私信沟通AIGC休闲小游戏更多玩法。