李 強,明 艷
在語音信號處理、多媒體通信、通信原理和移動通信等課程中,都會涉及語音編碼相關(guān)的知識,如G.711A律64 kb/s的PCM編碼、第二代移動通信GSM系統(tǒng)中的RPE-LTP編碼和第三代移動通信系統(tǒng)中的AMR編碼等[1-3]。在這些理論課的授課過程中,老師大多只是講解語音編碼的基本原理、相關(guān)標準和應(yīng)用場景等內(nèi)容,學生不能親身體驗用這些標準實現(xiàn)的編碼器輸出語音的質(zhì)量,如語音的音質(zhì)、清晰度、自然度和辨識度等[4]。學習這些課程的學生也大多不會考慮用軟件,如用C語言去實現(xiàn)相關(guān)標準的語音編碼器。如果學生用軟件實現(xiàn)了這些語音編碼器,也沒有一個便捷的系統(tǒng)或平臺給予支撐,如對語音的質(zhì)量進行測試,采用這些實現(xiàn)的編碼器進行語音通話等。針對這些教學和學生對語音質(zhì)量測試和應(yīng)用的需求,本文采用了多線程模塊化的軟件結(jié)構(gòu),通過UDP/IP協(xié)議[5],利用校園局域網(wǎng)為傳輸通道,實現(xiàn)了一個語音通信實驗系統(tǒng)。該系統(tǒng)除了支持多種標準的語音編碼器進行雙向?qū)崟r通話外,還能測試編碼器語音的主觀質(zhì)量、編解碼時延、傳輸流量、語音壓縮比等指標。由于系統(tǒng)采用了模塊化的設(shè)計結(jié)構(gòu),學生可以把自己用軟件實現(xiàn)的語音編解碼器添加到系統(tǒng)的編解碼模塊中,即可利用該系統(tǒng)實現(xiàn)雙向語音實時通話,并進行性能指標的測試。因此,本文實現(xiàn)的系統(tǒng)具有良好的靈活性和擴展性,可用于與語音編碼相關(guān)課程的實驗和理論教學中。
基于局域網(wǎng)的語音通信實驗系統(tǒng)的架構(gòu)如圖1所示。系統(tǒng)由語音信號的采集,語音數(shù)據(jù)的存儲、統(tǒng)計和播放,語音編解碼器,傳輸控制和網(wǎng)絡(luò)傳輸5個部分組成。
1.1.1 語音信號的采集
系統(tǒng)通過PC機聲卡采用音頻波形API技術(shù)[6]對語音信號進行實時采集、量化和編碼。采樣率、量化方式和量化級數(shù)可根據(jù)需要通過系統(tǒng)界面進行設(shè)置。采集到的數(shù)據(jù)以語音編碼的幀長為單位填充到設(shè)置的數(shù)據(jù)緩沖區(qū)中。
圖1 基于局域網(wǎng)的語音通信實驗系統(tǒng)架構(gòu)
1.1.2 語音的存儲、統(tǒng)計和播放
在進行語音通信前,需對語音數(shù)據(jù)進行連續(xù)保存。系統(tǒng)采用乒乓存儲結(jié)構(gòu)[7],設(shè)置兩個語音緩沖隊列,輪流對兩個緩沖區(qū)讀寫數(shù)據(jù)。某一緩沖區(qū)被填滿語音數(shù)據(jù)后,系統(tǒng)立刻解鎖該緩沖區(qū),并讀取數(shù)據(jù),采用語音編碼器對數(shù)據(jù)進行壓縮編碼,形成數(shù)據(jù)碼流后,通過局域網(wǎng)發(fā)送到接收端,同時把該緩沖區(qū)重新加入語音緩沖區(qū)隊列中。
為了對發(fā)送到局域網(wǎng)的數(shù)據(jù)流量進行統(tǒng)計,在緩沖區(qū)中設(shè)定了一個事件,當壓縮后的數(shù)據(jù)碼流的數(shù)據(jù)量達到事件設(shè)定的大小,便開始發(fā)送數(shù)據(jù)。本系統(tǒng)把發(fā)送一次的數(shù)據(jù)稱為一個包,通過統(tǒng)計包的個數(shù)來計算發(fā)送的數(shù)據(jù)流量。
接收端接收到語音數(shù)據(jù)碼流后,采用與發(fā)送端相同標準的語音解碼器進行解碼,把解碼后的數(shù)據(jù)寫入接收緩沖區(qū)中。本系統(tǒng)對接收緩沖區(qū)設(shè)置了兩個指針,即播放指針和寫指針。寫指針解決數(shù)據(jù)覆蓋問題,指示用于寫入數(shù)據(jù)緩沖區(qū)的位置;而播放指針則表示當前所播放的數(shù)據(jù)末尾。接收端通過調(diào)用Media庫里的WaveOut函數(shù)對解碼后的語音進行播放。
1.1.3 語音編解碼器
本系統(tǒng)實現(xiàn)了G.711 A律PCM編碼、G.729、MELP、SMV和ARM語音編解碼器。G.711是ITU-T提出的8 kHz采樣,8 bit非均勻量化的波形編碼標準[8],廣泛用在電話通信中,其原理和方法是通信原理課程的重要內(nèi)容。G.729聲碼器使用了LPC分析合成技術(shù),通過使得實際語音與合成語音之間誤差能量最小為準則來進行編碼,該聲碼器具有較高的壓縮率;MELP采用多帶混合激勵等技術(shù)提高了合成的語音質(zhì)量,可實現(xiàn)1.2~4 kb/s的低碼率聲碼器;SMV是3G移動通信系統(tǒng)變速率語音編碼選項之一[9-11]。針對這些不同標準,不用應(yīng)用場景的語音編碼器,本文系統(tǒng)通過調(diào)用語音編解碼器函數(shù)的方式來實現(xiàn)對采集或接收到的語音進行實時編解碼。
1.1.4 傳輸控制
UDP是一種面向無連接的協(xié)議,具有資源消耗小,處理速度快的優(yōu)點[12],通常用于音頻、視頻和普通數(shù)據(jù)的傳送。本系統(tǒng)為了實現(xiàn)語音數(shù)據(jù)的實時傳送,采用了UDP Socket作為網(wǎng)絡(luò)端口的監(jiān)聽[13],該Socket采用異步工作模式。為了實現(xiàn)全雙工語音通信,系統(tǒng)分別建立發(fā)送和接收UDP Socket,通過綁定接收端和發(fā)送的端口號,對Socket的發(fā)送數(shù)據(jù)和接收數(shù)據(jù)進行消息處理。當收發(fā)雙方啟動程序并監(jiān)聽后,均處于偵聽通話邀請狀態(tài),當某一方向另一方發(fā)出通話邀請,被叫方能夠聽到發(fā)送端的聲音,當點擊開始通話后,雙方便進入語音通信狀態(tài),收發(fā)兩端的系統(tǒng)啟動錄音和放音線程,即可進行全雙工語音通信。
1.1.5 網(wǎng)絡(luò)傳輸
系統(tǒng)以局域網(wǎng)作為語音通信的傳輸媒介。兩臺接入局域網(wǎng)的PC機啟動并運行語音通信測試系統(tǒng)軟件后,設(shè)置收發(fā)兩端的IP地址,選擇相同的編碼器,并呼叫對方,當對方確認后,便可通過局域網(wǎng)進行語音通話。
系統(tǒng)工作在peer to peer模式,即收發(fā)雙方使用同一個程序[14]。如圖2所示,是語音通信采用的線程架構(gòu),其中,主線程用來響應(yīng)程序界面的設(shè)置。語音發(fā)送和語音接收是分開進行的,均通過異步調(diào)用方式來實現(xiàn)。語音的發(fā)送通過Bufferfull事件觸發(fā)mˉpWaveInˉBufferFull來實現(xiàn),而收發(fā)兩端系統(tǒng)則通過 mˉpUdpServerˉPacketReceived來接收語音數(shù)據(jù),并調(diào)用mˉpWaveOut.Play來播放語音。監(jiān)聽是否收到數(shù)據(jù)也采用了異步方式,目的是減少線程數(shù)目和開銷。
圖2 多線程架構(gòu)
通過引入多線程,系統(tǒng)可以同時發(fā)送和播放語音。語音的發(fā)送和播放通過SendTestAudio和Play-TestAudio線程來實現(xiàn)。引入SendTest的目的是通過編碼和播放測試語音,測試語音質(zhì)量和計算語音編碼器的編碼效率。
實驗系統(tǒng)界面如圖3所示,在 “參數(shù)設(shè)定”中選擇語音編碼器類型、采樣率和量化級數(shù)。當對方收到通話邀請時,系統(tǒng)會自動詢問是否匹配參數(shù),只有參數(shù)匹配一致才能正常傳輸。 “設(shè)備選擇”的設(shè)置主要是考慮到當一個終端擁有多個語音輸入輸出設(shè)備時,要對參與工作的設(shè)備進行選擇。“本地設(shè)置”用于設(shè)置本地IP地址和端口號11100。本地設(shè)置完成后,單擊 “監(jiān)聽”,然后在“目標設(shè)置”中,設(shè)置接收端的IP地址和端口號11100。收發(fā)兩端點擊 “開始通話”,則可以進行雙向的實時通信。在通話過程中,系統(tǒng)還可以實時顯示編解碼延時、接收和發(fā)送數(shù)據(jù)包的數(shù)量和字節(jié)數(shù)?!鞍l(fā)送測試音”和 “播放測試音”可以對wav格式的語音文件進行編解碼處理和播放。
圖3 語音通信實驗系統(tǒng)界面
本文設(shè)計的系統(tǒng)能測試語音質(zhì)量、壓縮比、編解碼延時、數(shù)據(jù)流量等指標,可用于語音編碼相關(guān)課程的理論和實驗教學,如老師講解某個語音編碼器的編碼原理和方法時,可以現(xiàn)場為學生播放經(jīng)過該系統(tǒng)輸出的語音,也可以比較不同語音編碼器的特點,如音質(zhì)、算法復雜度、壓縮比等。實驗老師用該系統(tǒng)可以開發(fā)出一些相關(guān)的實驗項目,如要求學生去實現(xiàn)一些語音編碼器,然后用該系統(tǒng)進行測試等。
圖4 G.711 A率編碼器測試結(jié)果
如果在本地和目標IP地址均設(shè)置為127.0.0.1,系統(tǒng)可以進行自發(fā)自收的自環(huán)測試。自環(huán)測試時,點擊 “發(fā)送測試音”,從PC機中選擇要編碼的語音文件,然后點擊 “開始通話”,用選擇的語音編碼器對語音文件數(shù)據(jù)進行編解碼處理;再點擊 “發(fā)送測試音”,可以播放經(jīng)過編解碼后的語音,如果點擊 “播放測試音”,則可播放沒有經(jīng)過任何編解碼處理的原始語音文件。
如圖3所示,是沒有經(jīng)過壓縮編碼的某個語音文件的自環(huán)測試界面,接收和發(fā)送字節(jié)數(shù)均為110.375 kB,即該語音測試文件的大小為110.375 kB。如圖4所示,顯示了該測試語音文件經(jīng)G.711 A率編碼器的測試結(jié)果,收發(fā)字節(jié)數(shù)為55.187 5 kB,編解碼延時分別為2.1μs和1.2μs,通過計算該編碼器發(fā)送字節(jié)數(shù)和原始語音文件字節(jié)數(shù)之比,可得出該編碼器的語音壓縮比為1/2。分別點擊圖4系統(tǒng)界面的 “發(fā)送測試音”和 “播放測試音”,啟動語音的播放,通過試聽,可以體驗經(jīng)過編解碼處理后的語音和原始語音之間音質(zhì)的差別,評估出語音編碼器的主觀語音質(zhì)量。如圖5所示,是G.729語音編碼器的測試結(jié)果,收發(fā)字節(jié)數(shù)均為7.031 25 kB,壓縮比接近1/16,編解碼延時分別為678.6μs和256.3 μs。
圖5 G.729編碼器測試結(jié)果
圖6 采用SMV編碼器的語音通信界面
如圖6所示,是在兩臺PC機上運行本文語音通信測試系統(tǒng),通過校園局域網(wǎng)進行語音通話的界面。兩端系統(tǒng)均選擇SMV 4 kb/s語音編碼器,“本地設(shè)置”和 “目標設(shè)置”分別輸入本地和目的IP地址,點擊 “開始通話”后,兩端語音通信測試系統(tǒng)即可進行雙向?qū)崟r語音通信,并實時顯示收發(fā)數(shù)據(jù)流量和編解碼延時。
本文采用多線程模塊化結(jié)構(gòu)進行軟件設(shè)計,通過UDP/IP協(xié)議,以局域網(wǎng)為傳輸通道,實現(xiàn)了具有良好可擴展性和實用性的語音通信系統(tǒng)。該系統(tǒng)既能通過局域網(wǎng)絡(luò)進行雙向?qū)崟r語音通信,又能測試各種語音編碼器語音的主觀質(zhì)量和壓縮比,還能實時顯示語音通信過程中編解碼延時,可用于語音信號處理相關(guān)課程的理論教學案例演示,也可基于該系統(tǒng)開發(fā)相應(yīng)的實驗項目,還可用于學生測試自己實現(xiàn)的語音編碼器的質(zhì)量。
[1]張鳴.通信原理仿真實驗系統(tǒng)設(shè)計[J].實驗技術(shù)與管理,2013,30(6):54-57,61.
[2]晏燕,王惠琴.多媒體通信課程的教學改革與探討[J].蘭州文理學院學報(自然科學版),2014,28(4):107-110,128.
[3]涂繼輝,蘇麗秋.基于OpenBTS和Asterisk的移動通信實驗系統(tǒng)設(shè)計與實現(xiàn)[J].實驗技術(shù)與管理,2014,31(5):65-70.
[4]楊毅,鄧北星,馬曉紅.《語音信號處理》實驗教學研究與實踐[J].實驗科學與技術(shù),2012,10(6):112-115,180.
[5]崔鶴,劉云清,盛家進.基于FPGA的UDP/IP協(xié)議棧的研究與實現(xiàn)[J].長春理工大學學報(自然科學版),2014,37(2):133-137.
[6]馮金金,吳游.基于DSP的音頻信號壓縮通信系統(tǒng)的設(shè)計與實現(xiàn)[J].信息技術(shù),2016(8):200-203.
[7]李桂菊.利用DSP底層結(jié)構(gòu)提高MPEG-4編碼的實時性[J].中國光學,2011,4(5):461-467.
[8]徐海潮,張江鑫,蔣伊樂.基于DM365的IP語音終端設(shè)計[J].杭州電子科技大學學報 (綜合版),2013,33(5):146-149.
[9]郭燕.多點語音通信在船舶通信系統(tǒng)中的仿真[J].艦船科學技術(shù),2016,38(7):98-99.
[10]李強,謝虹恩.改進的基于MELP的非連續(xù)傳輸語音編碼算法[J].重慶郵電大學學報(自然科學版),2014,26(5):636-641.
[11]夏曉峰.可選取模式聲碼器SMV算法優(yōu)化[J].雞西大學學報 (綜合版),2014,14(9):49-51.
[12]范開俊,徐丙垠,陳羽,等.配電網(wǎng)分布式控制實時數(shù)據(jù)的GOOSE over UDP傳輸方式[J].電力系統(tǒng)自動化,2016,40(4):115-120.
[13]李淑梅,王志彬.Socket在局域網(wǎng)聊天系統(tǒng)中的應(yīng)用[J].吉林師范大學學報(自然科學版),2014,35(1):71-73.
[14]張立晨,張晉豫.基于分區(qū)概率的P2P實時流媒體緩存策略[J].軟件,2014,35(4):12-17.