當我們使用像Skype、QQ這樣的工具和朋友流暢地進行語音視頻聊天時,我們可曾想過其背后有哪些強大的技術在支撐?本文將對網(wǎng)絡語音通話所使用到的技術做一些簡單的介紹,算是管中窺豹吧。
一、概念模型
網(wǎng)絡語音通話通常是雙向的,就模型層面來說,這個雙向是對稱的。為了簡單起見,我們討論一個方向的通道就可以了。一方說話,另一方則聽到聲音。看似簡單而迅捷,但是其背后的流程卻是相當復雜的。我們將其經(jīng)過的各個主要環(huán)節(jié)簡化成下圖所示的概念模型:
這是一個最基礎的模型,由五個重要的環(huán)節(jié)構成:采集、編碼、傳送、解碼、播放。
1. 語音采集
語音采集指的是從麥克風采集音頻數(shù)據(jù),即聲音樣本轉換成數(shù)字信號。其涉及到幾個重要的參數(shù):采樣頻率、采樣位數(shù)、聲道數(shù)。
簡單的來說:采樣頻率,就是在1秒內(nèi)進行采集動作的次數(shù);采樣位數(shù),就是每次采集動作得到的數(shù)據(jù)長度。
而一個音頻幀的大小就等于:(采樣頻率×采樣位數(shù)×聲道數(shù)×時間)/8。
通常一個采樣幀的時長為10ms,即每10ms的數(shù)據(jù)構成一個音頻幀。假設:采樣率16k、采樣位數(shù)16bit、聲道數(shù)1,那么一個10ms的音頻幀的大小為:(16000*16*1*0.01)/8 = 320 字節(jié)。計算式中的0.01為秒,即10ms。
附:可以參考了解語音視頻采集組件MCapture相關介紹及Demo源碼與SDK下載。
2. 編碼
假設我們將采集到的音頻幀不經(jīng)過編碼,而直接發(fā)送,那么我們可以計算其所需要的帶寬要求,仍以上例:320*100 =32KBytes/s,如果換算為bits/s,則為256kb/s。這是個很大的帶寬占用。而通過網(wǎng)絡流量監(jiān)控工具,我們可以發(fā)現(xiàn)采用類似QQ等IM軟件進行語音通話時,流量為3-5KB/s,這比原始流量小了一個數(shù)量級。而這主要得益于音頻編碼技術。
所以,在實際的語音通話應用中,編碼這個環(huán)節(jié)是不可缺少的。目前有很多常用的語音編碼技術,像G.729、iLBC、AAC、SPEEX等等。
3. 網(wǎng)絡傳送
當一個音頻幀完成編碼后,即可通過網(wǎng)絡發(fā)送給通話的對方。對于語音對話這樣Realtime應用,低延遲和平穩(wěn)是非常重要的,這就要求我們的網(wǎng)絡傳送非常順暢。
4. 解碼
當對方接收到編碼幀后,會對其進行解碼,以恢復成為可供聲卡直接播放的數(shù)據(jù)。
5. 語音播放
完成解碼后,即可將得到的音頻幀提交給聲卡進行播放。
附:可以參考了解語音播放組件MPlayer相關介紹與Demo源碼與SDK下載
二、實際應用中的難點及解決方案
如果僅僅依靠上述的技術就能實現(xiàn)一個效果良好的應用于廣域網(wǎng)上的語音對話系統(tǒng),那就沒什么太大的必要來撰寫此文了。正是有很多現(xiàn)實的因素為上述的概念模型引入了眾多挑戰(zhàn),使得網(wǎng)絡語音系統(tǒng)的實現(xiàn)不是那么簡單,其涉及到很多專業(yè)技術。當然,這些挑戰(zhàn)大多已經(jīng)有了成熟的解決方案。首先,我們要為“效果良好”的語音對話系統(tǒng)下個定義,我覺得應該達到如下幾點:
低延遲。只有低延遲,才能讓通話的雙方有很強的Realtime的感覺。當然,這個主要取決于網(wǎng)絡的速度和通話雙方的物理位置的距離,就單純軟件的角度,優(yōu)化的可能性很小。
背景噪音小。
聲音流暢、沒有卡、停頓的感覺。
沒有回音。
下面我們就逐個說說實際網(wǎng)絡語音對話系統(tǒng)中額外用到的技術。
1. 回音消除 AEC
現(xiàn)在大家?guī)缀醵家呀?jīng)都習慣了在語音聊天時,直接用PC或筆記本的聲音外放功能。殊不知,這個小小的習慣曾為語音技術提出了多大的挑戰(zhàn)。當使用外放功能時,揚聲器播放的聲音會被麥克風再次采集,傳回給對方,這樣對方就聽到了自己的回音。所以,實際應用中,回音消除的功能是必需的。
在得到采集的音頻幀后,在編碼之前的這個間隙,是回音消除模塊工作的時機。
其原理簡單地來說就是,回音消除模塊依據(jù)剛播放的音頻幀,在采集的音頻幀中做一些類似抵消的運算,從而將回聲從采集幀中清除掉。這個過程是相當復雜的,而且其還與你聊天時所處的房間的大小、以及你在房間中的位置有關,因為這些信息決定了聲波反射的時長。 智能的回音消除模塊,能動態(tài)調(diào)整內(nèi)部參數(shù),以最佳適應當前的環(huán)境。
2. 噪聲抑制 DENOISE
噪聲抑制又稱為降噪處理,是根據(jù)語音數(shù)據(jù)的特點,將屬于背景噪音的部分識別出來,并從音頻幀中過濾掉。有很多編碼器都內(nèi)置了該功能。
3. 抖動緩沖區(qū) JitterBuffer
抖動緩沖區(qū)用于解決網(wǎng)絡抖動的問題。所謂網(wǎng)絡抖動,就是網(wǎng)絡延遲一會大一會小,在這種情況下,即使發(fā)送方是定時發(fā)送數(shù)據(jù)包的(比如每100ms發(fā)送一個包),而接收方的接收就無法同樣定時了,有時一個周期內(nèi)一個包都接收不到,有時一個周期內(nèi)接收到好幾個包。如此,導致接收方聽到的聲音就是一卡一卡的。
JitterBuffer工作于解碼器之后,語音播放之前的環(huán)節(jié)。即語音解碼完成后,將解碼幀放入JitterBuffer,聲卡的播放回調(diào)到來時,從JitterBuffer中取出最老的一幀進行播放。
JitterBuffer的緩沖深度取決于網(wǎng)絡抖動的程度,網(wǎng)絡抖動越大,緩沖深度越大,播放音頻的延遲就越大。所以,JitterBuffer是利用了較高的延遲來換取聲音的流暢播放的,因為相比聲音一卡一卡來說,稍大一點的延遲但更流暢的效果,其主觀體驗要更好。
當然,JitterBuffer的緩沖深度不是一直不變的,而是根據(jù)網(wǎng)絡抖動程度的變化而動態(tài)調(diào)整的。當網(wǎng)絡恢復到非常平穩(wěn)通暢時,緩沖深度會非常小,這樣因為JitterBuffer而增加的播放延遲就可以忽略不計了。
在語音對話中,要是當一方?jīng)]有說話時,就不會產(chǎn)生流量就好了。靜音檢測就是用于這個目的的。靜音檢測通常也集成在編碼模塊中。靜音檢測算法結合前面的噪聲抑制算法,可以識別出當前是否有語音輸入,如果沒有語音輸入,就可以編碼輸出一個特殊的的編碼幀(比如長度為0)。
特別是在多人視頻會議中,通常只有一個人在發(fā)言,這種情況下,利用靜音檢測技術而節(jié)省帶寬還是非??捎^的。
5. 混音算法
在多人語音聊天時,我們需要同時播放來自于多個人的語音數(shù)據(jù),而聲卡播放的緩沖區(qū)只有一個,所以,需要將多路語音混合成一路,這就是混音算法要做的事情。即使,你可以想辦法繞開混音而讓多路聲音同時播放,那么對于回音消除的目的而言,也必需混音成一路播放,否則,回音消除最多就只能消除多路聲音中的某一路。
混音可以在客戶端進行,也可以在服務端進行(可節(jié)省下行的帶寬)。如果使用了P2P通道,那么混音就只能在客戶端進行了。如果是在客戶端混音,通常,混音是播放之前的最后一個環(huán)節(jié)。
綜合上面的概念模型以及現(xiàn)實中用到的網(wǎng)絡語音技術,下面我們給出一個完整的模型圖:
本文是我們在實現(xiàn)OMCS語音部分功能的一個粗略的經(jīng)驗總結。在這里,我們只是對圖中各個環(huán)節(jié)做了一個最簡單的說明,而任何一塊深入下去,都可以寫成一篇長篇論文甚至是一本書。所以,本文就算是為那些剛剛接觸網(wǎng)絡語音系統(tǒng)開發(fā)的人提供一個入門的地圖,給出一些線索。
-
Skype
+關注
關注
0文章
27瀏覽量
13894 -
噪聲抑制
+關注
關注
0文章
29瀏覽量
12158 -
語音通話
+關注
關注
0文章
29瀏覽量
9409
原文標題:淺談網(wǎng)絡語音技術
文章出處:【微信號:Imgtec,微信公眾號:Imagination Tech】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論