1. 前言

跟着互联网技能的不断发展,越来越多的人开始测验运用或许依赖实时音视频产品处理团队交流与协作问题。在通话过程中,咱们时常会遇到因为网络波动(如拥塞、丢包、延时和颤动等)而导致的音频卡顿、掉字或许杂音等问题,影响工作功率。为处理此类音频弱网问题,业界一般选用前向纠错(Forward Error Correction,FEC)或许重传等网络战略优化办法,但这些办法存在冗余率过高、带宽运用功率低一级缺点,而提高音频编码器的编码功率和抗丢包才能、提高带宽运用功率,是处理音频弱网问题更为高效的一种办法。Opus 作为 RTC 范畴广泛运用的音频编码器,其编码质量较高,且供给必定的抗丢包才能,但是在高丢包以及突发丢包场景,音质会显着下降,一起,其编码功率也有进一步提高的空间。RTC 自研 NICO(Network Intelligent Audio Coding,NICO)编码器在彻底兼容Opus 的基础上,极大提高了编码功率,并供给了超强的抗丢包才能。现在 NICO 现已成功集成进火山引擎 RTC,并运用于抖音和视频会议等事务,极大提高了弱网场景音频体会。

2. 音频编解码技能简介

音频编码器是一种将音频信号进行紧缩和解紧缩的装置。一般分为 3 大类:波形编码器、参数编码器和一致编码器。

2.1 波形编码

波形编码,望文生义就是对音频信号的波形进行数字化处理。G.711 是由 ITU-T 制定的一个典型的波形编码器,码率为 64kbps,最早运用于固定电话场景,其中心思维是将每一个 14 比特的音频采样数据紧缩成 8比特 表明。G.711 运用了人耳对大能量信号不灵敏的特色,起伏大的信号量化差错大,起伏小的信号量化差错小,能够将信号码率紧缩 50% 左右。

火山引擎 RTC 自研音频编码器 NICO 实践之路

2.2 参数编码

跟着科学家对语音信号的特性和人耳感知声响的机制了解更加深入,参数编码器逐步在语音编码和音频编码范畴成为主流。参数编码就是指经过对信号提取若干个特征参数,并对特征参数进行量化紧缩的办法。参数编码不以波形匹配为原则,而是经过对信号中的关键特征进行提取,并以高效的量化办法进行紧缩,到达高质量康复信号关键信息的意图。因而,参数编码器的编码功率也要显着高于波形编码器。下面别离针对语音和音频信号的参数编码办法进行阐明。

2.2.1 语音编码

下图是一个码鼓励线性猜测(Codebook Excitation Linear Prediction,CELP)编码器体系框图,是一个典型的参数语音编码器。首要运用了语音信号具有短时相关性和长时相关性的特色,运用线性猜测的办法去除相邻样点间的相关性(即短时相关性),提取到线性猜测(Linear Prediction Coding,LPC)系数,经过剖析语音信号中的长时相关性提取基音周期参数,去除语音信号中的长时相关性,然后运用随机码书拟合随机鼓励信号,经过剖析合成的办法取得最佳编码参数。这种办法只需求对 LPC 系数、基音周期、随机码书和两个增益参数进行量化紧缩,解码端就能够康复高质量语音。参数编码器只需求不到 20kbps 的码率即可到达与 G.711@64kbps 相同的质量,编码功率具有显着的优势。典型的编码器有:G.729、AMR-NB 和 AMR-WB 等。

火山引擎 RTC 自研音频编码器 NICO 实践之路

2.2.2 音频编码

下图是一个典型的频域编码器体系框图。音乐信号和自然界的声响是经过不同的载体进行发声的,发声办法也千差万别,不太或许运用发声办法进行建模。换句话说,运用语音编码的办法编码音频信号的编码功率不高,编码质量比较差。于是科学家另辟蹊径,经过对人耳感知声响的办法进行研究,发现人耳对不同频率信号的感知灵敏度也有所不同,因而发明晰一种根据心理声学模型的编码器,特别适合对音乐信号和自然界声响的编码。典型的编码器有:MP3、AAC 和 HE-AAC 等。

火山引擎 RTC 自研音频编码器 NICO 实践之路

2.3 一致编码

综上可知,语音编码器只适合编码语音信号,音频编码器只适合编码音频信号。在实践运用场景中,咱们经常会遇到在说话过程中会有音乐或许其他背景声响的场景。那么是否存在一种编码器,能够根据信号的类型,自适应挑选最佳编码办法,到达最佳编码质量呢?答案是必定的。一致编码器选用一致结构高质量编码语音信号和音频信号,它能够很好的处理混合语音和音乐信号的高质量编码问题。典型的一致编码器有:Opus、EVS 和 USAC 等。

火山引擎 RTC 自研音频编码器 NICO 实践之路

3. 自研 NICO 编码器技能优化

为了处理 Opus 编码器在高丢包以及突发丢包场景中质量变差的问题,自研 NICO 编码器引入了多种编码东西和创新技能,以提高编码器抗高随机丢包和突发丢包的才能。别的,在提高编码功率的一起,NICO 完成了与 Opus 编码器彻底兼容,处理了与现网 RTC 设备互联互通的问题。

3.1 抗弱网编码技能及优化

3.1.1 多描绘编码

多描绘编码是一种专门为弱网场景规划的编码技能,其中心思维是“编码器产生的多个描绘码流相互独立又互为补充”。单个多描绘码流就能够解码取得完整语音,每多收到一个多描绘码流,取得的解码语音质量能够得到进一步增强。多描绘编码办法是一种十分适合在无可靠传输网络场景运用的编解码技能,能够有效削减因为丢包引起的各种音频卡顿问题,但是在无丢包场景,其解码质量差于单码流编码器。而且,多描绘编码算法的复杂度要比单码流编码器高许多,多描绘码流个数越多,复杂度就会成倍添加,这也在必定程度上约束了多描绘编码技能的运用。

针对上述问题,咱们在规划多描绘编码算法时,对现有多描绘编码技能和 Opus 编码器中 NSQ 量化办法进行了具体的剖析。咱们发现,现有算法只能做到宽带多描绘编码,且高频质量显着差于Opus,一起 Opus 中 NSQ 量化办法十分复杂,根据 Opus 的多描绘编码复杂度会显着偏高。咱们经过多种技能优化,处理了上述难题,使 NICO 支持了窄带到全带的多描绘编码,满足了不同运用场景对编码音质的差异化需求,一起保证了 NICO 在无丢包场景编码质量能对齐乃至稍优于 Opus,在高丢包场景显着优于 Opus,而编码复杂度和 Opus 适当。

火山引擎 RTC 自研音频编码器 NICO 实践之路

3.1.2 带内 FEC 算法

带内 FEC 算法是一种在当时帧码流中带着曩昔前史帧码流的一种办法,与带外 FEC 算法相比,其削减了 RTP 头部开销,比特运用功率更高。当 Opus 码流带着带内 FEC 信息时,假如当时帧码流数据丢掉,解码器能够经过解析下一帧码流中的带内 FEC 信息解码当时帧音频。Opus 带内 FEC 有不错的对抗随机丢包的才能,但对突发丢包无能为力,敞开带内 FEC 也会导致编码复杂度显着上升,并且其带内 FEC 帧信息在无丢包时不会带来额外的质量提高,带宽运用功率不高。在实践运用场景中,咱们还发现带内 FEC 占用码率过多,影响主帧编码质量,会导致杂音的问题。

为处理上面这些问题,NICO 带内 FEC 算法做了许多创新,全面优化了编码流程和码率分配等环节,提高了编码功率,降低了编码复杂度,并且在突发丢包场景,NICO 的效果远优于 Opus。

火山引擎 RTC 自研音频编码器 NICO 实践之路

3.1.3 丢包躲藏算法

丢包躲藏(Packet Loss Concealment,PLC)算法是指当时帧的码流因为某种原因丢掉时,解码器运用前史解码数据或许参数猜测当时帧解码数据的算法。PLC 算法作为康复丢掉帧音频的最终处理计划,是大多数音频编码器中常用的技能,对提高丢包场景下的主观听感有较大作用。Opus 的 PLC 算法对丢包帧处理较为简略,对于能量、基音周期等参数仅仅做简略的衰减或许仿制等操作,康复出的音频经常会呈现能量偏低、杂音等问题。NICO 对此进行了很多改善,参阅了前史帧的改变趋势,对于丢包帧解码参数猜测更为精确,康复的音频听感较 Opus 有显着提高。

3.2 编码质量提高

3.2.1 带宽扩展算法

带宽扩展(BandWidth Extension,BWE)是一种运用少量比特编码高频信息,高质量康复高频信号的算法。在 Opus 编码器中,所选用的 BWE 技能是以填充随机噪声的办法康复高频空泛,这种办法会导致康复出的高频信号能够听到显着的高频噪声,体会较差;在低码率编码办法中,还会运用频谱折叠的办法康复高频,因为没有考虑高频与低频信号的相关性,折叠后的高频部分与原始信号往往相差较大,有时会听到显着的高频量化噪声。在 NICO 编码器中,咱们对 BWE 算法进行了改善,充分运用高频与低频信号的相关性优化高频康复效果,提高了低码率条件下音频信号的康复质量。

下图是低码率 Opus 和 NICO 解码音频的频谱比照。能够看出,在高频部分,Opus 运用随机噪声康复,而 NICO 康复了更多的高频细节,与原始信号更为挨近。

火山引擎 RTC 自研音频编码器 NICO 实践之路

3.2.2 不接连传输算法

不接连传输(Discontinuous Transmission,DTX)是指 VAD 算法检测到非活动语音时,编码器会削减数据发送,只间隔性发送低字节数的静音描绘帧(Silence Insertion Descriptor,SID),到达降低编码码率的意图。舒适噪声生成(Comfort Noise Generation,CNG)指的是解码端收到 SID 帧后会根据解码参数生成舒适噪声,保持听感接连。Opus 的 DTX/CNG 算法存在编解码端 CPU 耗费偏高、VAD 算法不行精确导致呈现不平稳噪声等问题。针对上述问题,咱们对 DTX/CNG 算法做了一系列优化,改善了编码端 VAD 算法和编解码处理逻辑,处理了舒适噪声不平稳问题,还大幅降低了 DTX 段编码端与解码端的 CPU 耗费。

以下是 Opus 和 NICO 解码带噪语音的效果比照,Opus 解码音频在噪声段不行平稳,而 NICO 解码音频噪声段能量平稳,听感更佳。

火山引擎 RTC 自研音频编码器 NICO 实践之路

3.2.3 动态形式切换

在实践通话过程中,用户的网络状况或许比较复杂。为了在各种网络状况下取得最佳通话质量,咱们规划了动态形式切换功用。编码器能够根据网络反应的网络状况信息自适应调整编码形式。当用户网络状况很好时,编码器根据网络反应的丢包率信息自动切换到 Opus 编码形式,以取得更优语音通话质量;当用户网络状况变差时,编码器根据网络反应的丢包率以及带宽等信息,从 Opus 编码动态滑润切换到 NICO 形式编码,提高编码器的抗丢包才能。

火山引擎 RTC 自研音频编码器 NICO 实践之路

3.3 兼容 WebRTC 的规划

传统计划中,让具有不同编码器才能的终端进行通讯,往往需求服务器进行转码再转发的操作,而转码操作会形成音质下降、复杂度添加和延时变长等问题。NICO 编码器经过独特的码流规划,使得 NICO 的码流与 Opus 彻底兼容。换句话说,具有 NICO 编码才能的客户端能和 Web 端等原生 WebRTC 运用直接进行互通,不仅规避了转码服务器带来的各种问题,还拓展了 NICO 的运用范畴,在 P2P 通讯和不同厂商间互联互通等场景都能无障碍运用 NICO。

火山引擎 RTC 自研音频编码器 NICO 实践之路

为了到达与原生 Opus 彻底兼容的意图,NICO 的码流结构和 Opus 彻底一致。当只有 Opus 解码才能的终端在接收到 NICO 的码流时,也能解码出正常质量的语音,听感较解码原生 Opus 的码流无显着差异;而具有 NICO 解码才能的终端解析 NICO 的码流时,便能运用到 NICO 的抗丢包才能,在丢包场景下到达远优于 Opus 的效果。

以下三段音频别离是原始音频、运用 Opus 编解码音频和运用 NICO 编码 Opus 解码的音频,能够感受到,对于相同音频序列,运用 NICO 编码的码流被 Opus 解析时,解码音质较 Opus 编解码简直无差异。音频体会点击:「链接」。

3.4 复杂度优化

为提高抗丢包才能并彻底兼容 Opus 码流,NICO 编码器做了十分多的技能创新和改善,一起对复杂度也做了许多优化工作,到达对齐 Opus 的水平。这些优化工作在保证质量的一起降低了 NICO 的复杂度,保证 NICO 在低端机器上都能够流畅运转。

下图为 NICO 和 Opus 编码器 CPU 耗费比照成果,测验选用了实时率(Real-Time Factor,RTF)作为 CPU 耗费衡量指标。在 iPhone Xs Max 手机上,NICO 在优化特性都敞开的状况下,CPU 耗费相较于 Opus 关闭带内 FEC 添加了9%,而相较于 Opus 翻开带内 FEC 降低挨近 15%。

火山引擎 RTC 自研音频编码器 NICO 实践之路

3.5 质量比照

咱们评价了 NICO 与 Opus 敞开带内 FEC 在同等码率、无丢包、随机丢包 30%、40% 和突发丢包 25% 测验条件下的 POLQA 打分。成果显现,Opus 解码音频质量跟着丢包率的添加有显着下降,在突发丢包场景下,更是降到 2 分以内。NICO 解码音频跟着丢包率的添加,MOS 分有必定程度下降,但下降缓慢且显着优于 Opus。在突发丢包 25% 时,NICO 的 MOS 分挨近 4 分,远远好于 Opus。

火山引擎 RTC 自研音频编码器 NICO 实践之路

下面是 Opus 和 NICO 在 40% 随机丢包和 25% 突发丢包条件下的频谱比照示意图。从频谱图上来看,Opus 在随机丢包场景会频繁呈现因 PLC 形成的能量衰减、频谱能量不接连的状况,而 NICO 的频谱康复效果更好,有更好的接连性,没有显着的频谱上的损伤。

火山引擎 RTC 自研音频编码器 NICO 实践之路

在突发丢包场景,Opus 解码音频会呈现语音听感显着不接连、卡顿掉字等现象,而 NICO 解码音频的接连性十分好,无任何卡顿。

火山引擎 RTC 自研音频编码器 NICO 实践之路

文档中为一条音频序列的测验成果,感兴趣的朋友能够点击「链接」自行体会效果差异。

3.6 小结

能够看出,相较于带外 FEC、重传等网络战略,提高编码器抗弱网才能和编码质量是处理音频弱网痛点问题性价比更优的计划。相比业界已有计划,NICO 编码器的技能优化和创新工作具有以下几项优点:

  • 全面支持窄带到全带多描绘编码,满足不同事务场景对编码音质的差异化需求,改善带内 FEC 和 PLC 算法,在高丢包与突发丢包场景,弱网抗性显着优于 Opus 编码器;
  • 改善 BWE、DTX 和 CNG 等算法,提出动态编码形式切换办法,显着提高编码质量;
  • 独特的码流规划彻底兼容 Opus,保证 NICO 终端与 WebRTC 终端以及不同 RTC 厂商互联互通,降低了端到端兼容性改形本钱;
  • 高效优化编码复杂度,保障在高中低端机上均能够流畅运转,运用火山引擎 RTC 运用的用户都能享受到 NICO 带来的质量提高。

4. 未来展望

现在,NICO 首要针对通话场景做了很多优化工作,提高了弱网场景的音频体会,后续咱们会将其拓展到其它场景,例如直播、连麦和空间音频传输等。一起,AI 技能为编解码器方向带来了技能革新,未来有潜力在复杂度可控和超低码率条件下完成高清音频通话,进一步提高用户在弱网场景下的通话体会,咱们将亲近重视业界相关技能的进展,不断提高火山引擎 RTC 语音相关技能的才能上限。

参阅资料

  1. Recommendation G.711 (11/1988): Pulse code modulation (PCM) of voice frequencies
  1. M. Schroeder; B. Atal, 1985. Code-excited linear prediction(CELP): High-quality speech at very low bit rates. ICASSP ’85. IEEE International Conference on Acoustics, Speech, and Signal Processing
  1. Andreas S., Ted Painter.Audio Signal Processing and Coding,2007, Wiley-Interscience
  1. Neuendorf; et al. The ISO/MPEG Unified Speech and Audio Coding Standard – Consistent High Quality for all Content Types and at all Bit Rates, 2013, Journal of the Audio Engineering Society. Audio Engineering Society
  1. J.M. Valin, RFC 6716: Definition of the Opus Audio Codec, 2012
  1. V.K. Goyal. Multiple description coding: compression meets the network, 2002,IEEE Signal Processing Magazine
  1. H Sanneck, A Stenger, A new technique for audio packet loss concealment. Proceedings of GLOBECOM’96

关于咱们

火山引擎 RTC,致力于供给全球互联网范围内高质量、低延时的实时音视频通讯才能,协助开发者快速构建语音通话、视频通话、互动直播、转推直播等丰厚场景功用,现在已掩盖互娱、教育、会议、游戏、汽车、金融、IoT 等丰厚实时音视频互动场景,服务数亿用户。

火山引擎 RTC 自研音频编码器 NICO 实践之路

扫描上方二维码加入咱们吧!