当前位置:首页>科技 >内容

网络语音通话运用了哪些技术方法_网络语音通话运用了哪些技术

2024-05-10 22:30:49科技漂亮的斑马

当我们用Skype、QQ这样的工具和朋友进行流畅的语音、文章聊天时,有没有想过背后有哪些强大的技术?本文将对网络语音通话使用的技术进行简

网络语音通话运用了哪些技术方法_网络语音通话运用了哪些技术

当我们用Skype、QQ这样的工具和朋友进行流畅的语音、文章聊天时,有没有想过背后有哪些强大的技术?本文将对网络语音通话使用的技术进行简单介绍,算是管中窥豹吧。

一、概念模型

网络电话通常是双向的,这在模型层是对称的。为了简单起见,我们可以从一个方向来讨论这段话。一边说话,另一边听到声音。看似简单快捷,背后的过程却相当复杂。我们将它所经历的主要环节简化为概念模型,如下图所示:

这是最基本的模型,由采集、编码、传输、解码、播放五个重要环节组成。

1.语音采集

语音采集是指从麦克风采集音频数据,即将声音样本转换成数字信号。它涉及到几个重要参数:采样频率、采样位数和通道数。

简单来说:采样频率就是一秒钟内采集动作的次数;采样位数是从每个采集动作中获得的数据长度。

一个音频帧的大小等于:(采样频率采样位数通道数时间)/8。

通常,一个采样帧的持续时间为10ms,即每10ms的数据构成一个音频帧。假设采样率为16k,采样位数为16bit,声道数为1,10ms音频帧的大小为:(16000*16*1*0.01)/8=320字节。公式中的0.01是秒,即10ms。

附:可以参考语音和文章采集组件MCapture的介绍以及Demo源代码和SDK的下载。

编码

假设我们直接发送收集到的音频帧而不进行编码,我们可以计算所需的带宽要求,如上例所示:320 * 100=32KBytes,如果转换为bits/s,则为256kb/s.这是很大的带宽占用。通过网络流量监控工具可以发现,使用QQ这样的IM软件进行语音通话时,流量为3-5KB/s,比原来的流量小了一个数量级。这主要是由于音频编码技术。

因此,在实际的语音通话应用中,编码是必不可少的。目前常用的语音编码技术有很多,如G.729、iLBC、AAC、SPEEX等。

3.网络传输

当一个音频帧被编码后,可以通过网络发送给对方。对于语音通话等实时应用,低延迟和流畅度非常重要,这就要求我们的网络传输非常流畅。

解码

当对方收到编码后的帧时,会对其进行解码,还原成声卡可以直接播放的数据。

5.语音回放

解码后,音频帧可以提交给声卡进行播放。

附:可以参考MPlayer的相关介绍,Demo源代码和SDK下载。

二、实际应用中的难点及解决方案

如果仅仅依靠上述技术就能实现一个适用于万的良好的语音对话系统,就没有很大的必要写这篇文章。正是诸多现实因素给上述概念模型带来了诸多挑战,使得网络语音系统的实现并不是那么简单,它涉及到很多专业技术。当然,这些挑战大多已经有了成熟的解决方案。首先,我们需要定义“有效的”语音对话系统。我认为应该做到以下几点:

低延迟。只有低延迟才能让通话双方有很强的实时感。当然,这主要取决于网速和双方物理位置的距离。从纯软件的角度来看,优化的可能性很小。

背景噪音小。

声音流畅,没有卡和停顿的感觉。

没有回复。

下面就来一一说说实际网络语音对话系统中用到的附加技术。

1.回声消除AEC

现在几乎所有人都习惯在语音聊天时直接播放PC或笔记本的语音。众所周知,这个小习惯对语音技术提出了巨大的挑战。使用外放功能时,音箱播放的声音会被麦克风再次采集并发送给对方,让对方听到自己的回声。因此,在实际应用中,回声消除功能是必不可少的。

得到采集的音频帧后,编码前的这个间隙就是回声消除模块工作的时间。

原理简单来说就是回声消除模块根据刚刚播放的音频帧,在采集的音频帧中做一些类似的消除操作,从而去除采集帧中的回声。这个过程相当复杂,也和你聊天的房间大小和你在房间里的位置有关,因为这些信息决定了声波反射的持续时间。智能回声消除模块可以动态调整内部参数,以最好地适应当前环境。

2.噪声抑制降噪

噪声抑制又称降噪,是根据语音数据的特点,识别出属于背景噪声的部分,并从音频帧中过滤掉。许多编码器都内置了这一功能。

3.抖动缓冲器

抖动缓冲区用于解决网络抖动问题。所谓网络抖动,就是网络延迟越来越小。在这种情况下,即使发送方有规律地发送数据包(比如每100ms),接收方也不可能同时收到。有时候一个周期收不到一个包,有时候一个周期收到几个包。这样,使接收者听到的声音是一次一张卡。

JitterBuffer在解码器之后、声音播放之前工作。即语音解码完成后,将解码后的帧放入JitterBuffer,当声卡的回放回调到来时,从JitterBuffer中取出最旧的帧进行回放。

JitterBuffer的缓冲深度取决于网络抖动的程度。网络抖动越大,缓冲深度越大,播放音频的延迟也越大。所以JitterBuffer是用更高的延迟来换取声音的流畅播放,因为相对于声卡逐卡,稍微延迟但更流畅的效果有更好的主观体验。

当然,JitterBuffer的缓冲深度并不总是恒定的,而是根据网络抖动的变化动态调整的。当网络恢复到非常稳定平滑的状态时,缓冲深度会非常小,因此可以忽略由于JitterBuffer而增加的播放延迟。

4.静音检测VAD

语音通话中,如果只有一方不说话,就不会有流量。静音检测用于此目的。静音检测通常也集成在编码模块中。静音检测算法结合之前的噪声抑制算法,可以识别当前是否有语音输入,如果没有语音输入,可以编码输出一个特殊的编码帧(比如长度为0)。

尤其是多人文章会议,通常只有一个人在发言。在这种情况下,使用静音检测技术节省的带宽仍然非常可观。

5.混合算法

在多人语音聊天中,我们需要同时播放多人的语音数据,而声卡只有一个缓冲区,所以我们需要将多个语音混合成一个,这就是混合算法应该做的事情。即使你能找到绕过混音的方法,让多个声音同时播放,那么为了回音消除的目的,你必须全程混音播放,否则回音消除最多只能消除多个声音中的一个。

混合可以在客户端或服务器端进行(这样可以节省下行带宽)。如果使用P2P通道,则只能在客户端进行混合。如果是在客户端混音,通常情况下,混音是播放前的最后一个环节。

结合上述概念模型和现实中使用的网络语音技术,我们给出一个完整的模型图如下:

本文是我们实现OMCS语音功能经验的粗略总结。在这里,我们只是对图中的每个环节做一个简单的说明,其中任何一个环节,如果再深入,都可以写成一篇长文,甚至一本书。因此,本文提供了一个入门图,给刚接触网络语音系统开发的人一些提示。

声明本站所有作品图文均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系我们

Top