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