2022年,我用技术来D虚拟主播

2,869 阅读9分钟

「时光不负,创作不停,本文正在参加2022年中总结征文大赛

写在前面

为了避免各位观众老爷看到这些摸棱两可的名词不懂而直接跑掉,我先说下这半年里我都做了啥:

  • 部署了一个静态页面用作生日礼物
  • 开发了一个QQ机器人来发布消息和互动
  • 使用nodejs自动缓存up主的视频,并且建立了数据库部署了后台

所用到的技术&做的工作:

  • 使用nodejs开发的千图成像程序
  • 域名备案
  • 静态网页托管
  • 基于Mirai的QQ机器人开发
  • nodejs的b站视频监听和下载
  • 使用nodejs操作mongodb
  • 基于express的后台程序
  • 腾讯云托管(篇幅有限没展开说)
  • 七牛云OSS的API上传及外链配置

这篇文章只是讲讲我几个项目的思路和历程,具体的技术细节就暂时不说啦。

名词解释&背景

以下是大家可能听不太懂的“专业名词”:

  • 虚拟主播:也称vtuber、vup,是指真人不出镜,而是通过面部捕捉、动作捕捉等技术将虚拟人物画面呈现在屏幕上来进行视频制作和直播的网络主播
  • DD:中文对应弟弟,指虚拟主播的粉丝,词义相较于“粉丝”程度更深,即更加狂热,在部分场景下略有贬义
  • D:DD的动词化,指喜爱和推崇某个虚拟主播
  • 舰长:某直播平台的礼物增值服务,价格从一百到两万不等,一般购买舰长的粉丝可以被认为是主播的核心粉丝群体,在一些互动中会有一些特权或者能掌握到一手的消息
  • 开团:针对热点敏感事件,清晰而立场坚定地表达自己的态度和观点,由于在互联网上很容易引起各方的“战争”,类似于MOBA游戏中团战的发起者,因此称之为开团

2022年,从卷城杭州回到了老家,在一个本地电商平台做了前端工作,虽然依然还是要加班,但是在项目和项目的间隙,还是有很多喘息的机会,于是便有机会开始琢磨一些技术方面的问题,其中让我比较感兴趣的有三个方面:

  • 静态网页的部署
  • QQ机器人
  • 后端及数据库

而学习一项新的技术,做项目再合适不过了,恰逢这段时间迷上了虚拟主播,成为了臭DD,于是将这三个技术方面进行了项目的转化,分别是:

  • 为虚拟主播制作的生日纪念网页(域名备案、静态页面部署)
  • 专为虚拟主播打造的QQ机器人“鱼子酱”(这个是与其他人合作的,用Python开发)
  • 虚拟主播视频投稿数据库(mongoDB,express,nodejs)

为虚拟主播制作的生日纪念网页

虚拟主播会在生日当天举行生日特别直播,部分主播会在生日前征集一些创意投稿,但投稿无非是视频剪辑、绘画、音乐之类的,于是我另辟蹊径——做个交互网页吧,毕竟前端是我的老本行,于是我制作了一个由多幅绘画拼接成的主播头像的马赛克大图,效果如下:

这个马赛克拼图的算法也是我用Nodejs来写的,这个回头单开一篇文章说。
静态网页写好了之后,要怎么给主播看呢,放在自己的服务器上,把IP地址发给主播?自然不是好主意,万一服务器到期了呢,而且似乎还有我不知道的安全性问题,也缺少cdn可能会导致加载缓慢。于是,域名+静态网站托管的方案便成为了我的选择。
首先,购买一个域名虽然不贵,但是在中国大陆部署的服务,需要进行备案。
简单说下,备案的过程基本上经历了实名认证-提交照片和材料-平台预审-工信部审核几个过程,时间比较长但是并不麻烦。(想起来十年前备案的时候还要把幕布寄来寄去来着)
关于备案的几个小要点:

  • 人脸认证的时候穿上衣服~
  • 网站用途不要有送给别人的礼物之类的字样,要说明网站是自己的
  • 平台预审和工信部审核阶段都可能有电话打过来,记得注意电话

接下来,便是网站的托管服务,我选择了腾讯云云开发里的静态网站托管服务,虽然是第一次用,但是整体使用起来没什么难度,基本就是这几个步骤:

  • 把自己打包好的静态页面文件上传
  • 在设置中配置好自己的域名
  • 在DNS中设置好托管服务提供的CNAME记录

在主播生日那几天访问量有点大,买了20块钱流量包几十个G花费的差不多了,之后访问量下来了,便每个月几块钱放在那里了,不过不管怎么说,也算是在互联网上留下了个自己的痕迹。

专为虚拟主播打造的QQ机器人“鱼子酱”

去年年底的时候,不知道为什么,各个QQ群里机器人突然多了起来,于是,我跟舰长群里一个朋友一拍即合,觉得可以搞一个机器人方便我们平时D虚拟主播,便开始研究起来,并给我们的机器人起名为鱼子酱。

鱼子酱选用了mirai框架,它是一个基于Android版QQ协议的机器人框架,然而我们俩都不会Kotlin,于是又引入了mirai-http框架来帮忙,mirai-http相当于在mirai的基础上开启了一个web服务,可以通过类似http请求的方式进行机器人的响应处理,而进行http请求就随我们熟悉的语言和框架来,我们就用了使用Python进行开发的Saya框架

刚开始的时候,鱼子酱就只有一些跟虚拟主播有关的功能,比如直播开播提醒、b站动态发布推送、b站视频解析和微博动态推送等,用到了DDBot框架

之后,为了提高娱乐性,又给鱼子酱加入了小互动(戳一戳及特殊关键词+@触发)、占卜抽卡、随机复读等娱乐功能,使用了绪山真寻Bot,以及注入给鱼子酱注入灵魂的AnimeThesaurus,一个二次元语料库,让鱼子酱跟群友对话,好像真的活了起来:

娱乐功能多起来之后,鱼子酱每时每刻都在“接客”(bushi),有些应接不暇,因此我们引入了nonebot2来保证在大量数据吞吐的时候,鱼子酱也能应付自如。

迄今为止,鱼子酱已经服务了十几个舰长群,甚至有的新出道的虚拟主播也慕名而来请求将鱼子酱加入到他们的舰长群中,可以说是令人相当自豪的事了。

虚拟主播视频投稿数据库

我D的某一个虚拟主播经常发视频开团而导致视频失效,某一个虚拟主播则经常不满意自己以前唱过的歌,隔三岔五删除自己过去的视频。

针对这种情况,我用nodejs写了个监听程序,自动监听并下载他们的视频,同时建立了数据库方便自己查找视频,之后又写了个后台程序部署到云托管服务上去,让自己随时随地都更方便的查找他们以前的视频。

nodejs监听新视频发布这部分没有什么特别的,基本就是定时调用up主的视频列表接口比对已有数据,然后发现了新的数据就保存在数据库中并将视频下载下来。

我是做前端工作的,数据库和后端对我来说是比较陌生的部分。由于我的数据结构基本不复杂,而在nodejs里也比较方便解析和处理JSON数据,因此我采用了NOSQL的Mongodb数据库。一开始我使用了免费的mongo cloud,但是由于服务器地址在境外,经常有连接不上的情况,因此最后我还是在自己的服务器本地安装了mongodb。使用nodejs操作mongodb比较简单,甚至感觉跟平时调接口获取数据区别不大。

数据库建立起来之后,我想随时可以查看已经保存的数据,因此写了个后端,后端我使用了非常常见express框架,写了几个简单的路由加上之前刚学会的使用nodejs操作mongodb数据库,完成了几个查询接口:

也有输出成表格形式的:

下载下来的视频,时间长了数量多了逐渐填满了我的服务器硬盘,因此急需将视频转移到其他地方,同时还要满足随时下载的需求,那么此时OSS对象存储便是一个不错的选择了,我选择了七牛云存储,学习了一下七牛云的nodejsAPI,每次下载完成后都会将视频传输到七牛云OSS中,并且将外链与我自己的域名进行了捆绑,这样便随时可以进行下载了:

2022接下来准备做点啥

  • 准备主播新一年生日会的网页礼物
  • 为鱼子酱加入更多可互动功能
  • 学习接口的防刷防DDOS等相关的安全知识,可以放心把后台接口交给其他人使用(目前就只有我自己在用)
  • 开发权限功能,通过权限控制对数据库中主播投稿信息的查看、已失效视频的下载(也是为了可以放开给其他人使用)