详解低延时高音质:编解码篇
语音社交已经出现了数十年,而近期的“互动播客”场景让音频互动再次成为业界焦点。如何提供好的音频互动体验?怎么优化音质?如何应对全球传输下的网络挑战?如何在高音质的基础上让声音更悦耳?我们将从今天开始通过「详解低延时高音质」系列内容,从多个层面深入浅出逐一解答这些问题。
继 Elon Musk 后,Bill Gates 也开了一场“互动播客”。现在,已有很多团队开始加码音频社交场景。这个场景看似实现简单,但想让身处不同国家的用户得到相同的高音质体验,却没那么容易。
那么我们接下来就从编解码、降噪与回声消除算法、网络传输、音质优化几方面,由浅入深地讲讲高音质、低延时背后的技术原理与“改造”思路。
我们今天先来讲一下语音编解码器。不过在讲语音编解码器之前,我们需要先了解音频编解码的原理,才能更快地理解到底是什么在影响着音质体验。
语音编码与音乐编码
音频编码指的是把音频信号转化为数字码流的过程(如下图所示)。在这个过程中,音频信号会被分析从而产生特定参数。随后,这些参数会按照一定规则写入比特流。这个比特流也就是我们常说的码流。解码端接收到码流后,会按照约定好的规则将码流还原为参数,再使用这些参数构建出音频信号。
图片源自:Earlham College
音频编解码器的发展历史非常悠久,早期编解码器的核心算法是非线性量化,这是一种现在看来比较简单的算法,其压缩效率并不算高,但适用于包括语音和音乐在内的绝大多数音频类型。之后,随着技术的发展和编解码分工的细化,编解码器的演进方向分成了两条路——语音编码器和音乐编码器。
主要用来编码语音信号的语音编解码器,开始逐渐向基于时域线性预测框架的方向演化。这种编解码器参考了声道的发音特性,将语音信号分解为主要的线性预测系数和次要的残差信号。**线性预测系数编码所需的比特率非常少,却能高效的构建出语音信号的“骨骼”;残差信号则像是“血肉”,能够补充出语音信号的细节。**这种设计大幅提升了语音信号的压缩效率,但是这种基于时域的线性预测框架在有限复杂度下无法很好的编码音乐信号。
而针对音乐信号进行编码的音乐编解码器则走上了另一条演化的道路。因为相比时域信号,频域信号的信息更多的集中在少部分频点上,更利于编码器对其进行分析和压缩。所以音乐编解码器基本都会选择对在频域上对信号进行编码。
后来,随着技术日趋成熟,两种编解码架构又再次走到了一起,即语音音乐混合编码器,WebRTC 中默认使用的编解码器 Opus 就是这类编解码器。这类编解码器的特点是融合了两种编码框架,并针对信号类型自动切换合适的编码框架。一些国内外知名的产品都会用到 Opus ,比如 Discord。
语音编码中,什么在影响互动体验?
说起语音编解码器的一些技术指标,一般会谈到采样率、码率、复杂度、抗丢包能力等,那这些技术指标分别代表什么,对音频体验的影响又是怎样的呢?
你可能看到过“采样率越高,音质越好”、“编码复杂度越高越好”的说法,但事实并非如此!
一、采样率
从人耳可以听到的模拟信号,转化到计算机可以处理的数字信号,需要一个采样的过程。声音可以被分解为不同频率不同强度正弦波的叠加。采样可以想象成在声波上采集了一个点。而采样率指的就是在这个过程中每秒采样的点数,采样率越高,表示在这个转化过程损失的信息越少,也就是越接近原声。
采样率决定了音频信号的分辨率。在人耳可感知范围内,**采样率越高,高频分量就被保留的越多,这段信号的听感就越清晰明亮。**举个例子,我们打传统电话时,往往会感觉对方的声音比较沉闷,这是因为传统电话的采样率是 8kHz,只保留了能保证可懂度的低频信息,很多高频的分量被丢失了。所以想要音频互动体验越好,就需要在人耳可感知范围内尽量提高采样率。
二、码率
经过采样,声音从模拟信号转化为数字信号。码率表示的就是这个数字信号在单位时间内的数据量。
**码率决定了音频信号经过编解码后的细节还原度。**编解码器会把给定的码率按优先级分配给各个分析模块输出的参数。在编码码率有限的情况下,编解码器会优先保证对语音质量影响较大的参数进行编码,而放弃编码一些影响较小的参数。这样在解码端,因为使用的参数并不完整,所以其构建出的语音信号也会有难以避免的损伤。一般来说,同一款编解码器的码率越高,其编解码后的损伤就越小。但码率并不是越高越好,一方面,码率和编解码质量并不是线性关系,在超过“质量甜点”后,码率升高对质量的提升开始变得不明显;另一方面,在实时互动中,码率过高可能挤占带宽产生网络拥塞,从而引发丢包,反过来破坏了用户体验。
关于质量甜点:在视频领域,质量甜点指的是在既定的码率和屏幕大小下通过设定合理的分辨率和帖速率来得到最佳视频主观质量体验。在音频领域也有类似的情况。
三、编码复杂度
编码复杂度一般集中在编码端信号分析模块。一般来说,对语音信号分析的越详尽,其潜在压缩率可能就越高,所以编码效率和复杂度有一定相关性。同样的,编码复杂度和编解码质量亦不是线性关系,两者之间也存在一个“质量甜点”,能否在有限复杂度的前提下设计出高质量的编解码算法往往直接影响了编解码器的可用性。
四、抗丢包能力
首先,抗丢包的原理是什么?我们在传输音频数据的时候会遇到丢包,如果当前数据包丢失了,我们希望可以通过某种手段来猜出来或者得到当前帧大概的信息,然后利用这些不完全准确的信息,解码出一个和原始信号相近的语音帧。当然,只靠凭空猜一般是没什么好结果的,如果前一个数据包或者后一个数据包能告诉解码器当前丢失包的一些关键信息就好了,这个信息越多,越有利于解码端恢复出丢失的语音帧。这些包含在“前一个数据包”或“后一个数据包”中的“关键信息”,也就是我们之后要提到的“帧间冗余信息”。(往期我们讲过丢包对抗的更多知识)
所以,抗丢包能力和编码效率是相对互斥的,编码效率的提升往往需要尽量减少帧间的信息冗余,而抗丢包能力又依赖一定的帧间信息冗余,帧间信息冗余可以保证在当前数据包丢失时,通过前/后序语音帧恢复出当前语音帧。在实时互动场景下,因为用户的网络是非可靠网络,可能一个用户走着走着就进了电梯,或坐在高速行驶的车上。在这种网络里,充斥着丢包与延时抖动,所以编解码抗丢包能力又是不可或缺的。因此,如何平衡编码效率和抗丢包能力,也需要经过详尽的算法设计和打磨验证。
如何平衡音频体验与技术指标?
那声网是怎么做的呢?我们的工程师综合考虑了上述几点,打造了一款专为实时通讯使用的高清语音编解码器 Agora Nova(以下简称 Nova)。
32kHz 采样率
首先在采样率上的选择,Nova 并没有选择其他语音编解码器使用的 8khz 采样率或 16khz 采样率,而是选择了更高的 32kHz 采样率。这意味着 Nova 首先在通话音质的起跑线上就取得了较大的领先优势。虽然业内常用的 16kHz 采样率(备注:微信用的就是 16kHz)已经满足了语音可懂度的基本需求,但部分语音细节仍然需要更高的采样率才能捕捉到,我们希望提供更高清的语音通话能力,即既保证了可懂度,又提升了清晰度,这也是我们选择 32kHz 的原因。
优化编码复杂度
采样率越高,语音清晰度就越高,同时意味着单位时间内需要分析/编码/传输的采样点就越多,编码码率和复杂度都需要相应地增加。编码码率和复杂度的增加势必会给用户的带宽和设备性能功耗带来压力。但这不是我们想看到的。为此,我们经过理论推导和大量实验验证,设计了一套精简的语音高频分量编码系统,在分析复杂度增加很小前提下,最低使用 0.8kbps 即可实现高频信号的编码(基于不同技术,以往要表达高频信号,码率一般需要高于 1~2kbps),极大增加了语音信号的清晰度。
平衡抗丢包性能与编码效率
在抗丢包能力的保障上,我们也在保证编码效率的前提下选择了最平衡的方案,经过实验验证,这种方案即又保证了编码压缩效率,又保证了丢包时的恢复率。此外,除了 Nova,针对不稳定的网络环境,我们还研发上线了抗丢包能力更强的语音编解码器 Solo 和语音音乐混合编解码器 SoloX 等。
Agora Nova vs. Opus
Nova 有着丰富的模式选择以供不同场景选择,诸如可适应模式、高品质模式、低能耗高品质模式、超高频模式和超低比特率模式等。
如果把 Nova 和先进的开源编解码器 Opus 做对比,得益于 Nova 高效的信号处理算法,其在通用语音编码码率下,有效频谱信息要比同等码率下的 Opus 多 30%。在主、客观评价体系下,Nova 的语音编码质量高于 Opus:
客观评价层面,使用 ITU-T P.863 标准定义的客观质量评估算法对两个编解码器的编码-解码语料进行打分,Nova 得分始终比 Opus 略高一筹;
主观评价层面,经过 Nova 编解码的语音信号的还原度要高于经过 Opus 编解码的语音信号,反映在听感上就是更通透,量化噪音更小。
得益于这款高清的语音编解码器,声网 SDK 为全球用户提供了一致的高质量音频互动体验。其实一段语音通话体验的好坏,除了直接与编解码器的编码质量关联,也会极大地受到其他模块的影响,比如回声消除、降噪、网络传输等,我们将在下一期介绍声网在回声消除与降噪算法方面的最佳实践。
评论