原文出处:RTC在不同业务场景下的最佳音质实践

背景介绍

WebRTC是目前实时音视频领域最流行的开源框架。2010年Google收购GIPS引擎后,将其纳入Chrome体系且开源后,命名为“WebRTC”。WebRTC获得各大浏览器厂商的支持并纳入W3C标准,促进了实时音视频在移动互联网应用中的普及。2021年1月,W3C和IETF两大标准制定组织宣布WebRTC成为官方标准,用户无需下载额外组件或单独的应用程序,便可以支持在网络上的实时音视频通信。尽管WebRTC具有免费开源的特性,但其庞大、繁杂,学习门槛高,又缺乏服务器方案的设计和部署,为基于WebRTC搭建的商用方案留下了发展空间。第三方的RTC PaaS厂商凭借规模效应和技术优势成为开发者的首选,推动实时音视频行业进入发展的快车道。

本篇将重点结合webrtc的音频引擎架构,分析其背后影响音质的关键技术点,并将介绍目前业内主流RTC厂商的不同业务场景背后的差异化技术方案下的选型思考,揭秘全链路场景下的最佳音质提升方案。

1.webrtc音频架构介绍

整个RTC的音频架构如上图所示:

2.影响rtc音质的因素

根据1中音频架构描述,影响rtc端到端音质体验的全链路因素,集中在四个方面,也即:音频设备,音频3A, 音频编码器,Neteq。

2.1 音频设备

音频设备是影响音质的源头,但不同端的音频设备特性不同,表现也不同,因此,提高音质的第一步,就是要深入了解各个端的音频设备的差异性;

2.1.1 Android端

Java: AudioRecord/AudioTrack

Opensles: C++ ———— (低延迟,业内主流)

AAudio———问题较多,待完善

AudioMode:

AudioSource:

StreamType: 影响音量条

业内通常做法:由于Android的碎片化问题,不同的手机厂商,对不同音频驱动的支持能力不同,兼容性差异较大,即使是最常见的Java模式和Opensles模式,也存在适配问题;因此,rtc厂商在Android端通常都会针对上面参数结合不同Android机型做配置下发来解决稳定性问题和可用性问题;如下所示,是典型的一种配置下发的参数:

{
  "audioMode": 3,
  "audioSampleRate": 48000,
  "audioSource": 7,
  "query": "oneplus/default ",
  "useHardwareAEC": true,
  "useJavaAudioClass": true
}

目前RTC领域,opensles大量使用,其中一个原因,从架构上看,ADM(AudioDeviceModule)是C++层统一管理,c++层数据回调方便减少从java->jni->c++的数据回调耗时;

声道对采集音质的影响:通常来说,双声道采集下的频谱成分相比较单声道采集更丰富

Android硬件3A,原生Android支持硬件AEC和ANS开启和关闭,但由于目前国内Android手机厂商定制Rom修改,导致大部分android手机厂商在硬件3A下强制开启硬件AEC和ANS, 无法真正关闭;

2.1.2 IOS端

2.1.3 Windows端

<音频设置中的增强功能开关>

<开启音频增强后,带来的频谱缺失>

<模拟增益与麦克风加强>

2.1.4 Mac端

2.1.5 音频设备常见的问题及解决方案

举几个例子:

(1)采集异常:

采集异常主要体现在频谱 “模糊”,严重的会导致无法听懂语义,影响正常交流。如下语谱图。

另外,采集异常后,播放的信号被麦克风采集后也会表现出异常,从而引起严重的非线性失真,影响回声消除效果,如下图。

(2)采集抖动

常见的就是采集丢数据,听感上会听到有很多高频噪点(下图为上图中噪点放大后的局部图),严重的会影响 AEC 算法中对延时估计准确性和远近端非因果问题,严重的会导致漏回声。

(3)爆音和音量小问题

采集爆音问题主要发生在 PC,也是 PC 端设备最应该避免的问题,影响较大,除了截顶导致的频谱失真之外,严重的非线性失真会影响回声消除效果。爆音问题需要 AGC 算法通过自适应调节 PC 端模拟增益以及麦克风加强解决。

(4)频谱缺失

设备采集侧的频谱缺失主要是硬件回调的音频采样率与实际的频谱分布不一致,即使编码器给到很高的编码码率,听感上也没有高音质的效果,此处上面已经介绍过;

(5)解决方案:

为了解决各种业务场景下的设备可用性,提高设备采集数据的准确性,常用的策略如下:

Android通过配置下发,针对不同机型,适配合适的采集采样率samplerate,audiomode, audiosource以及采用java还是opensles;

windows: 钉钉会议,用户可以选择采用dsound还是coreaudio

自动重启音频采集/播放设备;
自动降级切换音频驱动;

2.2 音频3A

音频的前处理是整个音频处理链路中的关键。麦克风采集到的原始音频数据会存在噪声、回声等各种问题,如在多人视频会议场景中,同地多设备同时开麦会造成强烈的啸声,发言者离麦克风较远会导致收音效果不佳。为提高音频质量,需要 在发送端对发送信号依次进行回声消除、降噪和音量均衡的操作,即AEC回声消除、ANS噪声抑制和AGC自动增益控制的3A处理。在通话、语聊、教学、游戏等不同场景中,实时音视频厂商需考虑场景的实际需求,对3A算法进行对应的调 整,以实现良好的音频效果。

在webrtc开源代码中,以Android端为例,webrtc会访问硬件是否有硬件ANS和硬件AEC的能力,如果有,就不启用软件aec;在实际的商业化的rtc业务场景中,无论硬件3A是否支持,软件3A都会同时开启作为兜底方案,其中主要的原因就是不同设备的硬件3A能力差异化比较大,依赖硬件3A无法做到完全可靠稳定的效果,下面重点分析下3A的原理和对音质的影响;

(1)AEC(声学回声消除)

(2)ANS(自动噪声抑制)

降噪对信号音质的影响大于回声消除模块,这一点源自于在降噪算法的设计之初,我们先验的假设底噪都是平稳信号(至少是短时平稳的),而根据这个假设,音乐跟底噪的区分度明显弱于语音跟底噪的区分度。一段悦耳的音乐,在每个频段上(尤其是高频部分)都有着丰富的细节,任何频段的损失都可能影响听感。但是,音乐在中高频(尤其是高频)部分的能量往往较低,这就导致叠加噪声之后,信噪比很小,给ANS处理带来难度。中高频的音乐细节很可能被误当做噪声处理掉,造成损伤。相比之下,人声一般集中在中低频,能量、信噪比也较高,在 ANS 处理中的损伤会相对少。

综上,音乐更容易被 ANS 误伤,在有高音质要求的音乐场景,建议降低降噪等级,甚至关闭降噪处理,尽可能从环境层面降低噪声干扰。

(3)AGC(自动增益控制)

AGC有几个关键的参数:

目标音量 - targetLevelDbfs:表示音量均衡结果的目标值,如设置为 1 表示输出音量的目标值为 - 1dB;

增益能力 - compressionGaindB:表示音频最大的增益能力,如设置为 12dB,最大可以被提升 12dB;

enum {
  kAgcModeUnchanged,
  kAgcModeAdaptiveAnalog, // 自适应模拟模式
  kAgcModeAdaptiveDigital, // 自适应数字增益模式
  kAgcModeFixedDigital // 固定数字增益模式
};

PC端支持模拟增益调节,在PC端通常会采用kAgcModeAdaptiveAnalog,即模拟增益与数字增益共同调节的方式调节音量;

2.3 编码器

Opus编码器

Opus 是由 SILK+CELT 混合的编码器,学术上的叫法叫做 USAC,Unify Speech and Audio Coding,不区分音乐语音的编解码器。这个编解码器内有个 Music detector 去判断当前帧是语音还是音乐,语音选择 silk 框架编码,音乐选择 celt 框架编码,通常建议不限制编码器固定采用哪种模式编码。

目前 WebRTC 采用 Application 是 kvoip,默认开启混合编码模式;

编码器内混合编码模式下的音乐与语音编码算法判决:

Opus编码具备以下特点:

2.4 Neteq

Neteq是webrtc的一项重要技术,主要是为了抗网络抖动,丢包等;抖动是指由于网络原因,到达接收端的数据在不同时间段,表现出的不均衡;或者说接收端接收数据包的时间间隔有大有小;而丢包是数据包经过网络传输,因为各种原因被丢掉了,经过几次重传后被成功收到是恢复包,重传也失败的或者恢复包过时的,都会形成真正的丢包,需要丢包恢复 PLC算法来无中生有的产生一些假数据来补偿。丢包和抖动从时间维度上又是统一的,在等待周期内等来了的是抖动,迟到很久才来的是重传包,超过等待周期也没等到的就是“真丢包”,neteq优化的目标之一就是要尽量降低数据包变成 “真丢包” 的概率。

NetEQ 核心模块有 MCU 模块和DSP 模块,MCU 模块负责往 jitter buffer 缓存中插入数据和取数据,以及给 DSP 的操作;DSP模块负责语音信息号的处理,包括解码、加速、减速、融合、PLC 等。同时 MCU 模块从 jitter buffer 中取包受到 DSP 模块相关反馈影响。MCU 模块包括音频包进入到 buffer,音频包从 buffer 中取出,通过语音包到达间隔评估网络传输时间延时,以及对 DSP 模块执行何种操作(加速、减速、PLC、merge)等。DSP 模块包括解码,对解码后的语音 PCM 数据进行相关操作,评估网络抖动 level,向 play buffer 传递可播放的数据等等。

Neteq当发生真正的丢包时,会采用丢包补偿 (Packet Loss Concealment,PLC) 算法。PLC 算法可以通过利用所有已得到的信息对丢失的音频包进行恰当的补偿,使之不易被察觉,从而保证了接收侧音频的清晰度和流畅度,给用户带来更好的通话体验。

在整个rtc链路中,丢包是数据在网络中进行传输时会经常遇到的一种现象,也是引起 VOIP(Voice Over Internet Phone, VOIP)通话中语音质量下降的主要原因之一。传统的 PLC 解决方案主要基于信号处理原理,基本原理是利用丢包前的解码参数信息来重构出丢失的语音信号。传统的 PLC方法最大的优点是计算简单,可在线补偿;缺点是补偿的能力有限,只能有效对抗 40ms 左右的丢包。应对长时连续突发丢包时,传统算法会出现机械音,波形快速衰减等无法有效补偿的情况;

如下图所示,在固定丢包 120ms 时,neteq_plc 算法通过简单的基因周期的重复和衰减完成丢包补偿,在长时丢包发生时,听起来有很重的机械音,而且会影响未丢包部分的波形;opus_plc 算法的补偿能力有限,只能有效补偿 40ms 左右,多于 40ms 的丢包会被衰减为静音。

因此,全链路提高音质,在网络和neteq侧,有两个技术方向可以优化:

3.不同的业务场景玩法及背后的技术选型思考

3.1 直播场景

3.2 会议场景

腾讯会议的客户端,是同样的方案:

3.3 通信场景

3.4 在线教育场景

在线教育场景,从细分领域来说,又分为普通的在线教育场景和音乐类教育场景,前者以授课内容以语音讲授为主,后者以乐器演奏为主,比如钢琴教育等;

普通教育场景,从音质的角度来说,以保语音音质清晰可懂为主,因此,常见的方案,是采用与通信场景类似的硬件3A的解决方案;

音乐教育场景本质上与直播场景类似,也是归于泛娱乐场景的一种,这类场景的背后技术选型也需要以音质为主,需要从采集源到3A,编码器等全链路保音乐为主,即以软件3A采集+音乐降噪+音乐编码的方案;

3.5 "一起看"场景

"一起看"场景是指在多人在一个房间实时语音聊天的场景下,同时一起观看同一个视频,这类应用场景以及其延伸场景包括“一起看电影”,或者在教育课堂老师放视频课件给线上同学一起观看,或者线上穿插视频剧情的剧本杀游戏等场景中。

下图是典型的目前该场景的Top1 APP "微光":

该场景下的技术难点在于,播放器的播放sdk,与rtc的sdk,是两个sdk,如何解决播放器的声音的回声消除问题,否则会议中的人,会听到两遍电影的声音,并且由于回声的存在,播放器再播放中,电影中的人声会触发语音激励,导致UI上即使上麦用户不说话,UI的音浪也会随着电影中人物说话声音而振动,因此,该场景下的难点在于消除电影回声;针对这个场景,目前有三种解决方案:

方案三更进一步的演进方案,也可以通过rtc的信令通道,将主播的播放进度操作同步到连麦端,从而做到播放进度同步,业务层逻辑可以做到最简化,性能也可以做到最优。

3.6 案例分析

3.7 行业演进趋势

由于硬件3A的实现简单,功耗比较低,在rtc领域长期处于主要的技术方案,但由于软件3A技术的发展越来越成熟,目前前沿的软件3A整体解决方案已经可以根据语音和音乐内容自适应调节算法策略,加上硬件3A下的“致命伤”——采集音质较低并且不同的android设备体验差异化较大带来了较大的适配成本,rtc的前沿技术趋势已经逐步向纯软件3A演进了。纯软件3A可以在各种场景下给用户带来体验更一致的高音质体验,并且大幅减少rtc厂商的适配人力和技术成本,但也同时需要足够的3A算法能力支撑。

为了一套 sdk满足不同业务场景下的不同音质需求,rtc厂商会提供不同的AudioProfile来做区分给用户提供设置,详见附录二。

4.总结

本文结合RTC场景下常见的的音频引擎架构,从音频设备采集,3A处理,到编码器和neteq等各个环节,对影响音质的因素从技术纬度逐个做了解析。文中结合会议,教育,娱乐等各种场景下的对音质的不同要求,阐述了不同业务场景下的音频策略和方案选型思考,并最后对行业演进趋势做了基于个人的分析和预测。

附录一:VOIP模式下采集频宽只有8Khz的探索

现象:

原因

解决方案探索

收益

设备差异性

附录二:AudioProfile的相关定义

参考声网相关接口文档

public abstract int setAudioProfile(int profile, int scenario);

编码模式(profile)

场景模式:

场景模式(scenario)会影响音频设备参数,软件3A策略以及相关的Qos策略等,与编码码率无关;不同的场景模式,对音频数据的处理侧重点不同,以及对应不同的音量条,需要根据不同的业务场景和对音质和相关技术指标不同来做选型。

附录三:参考文献:

  1. 深入浅出 WebRTC AEC 声学回声消除
  2. 白话解读 WebRTC 音频 NetEQ 及优化实践
  3. 提升 RTC 音频体验 - 从搞懂硬件开始
  4. 详解低延时高音质|回声消除与降噪篇