阿里妹攻略:如果你喜欢边看剧边看弹幕发弹幕,那你一定知道,有些剧里,弹幕更是比剧情更重要的是精彩,比如上热搜的《东宫》的那句“你恋爱了吗?秒杀全家的那种”。也正是因为这些神一般的网友频频曝出句中精髓,让某些剧集的精彩度翻了一番,甚至还有一大批网友因为被弹幕吸引而前来追剧。今天,阿里娱乐高级开发工程师神灭介绍了一种新的弹幕玩法,让弹幕更具可玩性。喜欢用优酷看视频发弹幕的同学应该已经发现,最新版本的多部剧都推出了全新的基于AI人脸识别的后续弹幕。从右到左以跑马灯效果显示,并且这个后续弹幕以气泡的形式悬挂在角色头像旁边,随着角色的移动而移动。这种跟风弹幕的可玩性更高,有才华的网友也有更大的发挥空间。这里有一些例子。玩法结合人物动作:玩法结合人物所在场景:自编自导人物对话:从几个视频演示可以看出,与普通弹幕相比,这个跟风弹幕是基于与剧中角色相似的角色。以内OS的方式展示,与视频没有割裂感,更有趣、新奇、刺激,玩法更多。本文主要讲述如何展示下面的弹幕,从架构图入手讲解实现过程;然后从开发过程中遇到的棘手问题分享技术攻略;最后分享一下未来的计划。1、按照弹幕架构图,整个流程是自下而上的,分为算法端、服务端、客户端三层:首先,算法端以25帧/帧的频率进行视频帧采样其次,对每一帧进行人脸识别,进行人脸跟踪和平滑处理,生成每一帧的人脸元数据;其次,服务端将多帧的人脸元数据通过降噪、防抖、融合等方式组合成一组组人脸组数据,连同后面的弹幕数据一起发送给客户端;最后,客户端为交互SDK中的每组人脸数据生成脚本,由脚本完成弹幕跟随人脸轨迹的移动。下面重点介绍各模块或子模块完成的任务:1.算法端1)视频帧提取模块:以每秒25帧(可配置)的频率从视频流中提取帧。帧采样频率越高,人脸运动轨迹越平滑,但人脸识别算法耗时也会增加;2)模型训练模块:提供多张多角度剧中出现的人物形象供模型训练模块训练,生成对应的人脸库,再配合训练好的明星库,这两个库可以大大提高准确率人脸检测;3)人脸检测:识别出每一帧图像中的人脸,并给出坐标;4)人脸跟踪:为了方便服务器生成人脸的轨迹,需要在连续的几帧中标记同一张脸;所以整个人脸轨迹都会有抖动。平滑处理是通过对人脸每一帧的坐标进行微调,使整个人脸运动轨迹更加平滑。2.服务器1)降噪:算法端不关心每一帧中哪张脸重要或不重要,所以一秒内会有大量的路人脸出现和消失。这种无意义的噪声需要直接过滤掉,即降噪处理;2)防抖:如果算法侧平滑处理不满足要求,人脸在运动过程中仍然有抖动,服务器可以对元数据进行二次处理,使人脸运动更流畅。光滑的;3)合并:算法端吐出每一帧的元数据,但客户端关心的是一张人脸从出现到消失的整个轨迹过程,服务端会将元数据合并为一组人脸4)泡泡弹聊天data:跟随弹幕数据,每条弹幕对应一张脸,同时指定弹幕开始显示的时间。3.客户端1)交互SDK模块:加载各种交互脚本,每个脚本都是一个小交互,比如电影评分,百科提示,双流酷看等。利用交互SDK的基础能力,从出现到消失的全过程每张脸都被视为一个小的互动脚本;2)人脸脚本:人脸脚本包含轨迹坐标和对应脚本中有一个定时器轮询,找到当前时刻对应人脸的坐标。如果此时有后续弹幕数据,则将数据显示在人脸旁边,继续轮询。也就是说,实现了弹幕气泡跟随人脸移动的效果。2、为什么不直接通过客户端识别人脸?1、实时观看对时间要求太高。对于客户来说,你最终需要知道的是每一张脸从出现到消失的整个轨迹。如果客户端做识别,目前只能识别出某一帧的人脸数据,跟踪、平滑、防抖、过滤、合并的整个过程过于耗时,不能满足用户对人脸的需求实时查看;2.端侧识别准确度不符合要求。之前做弹幕穿刺的时候,iOS端连接了AliNN提供的SDK,人脸检测还是偶尔检测不到。如果人脸检测精度达不到要求,需要自行补正。帧处理,这种补帧处理很难实时实现;3、设备端识别影响用户体验。设备端识别时,手机的杯耗增加,即耗电量会增加,也可能会影响播放器的卡顿率。3.难点问题1.当镜头快切的时候发后续弹幕,怎么留在那里消失,其他人脸马上出现,问题来了,如果为了保证用户能看到自己发的弹幕,那么后面的弹幕就需要强行在屏幕上停留几秒,但是因为这几秒切镜头后跟着弹幕就很尴尬了。测试同学反映,切镜头后的弹幕很奇怪,给人一种“天上飘一个字”的感觉。对于这个问题,我们最终的解决方案是在切相机前紧跟弹幕,切相机后直接运行淡入淡出效果,保证用户能看清楚自己的弹幕,不会尴尬的挂在下一个人脸的镜头。视频效果如下:2.热门剧频繁剪辑导致人脸数据时间轴错乱的问题。一个视频,特别是综艺节目上线后,时不时会剪辑多次。一旦编辑,人脸数据和进度条的时间就会错位。操作者可以在1分20秒的位置给出一个大概的时间比如十秒的切割数据,但是人脸数据必须在进度条时间的毫秒以内。对应级别单位,否则会有明显的延迟或提前。如果重新运行数据,可能需要几个小时才能离线禁用此功能。如果要复用这些数据,就必须知道精确的毫秒值,然后把切掉的部分之后的人脸和弹幕数据全部抵消掉,所以问题就是如何得到精确的切掉时长。按照下面的方法,只需要在新视频的切点前后运行一小段人脸数据,计算出切入的毫秒级时间,然后将切入后的人脸数据和弹幕数据全部抵消点原视频。移动相应的时间解决了数据错位的问题。4、未来展望如果剧中的人脸数据只用在后面的弹幕中,那就有点大材小用了。下一步,我们计划使用人脸数据和人体数据的脚本作为基础脚本。除了跟随弹幕脚本之外,我们后面还会用到的还有弹幕穿刺脚本等等。这部分客户端架构未来可能会有所调整,如下图所示。方便大家通过外部注入等方式构建自己想要的脚本。所以当你有一个创新的想法,需要用到人脸和身体数据时,你可以继承基础脚本获取数据,直接自定义你想要的功能。借助成熟优化的人脸和身体数据,您可以快速完成演示。比如YY的一个场景,因为某些原因,需要给A星出现的场景打上马赛克,或者删除A星参演的电影。下载一部电影肯定是不能接受的,毕竟,花大价钱买版权;手动重新剪辑大量镜头是不现实的,这也是考验各种视频APP技术能力的时候了。借助交互SDK提供的能力,当我们通过下发的人脸ID判断是明星A时,在下发的人脸框上打上马赛克,问题就迎刃而解了。
