|
发表于 2021-11-30 13:42:06
|
显示全部楼层
谢邀。
回答里面说了很多差别,这里就举例一个比较细节的功能差异,也是蛮温馨的功能。
在QQ新版的8.0里有这样一个设计:语音进度条功能,上线之后突然登上微博热搜,那么这个温馨的功能,是如何开发出来的呢?它的技术难点又在哪里?我们有第一手资料,为你还原~
<hr/>
前一阵上了热搜的新功能
现有的这些点击播放的语音气泡真的满足了所有用户需求吗?emm…
总结一下:发送语音一时爽,接收语音想撞墙。。。
实现的功能:
1、语音消息支持点击暂停、继续播放,再也不用崩溃地“从头再来”。
2、语音消息支持进度拖动,想听哪里听哪里。
3、语音消息支持展示音量频谱,声音大小一看便知。
<hr/>
技术难点:
整个需求可以简化成三个子过程:
1、 音频数据转波形
2、 接收方音频数据的来源
3、 播放器支持暂停、恢复和拖动操作。这里主要介绍过程一和过程二。
<hr/>
音频数据转波形
这里主要涉及到波纹真实性问题和波纹美观两个问题。
波纹真实性是指如何用较少的波纹个数代表较多的原始PCM数据,同时保证波纹的高振幅部分代表声音响亮的部分。
波纹美观主要问题包括:1、波形持续高的地方,波形较平;2、声音突然停止,音柱落差较大
声纹真实性:
问题一、人声振幅局限
人声振幅局限:从系统拿到的原始PCM数据声音区间 IOS [0,1],android [0-32767],但人说话最大只能达到ios[0-0.32],android[0-10297],大概33%左右,导致录制的声音即使很大,波形也振幅也不高。
解决办法:数据归一化,将采集数据归一化到区间[0,255], IOS 使用函数min((x10/0.32)255,255),android使用函数min((x/(32767/255))*255/80,255)。
问题二 、波形采样
声纹的最大个数为28,但采样率16K,会员最长录音5分钟,录制数据可达到5*60*16K,怎么通过使用28个波形来代表5*60*16K个原始数据。
解决办法:一个波形代表一定时间的数据,整个原始波形被划分成一个一个的区间。
如何代表:一种是取最大值,一种是取均值,并进行试验对比。
均值的取值方式:
综合以上实验,抽样方式采用取区间方式,在区间内取均值,且以四舍五入取区间的方式进行抽样。
<hr/>
声纹美化:
在产品灰度和内部用户体验过程中,反馈的一个主要问题是声纹波形不美观。经过和设计产品讨论,得到不美观的两个原因及解决方案:
1.声音说话一直很大时,音柱高度达到最大导致波形较平。
[ 波形较平 ]
解决方案:因为是在绘制波形时添加的随机处理,为了保证UI刷新时波形不变,这里使用一种伪随机算法:以声纹个数作为随机种子,取余计算波形周期。判断音柱的高度,当超过一定值时,对音柱做正弦波处理,平滑语音波形。效果对比:
优化前
优化后
2.声音突然从低到高或者从高到低时,音柱高度落差过大,导致波形参差不齐。
[ 音柱落差较大 ]
解决方案:减速插值和平均综合
减速插值器:低振幅波纹绘制高度递增大于高振幅波纹绘制高度递增,下图形象说明:
减速插值器使用的函数为y=1-(1-t)^(2f) ,通过f(factor)去调整减速的大小,在实际过程中,经过对比,f取值为1.5,即对应上面绿色的线。
平均综合:在减速插值后,如果相邻两根音柱高度差仍较大,超过阈值时,则拔高低的音柱,从而降低音柱的落差。拔高的方式主要使用平均值法,即取两条音柱高度的平均。效果对比:
优化前
优化后
经过上述两种波形处理后,在保持用户能够区分语音有无声音的同时,也有一个相对美观的视觉效果。
<hr/>
接收方音频数据来源
接受方有两种方式产生波形数据,一种是接受数据后在本地解码,产生原始PCM数据(接收方解码方案);第二种在发送方,发送方将处理好的波形数据点发送给接受方(发送方传输波纹特征方案)。如何在这两种方案间取舍?先各自分析一下每个方案的优缺点:
接收方解码方案
优点:
1、 Ptt消息传输过程完全不需要改动
2、 兼容各个版本
缺点:
性能较差,每收到一个ptt都需要额外开启一个解码线程去解码,在群聊天中,如果有大量的ptt消息,会有很大的性能问题。
发送方传输波纹特征方案
缺点:
1、 Ptt消息传输需要增加波纹特征
2、 PC版本和老版本没有波纹特征数据,无法绘制波纹
优点:
接受方不需要解码没有性能问题。
结论:虽然接收方解码方案比发送方传输波纹特征方案的有点还多一个,但是接收方解码方案的性能问题是致命的,没有好的方法去优化同一时间接收大量ptt消息场景。因此选择了发送方传输波纹特征方案,同时为了兼容各个版本,在没有波纹特征数据时,接收方会随机生成波纹来统一交互。
<hr/>
产品的意义对未来的展望
语音进度条发布后,很好的满足了用户在收听过程中被打断时需要暂停和继续,以及需要重复收听时可以灵活地选择起始位置的诉求。大大地节省了时间用户收听语音消息的时间,提高了效率。接下来,我们还将继续挖掘用户在语音沟通中的痛点和诉求,新增语音消息倍速播放、语音自动转文字等功能,进一步提供用户的沟通效率,让沟通更加灵活和便捷。
补充:和创新点相关的小故事
语音消息作为如今最基本的沟通方式已经在各大社交APP中被广泛使用,走路运动过程、眼神不好的老人、不会打字的小孩,都可以用语音来发送信息,与人交流,为人们的线上沟通提供了极大的方便。
然而,对于语音接收方来说,收听语音消息是一件相对比较耗时的事情,比如,一个人阅读400字的文本消息只需要20秒,而听完一段400字的语音则需要1分钟。在同样的信息量下,收听语音消比阅读文字消息整整需要花多3倍的时间!
而且,现有的社交APP中,语音消息的收听必须是一件连贯的事情,一旦中途被打断,必须从头再听一遍;或者语音消息的某部分未听清楚,也必须从头再听一遍。
因此,收听语音消息对于接收者来说,可能是一件非常耗时和低效的事情。而目前的语音转文字功能,虽然能一定程度上解决阅读效率的问题,但是由于发送者的口音、语音识别技术的不成熟,转文字的过程往往会存在无法识别、识别错误或识别偏差的现象,此时,接收者还是需要通过收听语音来准确获取消息的内容。
基于以上的种种现象,我们在QQ上提出对语音消息支持暂停、继续播放、进度拖动的语音进度条功能,然后用户在收听过程可以随时暂停、随时继续、随意拖动,想听哪里就听哪里,极大地增强了语音消息收听过程的灵活性和语音消息的收听效率,解决用户的一大痛点。
<hr/>
腾讯技术工程来到知乎啦。本号立足于计算机以及互联网领域技术相关话题,特别是前沿领域的探索,目的是为技术爱好者提供专业、有见解的技术话题,将鹅厂最新的技术文章传递给知友,同时为研究人员提供讨论和参与的开放平台,共建技术生态圈。
腾讯技术工程未来也会邀请广大的鹅厂技术人员,作为我们的智囊团,为知友解答工作中的技术困惑,同时也请大家多多为我们仔细准备的回答点个『赞』,让我们在分享和鼓励中共同进步。有任何建议,欢迎私信我们!
更多技术干货请持续关注『腾讯技术工程』知乎号以及订阅我们的专栏『腾讯技术』。 |
|