如何把在线K歌“玩起来”——专访撕歌音视频架构师程乐

news2024/11/16 6:51:34

cdcca59929e1478ceac02b60b2c34468.jpeg

编者按:在线K歌的业务已经发展了十年,程乐在音视频领域也闯荡了十年,甚至更久。为什么选择在线K歌领域?如何走过“漫长的季节”,迎来新的风景?如何在“在线K歌”这块难啃的骨头里分点肉?在这一连串的问题下面,只有一个简单的答案:兴趣。以下是程乐的讲述——

01 兴趣决定了一切

大概是在上中学的时候,我开始对音视频产生强烈的兴趣。从收音机、磁带机、CD、VCD、DVD、mp3,一直到大学时期开始流行的MP4、平板、相机等等,基本上都是省吃俭用搞回来的,为此也没少跟父母闹过矛盾。

c9a9cb70b978c11f1717b564e5c64adb.png程乐

大学时,相对能折腾的时间比较多,刚好是智能手机爆发前夜,MP4设备比较火爆,那几年基本是卖旧买新,一直跟着最新的设备迭代,从仅支持单一480p Xvid视频格式到720p rmvb再到1080p H264,到生命末期甚至卷到了4K(那时候还是2010年之前)。当时在imp3论坛上也很活跃(现在早已关闭),一起讨论新出的芯片方案解码性能到底咋样,各种编码格式的优缺点;

d6cebff8e3fb123f52b24be08ef35a21.jpeg2018 年 11 月,iMP3正式宣布关站

也蹲各个厂家的评测优惠活动,写写评测,机器就能半价入手。在当时论坛的影响下,我也开始入门烧耳机,哪些耳机能做到低音沉、中音准、高音甜,无损的Ape Flac比WMA MP3能强多少等等,都是涉猎的范畴。

毕业后的第二份工作是做电视盒子,虽然最后的结果不太好,但当时的烦恼很少,日子过得开心、纯粹。那个时候每天考虑的就是本地播放怎么提高兼容性,MP4/flv/mkv/ts这些格式怎么封装,蓝光导航怎么搞,ASS/PGS特效字幕怎么解析渲染,各家的硬件解码器都要怎么适配,网络播放怎么提高稳定性等等。

当时的状态就像重度游戏玩家开始按照自己的意愿开发一款新游戏,从工作体验上来说是比较满足的。

再后来,移动直播、短视频开始兴起,我就用之前积累的音视频经验转做移动端的直播、短视频SDK,当时应该还是有不少客户在用的。再后来就开始做撕歌的实时语聊K歌场景,也是从乙方转做了甲方。

总之毕业后一路走来,工作在自己的兴趣领域也是蛮幸运的事情。回想起来,兴趣对于跨越音视频的门槛来说是非常必要且有效的,所以希望想入这行的同学都能够培养起来对音视频的兴趣。

02 在K歌赛道中,杀出一条血路

下面,让我们来聊聊业务。我是2019年加入帧趣的,之后就开始接手公司内音视频相关的技术以及K歌的整体体验。主要侧重在客户端部分,服务端音视频能力大部分是用第三方服务,自己做的东西会比较少。

那么,与其他大厂相比,我们的技术优势在哪里呢?

首先是我们有一支战斗力强的业务团队,能够快速试错各种新的脑洞玩法,对用户常用常新。撕歌在K歌的玩法上也是做了不少探索,比如最早上线的双人接唱玩法,以及到后来的多人接唱玩法,都是朝着更容易产生社交的方向去努力的。

478fededd9d6072c2ea907629fad57aa.png

撕歌的各种玩法基本都戳中了年轻人的兴趣点

对撕歌有了解的人都能看出来,撕歌走的是实时K歌玩法。K歌是一种社交类的破冰游戏,大家有着共同的唱歌爱好,更容易打开话题,沉淀社交关系,有了社交关系之后用户的粘性就比较强了。

其次是K歌体验部分,相比其他主要关注业务的语聊类app,我们有专门的音视频团队,可以自己实现很多需求,不至于第三方没有我们就没得用;另外我们逐步建立起了一套主客观评价机制,可以推动第三方来优化关注点,然后由我们集成优势,灵活地选择最佳的供应商。

前几年,各RTC厂商对泛娱乐K歌场景都缺乏投入,我们的采集渲染方案在低延迟耳返、耳返兼容性、人声伴奏对齐等方面存在优势;AEC以及演唱评分也做过自己的优化,不过随着各家加大资源的投入,差距会缩小。像AEC效果这些,第三方这两年普遍进步很大,这种情况下我们最终会根据整体的主客观评价结果来做调整。

踩坑、成长、一步一步来

53e86737f09e20bdd2642a4829c158e3.jpeg

技术上的主要困难还是小团队都会面临的全栈要求。由于我自己一直是在做音视频的工程开发,而唱歌体验的好坏也有很大一部分是落在硬核算法上的,像是音效、演唱打分、回声消除效果等等。

演唱打分这块,在19年初还不太能找到合适的第三方技术服务,当时是请兼职帮忙搞了一套算法,不过效果准确性上一直有比较大的问题,这块自己当时花了大半个月的时间啃了四五篇paper,对评分算法做了一个比较大的优化,准确度上也是有了明显的提升,大致能够满足我们娱乐性质演唱的需求。

回声消除这里也做过尝试,当时的教育产业如火如荼,RTC厂商们的重心基本都在会议和教育领域,对我们这类娱乐K歌类产品的需求满足度就比较低。当时的回声消除最明显的问题是双讲场景下对人声的压制非常厉害,人声发闷严重甚至会丢掉一些音节。

这类问题对会议场景来说不是特别严重,能听清楚对方讲的内容就可以,但在K歌场景下人声的这类损伤会导致听感非常差,这时宁愿残留一些伴奏的回声,也要尽量保障对人声细节的保留。这块我们当时也尝试把WebRTC中的AEC算法抽出来,然后在演唱的时候屏蔽掉非线性处理部分,只做线性处理,残留的回声靠伴奏的精准混音来压制掉。

bf92b16c7276b3eca85a575fdbac43bf.jpeg

在当时各RTC厂家整体的效果下,这个方案大多数情况下的体验还是会好不少的。当然后来教育被打掉之后,各家开始重视泛娱乐市场,这块的体验才有了质的飞跃,现在我们也是采购了第三方的AI回声消除算法。

目前我们音视频这边跟业务会相对独立,大部分优化迭代可能是跟业务相关性不大的,这些部分会独立发版,然后跟业务侧的版本班车去发。这里有一些是产品提过来的体验问题优化,也有一部分是我们自己综合用户反馈以及统计信息来做的。当然也有一些跟业务强相关的开发内容,类似接唱玩法、一些需要演唱打分的场景等等,这部分会跟业务一起评估需求,纳入业务的项目管理进度中去。

6fecd3c0180e20d81218dec22aaac52d.jpeg

宣发和技术也是我们在发展过程中努力在提升的方向,留住用户更重要的还是产品力,技术也是为产品力服务的,这块我们还是有持续的路要走。

绕不过的降本增效

ae881229f8ae850aba1b22c82afea714.png

说到降本增效,其实,作为一个小团队,主要还是发挥自己的优势方向,非优势方向以及成本上无法顾及的方向则想办法找合作方来补齐。比如实时K歌场景下,对用户体验影响较大且我们自己可以做的采集渲染以及机型适配工作,我们从19年开始就一直在积累;而像RTC的传输优化、AEC处理,服务器架设则是建立了一套实验室评价体系,选择效果最好的服务商来满足需求。

成本这块,实时K歌最大头的也就是RTC服务的费用了,我们目前是配合自己的采集渲染来集成各家的RTC服务,这样可以做到最低的切换成本,线上多家RTC同时存在时的体验也是一致的。这种方案下我们会有比较好的议价优势,也能掌握议价的主动权。另外端上对CDN资源的cache机制,对RTC资源的按需使用优化也能降低一部分成本。

03 要在现在,抓住未来

唱歌是人的天性,社交也是天性。特别是年轻一代在自我表现以及社会认同上会有更个性化的需求,他们对在一个虚拟社区中组成团体的认同感以及精力投入上也都更多,基于K歌的社交垂类还是有持续的可挖掘空间的。

a5caf1143471a6c01bbe3c7802fe17a7.jpeg

我认为,K歌未来的发展方向应该也是朝着更容易沉淀社交关系的方向去走。比如说更精准的匹配推荐策略,让对脾气的用户能高效的认识并沉淀关系;再比如说基于AI的自动改编和自动作曲,让有才华的非专业用户可以高效产生自己的特色作品,低成本地炫出自己的才华;对于音乐领域来说,基于AI的伴奏人声分离技术已经比较成熟,目前的效果基本上能达到实用程度了。

再比如基于AI的回声消除以及降噪,可以达到传统算法无法企及的高度。像我们所在的K歌社交领域,如果能基于AI给歌曲以及用户的演唱做自动分类推荐,则会是一个比较显著的方向。希望未来的技术发展能解决目前实时合唱的延时问题,让远在各地的用户可以轻松和声。

最后,分享下我在这次的LiveVideoStackCon中带来的内容:主要还是分享这几年做撕歌在音视频这块踩过的坑,以Android/iOS移动端的技术为主;也会分享K歌场景下特殊的一些技术点;还会聊聊音视频技术上的优化如何变成老板们能认可的指标,以及语聊场景常见的卡麦问题。


*文章图源:

豆瓣《蜘蛛侠:纵横宇宙》

853443aa48318dcf7bdcfac5f5c2f151.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/657058.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【存储】cache memory、primary memory and secondary memory

一、提要二、计算机的存储结构三、高速缓存:cache memory四、主存:Primary memory4.1 RAM4.11 SRAM 和 DRAM的概念4.12 SRAM 和 DRAM的应用场景 4.2 ROM4.21 PROM4.22 EPROM▶ EEPROM▶ UVEPROM 五、辅助存储器:secondary memory六、单片机的…

redis的4种模式,单机,哨兵、主从复制、集群

为了redis叫做redis服务器? 因为在运行时,在进行工作时是一个被注册一个进程(服务),我们把他叫做一个redis服务器。(就是个应用程序而已。) 1.单机模式 我们安装redi,启动服务之后,默认就这个,只有一个redis服务器(…

编译原理笔记(哈工大编译原理)(持续更新)

文章目录 前言概论语言与文法基本概念字母表串字母表与串的联系 文法语言推导和规约句型与句子语言与字母表 文法的分类CFG的分析树 前言 说实话,我不是很想上这门课,确实没什么大用,虽然我觉得这门课学一学也挺好,但是我觉得弄8…

架构师必备项目管理方法-关键路径法

在《架构思维的六要素》中提到成本、规划、需求、维护、人员和质量是要考量的留个维度。咱们在日常工作中多少都会接触一些相关的管理方法,但是似乎是不知道也不影响干活,所以很多人也没有去深究。但实际上很可能知道了做事就更能抓住重点。 关键路径法是…

预测神经胶质瘤基因型的多模态学习

文章目录 Multi-modal learning for predicting the genotype of glioma摘要本文方法多模态数据生成Brain networks construction via self-supervised NNsMulti-modal learning for image, geometrics and brain networksBi-level multi-modal contrastive loss Population gr…

html实现好看的个人介绍,个人主页模板3(附源码)

文章目录 1.设计来源1.1 主界面1.2 关于我界面1.3 教育成就界面1.4 项目演示界面1.5 联系我界面 2.效果和源码2.1 动态效果2.2 源代码2.2 源代码目录 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/131263195 …

新手Maven入门(一)

Mavenue介绍和基本概念 一、什么是Maven1.1 Maven的组成1.2 安装和配置Maven1.2.1 下载1.2.2 安装 二、Maven 的基本概念2.1 标准的目录结构2.2 POM 大纲2.2.1 pom大纲展示 2.3 构件2.3.1 什么是maven的构建 2.4 POM 文件的用例2.5 GAV 坐标 三、依赖 一、什么是Maven Maven 是…

2023年前端面试汇总-计算机网络

1. HTTP协议 1.1. GET和POST的请求的区别 Post 和 Get 是 HTTP 请求的两种方法,其区别如下: 1. 应用场景 GET 请求是一个幂等的请求,一般 Get 请求用于对服务器资源不会产生影响的场景,比如说请求一个网页的资源。而 Post 不是…

如何在Ubuntu上安装MongoDB?

一、Ubuntu安装MongoDB MongoDB安装很简单,无需下载源文件,可以直接用apt-get命令进行安装。 打开终端,输入以下命令 sudo apt-get install mongodb这时装好以后应该会自动运行mongod程序,通过命令查看进程是否已经启动 pgrep …

Spring 实现AOP常见的两种方式(注解或者自定义注解)

第一种 导入AOP相关坐标(依赖冲突解决办法&#xff0c;将依赖中版本号删除&#xff0c;springboot会自动匹配合适的版本 ) <dependencies><!--spring核心依赖&#xff0c;会将spring-aop传递进来--><dependency><groupId>org.springframework</gr…

自动化测试必会之数据驱动测试

数据驱动测试 在实际的测试过程中&#xff0c;我们会发现好几组用例都是相同的操作步骤&#xff0c;只是测试数据的不同&#xff0c;而我们往往需要编写多次用例来进行测试&#xff0c;此时我们可以利用数据驱动测试来简化该种操作。 参数化&#xff1a; 输入数据的不同从而产…

C语言:输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。

题目&#xff1a; 描述 输入两个升序排列的序列&#xff0c;将两个序列合并为一个有序序列并输出。 输入描述&#xff1a; 输入包含三行&#xff0c; 第一行包含两个正整数n, m&#xff0c;用空格分隔。n表示第二行第一个升序序列中数字的个数&#xff0c;m表示第三…

C++ 教程(12)——循环

C 循环 有的时候&#xff0c;可能需要多次执行同一块代码。一般情况下&#xff0c;语句是顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。 编程语言提供了允许更为复杂的执行路径的多种控制结构。 循环语句允许我们多次…

朋友圈功能合集来咯!定时发朋友圈,查看朋友圈,朋友圈跟圈,一键转发朋友圈,延迟评论

&#x1f30a;发布朋友圈 功能介绍&#xff1a;可使用已登录在系统上的微信号发送朋友圈。支持发送图片、文字、视频和公众号链接等几种类型的内容。 &#xff08;1)朋友圈内容编辑&#xff1a;可以在输入框中输入要发送的文本&#xff0c;并在浮窗中选择表情。上传图片可以点…

【c++11】c++11特性

c11 c11简介列表初始化std::initializer_list autodecltypenullptr 结语 c11简介 从C0x到C11&#xff0c;C标准10年磨一剑&#xff0c;第二个真正意义上的标准珊珊来迟。相比于C98/03&#xff0c;C11则带来了数量可观的变化&#xff0c;其中包含了约140个新特性&#xff0c;以…

QT QTreeView\QTreeWidget控件 使用详解

本文详细的介绍了QTreeView、QTreeWidget控件的各种操作&#xff0c;例如&#xff1a;新建界面、QTreeWidget、QTreeView、控件布局、设置列、设置宽高、设置列表头、设置复选框、设置图标、添加树、删除树、查找树、修改树、设置选中、树排序、事件、信号、槽函数、添加节点、…

【玩转Docker小鲸鱼叭】MacOS系统安装Docker

安装Docker Mac 系统安装 Docker 其实很简单&#xff0c;我们在官方文档下载安装一下就可以了&#xff0c;但是需要注意 Docker 官方建议 MacOS 必须是版本 11 或更高版本&#xff0c;如果版本较低&#xff0c;建议先升级 MacOS 版本。 可以通过左上角的小  图片查看系统版…

浅析Spring-kafka源码——消费者模型的实现

SpringBoot项目中的消费端实现而言,Spring-kafka没有用原生的ConsumerConnector,,而是借助原生client的拉取消息功能做了自己的消费模型的实现,提供了@KafkaListener注解这种方式实现消费。 开发中在使用Spring-kafka时,一般也都是通过使用@KafkaListener注解的方法来实现…

Android MPAndroidChart折线图渐变填充实现

效果如下&#xff1a; 以下是一个从上到下渐变的drawable&#xff0c;上面是蓝色&#xff0c;逐步向下变成白色&#xff1a; chart_bg.xml <?xml version"1.0" encoding"utf-8"?> <shape xmlns:android"http://schemas.android.com/apk…

静态链接和动态链接 -- 静态加载(隐式调用)和动态加载(显式调用)

区别 静态链接和动态链接 静态链接 : 由链接器在链接时将库的内容加入到可执行程序中&#xff0c;这里的库是静态库&#xff0c;Windows下是*.lib后缀&#xff0c;Linux下是*.a后缀。动态链接 : 可执行程序加载时(静态加载) 或者 运行时(动态加载)&#xff0c;将库文件中的内容…