張立文, 吳 迪, 宋占偉
(吉林大學(xué) 電子科學(xué)與工程學(xué)院, 長春 130012)
VoIP(Voice over Internet Protocol)是基于IP網(wǎng)絡(luò)的語音傳輸技術(shù), 即將模擬信號數(shù)字化, 以數(shù)據(jù)封包的形式在IP網(wǎng)絡(luò)上做實時傳遞。基于IP的實時語音傳輸技術(shù)能有效地利用現(xiàn)有的網(wǎng)絡(luò)資源, 有利于緩解現(xiàn)有的通信網(wǎng)的緊張局面, 同時大大降低了通信成本。目前對VoIP技術(shù)的研究主要圍繞改善IP電話的服務(wù)質(zhì)量進行[1], 包括使用更先進的硬件、 可靠的實時傳輸技術(shù)和能隨網(wǎng)絡(luò)狀況自適應(yīng)調(diào)整速率的語音編碼技術(shù)等。
Speex是一套開源的功能強大的語音引擎, 能實現(xiàn)高質(zhì)量和低比特率的編碼。它不僅提供了基于碼激勵線性預(yù)測算法的編/解碼模塊, 而且還提供了聲音預(yù)處理和聲學(xué)回聲消除模塊, 為保障IP網(wǎng)絡(luò)中的語音通信質(zhì)量提供了技術(shù)手段。此外, Speex還具有壓縮后的比特率低(2~44 kbit/s)的特點, 并支持多種比特率。所以Speex在網(wǎng)絡(luò)應(yīng)用上有自己獨特的優(yōu)勢, 特別適合VoIP系統(tǒng)[2]。流媒體指的是一種從Internet上獲取音頻和視頻等多媒體數(shù)據(jù)的新方法, 它能支持多媒體數(shù)據(jù)流的實時傳輸和實時播放。通過運用流媒體技術(shù), 服務(wù)器能向客戶機發(fā)送穩(wěn)定和連續(xù)的多媒體數(shù)據(jù)流[3]。
筆者設(shè)計一種在無線WiFi網(wǎng)絡(luò)環(huán)境下的嵌入式語音交互和記錄終端, 使用實時傳輸協(xié)議(RTP: Real-time Transport Protocol)實現(xiàn)數(shù)字語音的實時傳輸, 并使用Speex引擎實現(xiàn)數(shù)字音頻的編解碼和改善語音通話質(zhì)量。
圖1 系統(tǒng)硬件框圖
設(shè)計以ARM處理器[4]S3C6410為硬件平臺, 該處理器內(nèi)部集成了強大的多媒體處理單元, 以Linux操作系統(tǒng)作為軟件平臺。每個終端配備一個無線網(wǎng)卡, 通過無線網(wǎng)卡的配置實現(xiàn)Ad-Hoc快速自組網(wǎng)[5]。發(fā)送終端通過話筒采集模擬音頻數(shù)據(jù), 通過音頻接口電路轉(zhuǎn)換成數(shù)字音頻, 利用Speex對數(shù)字音頻進行編碼及抑制噪聲和消除回聲處理, 然后利用RTP實時傳輸協(xié)議在無線WiFi網(wǎng)絡(luò)上進行傳輸, 接收終端接收到語音數(shù)據(jù)后進行解碼。一方面保存到SD卡中; 另一方面通過音頻接口電路把數(shù)字音頻還原為模擬音頻送入音箱進行播放。經(jīng)過整合使每個終端既可作為語音發(fā)送端又可作為語音接收端, 從而實現(xiàn)語音的全雙工交互和記錄的功能, 并用按鍵控制系統(tǒng)的工作狀態(tài)[6]。硬件系統(tǒng)總體設(shè)計框圖如圖1所示。其中, 音頻編解碼系統(tǒng)Audio Codec采用AC97接口, 外接WM9714作為音頻解碼芯片, 其主要功能是實現(xiàn)模擬音頻和數(shù)字音頻的相互轉(zhuǎn)換[7]。
系統(tǒng)的軟件設(shè)計在嵌入式Linux交叉編譯環(huán)境下進行, 具體的軟件設(shè)計包括系統(tǒng)的初始化、 音頻的采集、 音頻的相關(guān)處理(噪聲消除和回聲抑制)、 音頻Speex編解碼、 音頻的RTP實時傳輸、 音頻的存儲和播放, 其軟件流程圖如圖2所示。
圖2 系統(tǒng)軟件流程圖
該系統(tǒng)所涉及的關(guān)鍵技術(shù)包括: Linux系統(tǒng)下語音的編程技術(shù); Speex實現(xiàn)音頻的編解碼; Speex噪聲抑制和回聲消除的處理; 用RTP協(xié)議進行語音的實時傳輸以及系統(tǒng)的全雙工整合等。
設(shè)計采用Linux下OSS(Open Sound System)用戶空間語音編程。首先進行聲卡設(shè)備的初始化, 建立與硬件之間的聯(lián)系; 然后設(shè)置音頻采集的各技術(shù)指標(biāo)(包括采樣頻率、 量化位數(shù)和聲道數(shù)); 最后通過讀寫設(shè)備文件/dev/dsp即可實現(xiàn)聲音的采集和播放。
Speex是個開源、 免費、 專門針對VoIP語音的編解碼器, 是一種動態(tài)比特率編碼方式, 可根據(jù)網(wǎng)絡(luò)環(huán)境的變化動態(tài)地修改其比特率, 它在窄帶和寬帶中都提供相應(yīng)版本。使用Speex之前要在Linux宿主機和ARM開發(fā)板上移植Speex, 移植成功后即可使用Speex引擎對數(shù)字音頻進行編解碼和其他相關(guān)處理。 使用Speex的API函數(shù)對音頻數(shù)據(jù)壓縮編碼要經(jīng)過如下步驟[8]。
1) 定義一個SpeexBits類型變量bits和一個Speex編碼器狀態(tài)變量enc_state。
2) 調(diào)用speex_bits_init(&bits)和speex_encoder_init(&speex_nb_mode)初始化bits和enc_state。其中speex_nb_mode可定義為窄帶模式、 寬帶模式或超寬帶模式。由于該設(shè)計對音頻的壓縮比要求不高, 故可以選取窄帶模式。
3) 調(diào)用函數(shù)int speex_encoder_ ctl(void *state, int request, void*ptr)設(shè)定編碼器的參數(shù), 如設(shè)置幀的大小和量化的大小等, 以決定編碼的質(zhì)量。
4) 初始化完畢后, 對每幀聲音作如下處理: 調(diào)用函數(shù)speex_bits_reset(&bits)再次設(shè)定SpeexBits; 然后調(diào)用函數(shù)speex_encode(enc_state, input_frame, &bits)進行編碼, 在參數(shù)bits中保存編碼后的數(shù)據(jù)流。
5) 編碼結(jié)束后, 調(diào)用函數(shù)speex_bits_destroy(&bits), speex_encoder_destroy(enc_state)摧毀編碼器。
對編碼過的音頻數(shù)據(jù)進行解碼的步驟和編碼大致相同, 不同之處是: 初始化后可對每個輸入幀進行如下操作: 用函數(shù)speex_bits_read_from(&bits, input_bytes, nbBytes)讀取一幀的比特流數(shù)據(jù); 然后用函數(shù)speex_decode_int(dec_state, &bits, output_frame)對參數(shù)bits中的音頻數(shù)據(jù)進行解編碼, 在參數(shù)out中保存解碼后的數(shù)據(jù)流。
噪聲抑制又稱為降噪處理, 是根據(jù)語音數(shù)據(jù)的特點, 識別屬于背景噪音的部分, 并從音頻幀中過濾掉。Speex的預(yù)處理器提供了噪聲抑制功能, 其用法如下:
1) 初始化預(yù)處理器狀態(tài)并創(chuàng)建預(yù)處理器;
2) 用speex_preprocess_ctl()函數(shù)設(shè)置預(yù)處理器參數(shù), 通過設(shè)置SPEEX_PREPROCESS_SET_DENOISE參數(shù)打開噪聲抑制功能, 并通過參數(shù)SPEEX_PREPROCESS_SET_NOISE_SUPPRESS設(shè)置最大程度的噪音衰減的分貝;
3) 用函數(shù)speex_preprocess_run( preprocess_state, audio_frame )對語音數(shù)據(jù)進行相關(guān)的預(yù)處理操作, 其中參數(shù)audio_frame為要處理的數(shù)據(jù)幀;
4) 處理完成后銷毀預(yù)處理器, 釋放資源。
圖3 Speex回聲消除的工作原理
用Speex實現(xiàn)回聲消除的編程步驟。
1) 初始化回聲消除器狀態(tài), 用函數(shù)SpeexEchoState *echo_state=speex_echo_state_init(frame_size, filter_length)創(chuàng)建回聲消除器, 設(shè)置的兩個參數(shù)分別為采樣數(shù)據(jù)的大小和回聲消除的尾長。這兩個參數(shù)的設(shè)置, 直接影響到回聲消除的效果。
2) 用speex_echo_cancellation(echo_state, input_frame, echo_frame, output_frame)函數(shù)消除回聲。其中聲卡捕捉的聲音input_frame(要發(fā)送出的聲音)和揚聲器播放的聲音echo_frame(要消除的聲音)之間的延遲要保證同步。應(yīng)使它們之間的延遲足夠小, 以得到較好的回聲消除效果。最后銷毀回聲消除器, 釋放所占用的資源。
3) 用函數(shù)speex_echo_state_destroy(echo_state)銷毀回聲消除器。
RTP是目前解決流媒體實時傳輸問題的最好辦法[10]。RTP是用于Internet上針對多媒體數(shù)據(jù)流的一種傳輸協(xié)議, 其目的是提供時間信息和實現(xiàn)流同步。RTP本身并不能為按序傳輸數(shù)據(jù)包提供可靠的保證, 也不提供流量控制和擁塞控制, 而這些都由RTCP(Real-time Transport Control Protocol)控制協(xié)議負(fù)責(zé)完成。該設(shè)計在Linux下利用Jrtplib進行實時流語音編程[11], Jrtplib是個面向?qū)ο蟮腞TP封裝庫, 利用它可以很方便地完成Linux平臺上的實時流媒體編程, 其網(wǎng)絡(luò)編程的流程如圖4所示。Jrtplib是個高度封裝后的RTP庫, 使用時一般不用關(guān)心RTCP數(shù)據(jù)包是如何被發(fā)送和接收的, 因為這些都可以由Jrtplib自己完成。只要成功調(diào)用PollData()或SendPacket()方法, Jrtplib就能自動對到達(dá)的RTCP數(shù)據(jù)包進行處理, 還會在需要的時候發(fā)送RTCP數(shù)據(jù)包, 從而確保整個RTP會話過程的準(zhǔn)確性。
圖4 RTP協(xié)議傳輸流媒體數(shù)據(jù)的流程圖
圖5 WAV文件頭的格式
為保證語音記錄的保真度, 筆者把數(shù)字音頻保存為WAV文件格式并存儲到大容量的SD卡中。首先填寫設(shè)置WAV文件頭, WAV文件由若干個Chunk組成, WAV文件頭的結(jié)構(gòu)如圖5所示, 然后創(chuàng)建一個文件并寫入WAV文件頭和音頻數(shù)據(jù)即可把聲音存儲成WAV格式的文件, 從而實現(xiàn)語音的記錄功能。
為實現(xiàn)語音的全雙工通信功能, 采用Linux下的多線程編程技術(shù)[12], 在主進程中創(chuàng)建兩個線程: 一個線程用于語音的采集、 處理、 編碼和發(fā)送, 另一線程用于語音的接收、 解碼、 存儲和播放, 同時還要使用線程同步技術(shù)保證線程同步(對消除回聲很必要)。從而可實現(xiàn)語音交互和記錄的功能, 并可用按鍵控制系統(tǒng)的工作狀態(tài)。
表1 不同通信距離下的測試數(shù)據(jù)
經(jīng)各個功能模塊的整合后, 即可設(shè)計整體系統(tǒng)。下面在WiFi無線網(wǎng)絡(luò)環(huán)境下對系統(tǒng)的功能進行測試, 測試項目包括系統(tǒng)的延時、 語音傳輸過程中的丟包率、 噪聲抑制和回聲消除的效果。當(dāng)兩終端的通信距離為5 m,20 m,35 m和50 m時, 系統(tǒng)測試的具體數(shù)據(jù)如表1所示。
從測試結(jié)果中可看出, 當(dāng)通信距離小于20 m時, 該系統(tǒng)的語音傳輸?shù)膶崟r性良好, 傳輸延時很小, 丟包率低, 通話過程中幾乎沒有回音, 噪聲也得到了很好的抑制, 語音通話的質(zhì)量清晰流暢。但由于系統(tǒng)采用Ad-Hoc模式的無線網(wǎng)絡(luò)進行通信, 隨著通信距離的增加, 無線網(wǎng)絡(luò)條件隨之變差, 網(wǎng)絡(luò)的延遲較大, 傳輸過程中的丟包數(shù)量增加, 導(dǎo)致語音通話的質(zhì)量隨之降低, 聲音通話偶爾有中斷, 但不影響通話, 有較明顯的回聲, 話音服務(wù)質(zhì)量并不理想。
噪聲抑制部分的測試結(jié)果如圖6所示, 從中可看到, 噪聲抑制的效果比較明顯。
a 未經(jīng)噪聲抑制前的聲音波形 b 經(jīng)噪聲抑制后的聲音波形
針對如何提高IP電話的話音服務(wù)質(zhì)量的問題, 設(shè)計采用了流媒體協(xié)議傳輸無線數(shù)字音頻數(shù)據(jù), 保證了語音傳輸?shù)膶崟r性和可靠性, 并利用功能強大的開源Speex語音引擎進行數(shù)字語音的編解碼及噪聲抑制和回聲消除的相關(guān)處理, 提高了VoIP語音通話的質(zhì)量, 具有很好的應(yīng)用前景和市場價值。測試結(jié)果表明, 當(dāng)通信距離小于20 m時, 該系統(tǒng)可實現(xiàn)清晰流暢的語音通話; 但隨著通信距離的增加, 通話的服務(wù)質(zhì)量有所降低, 還有待進一步的研究和解決。
參考文獻:
[1]管玲玲. VoIP與WLAN結(jié)合實現(xiàn)移動IP電話的研究 [D]. 武漢: 華中科技大學(xué)電子信息工程系, 2007.
GUAN Ling-ling. Research on Mobile IP Phone by VoIP and WLAN [D]. Wuhan: Department of Electronics and Information Engineering, Huazhong University of Science and Technology, 2007.
[2]謝曉鋼, 蔡駿, 陳奇川, 等. 基于Speex引擎的VoIP系統(tǒng)設(shè)計與實現(xiàn) [J]. 計算機應(yīng)用研究, 2007, 24(12): 320-323.
XIE Xiao-gang, CAI Jun, CHEN Qi-chuan, et al. Design and Implementation of VoIP Based on Speex Codec [J]. Application Research of Computers, 2007, 24(12): 320-323.
[3]張勇, 何娜娜, 夏海倫. 移動P2P流媒體中的數(shù)據(jù)調(diào)度算法 [J]. 吉林大學(xué)學(xué)報: 信息科學(xué)版, 2010, 28(6): 570-575.
ZHANG Yong, HE Na-na, XIA Hai-lun. Data Scheduling Algorithm in Mobile P2P Streaming [J]. Journal of Jilin University: Information Science Edition, 2010, 28(6): 570-575.
[4]劉陽陽, 申鉉京, 王一棋, 等. 基于ARM的智能監(jiān)控系統(tǒng)的設(shè)計與實現(xiàn) [J]. 吉林大學(xué)學(xué)報: 信息科學(xué)版, 2011, 29(2): 158-163.
LIU Yang-yang, SHEN Xuan-jing, WANG Yi-qi, et al. Design and Implementation of Embedded Intelligent Monitor System Based on ARM [J]. Journal of Jilin University: Information Science Edition, 2011, 29(2): 158-163.
[5]劉超. 圖像捕捉發(fā)送單元的研發(fā) [D]. 長春: 吉林大學(xué)電子科學(xué)與工程學(xué)院, 2010.
LIU Chao. R & D of Image Capture Transmission Unit [D]. Changchun: College of Electronics Science and Engineering, Jilin University, 2010.
[6]王黎明, 閆曉玲, 葛德宏, 等. ARM9嵌入式系統(tǒng)開發(fā)與實踐 [M]. 北京: 北京航空航天大學(xué)出版社, 2008.
WANG Li-ming, YAN Xiao-ling, GE De-hong, et al. Development and Implementation of ARM9 Embedded System [M]. Beijing: Beihang University Press, 2008.
[7]李俊. 嵌入式Linux設(shè)備驅(qū)動開發(fā)詳解 [M]. 北京: 人民郵電出版社, 2008.
LI Jun. Details for Embedded Linux Device Drivers Development [M]. Beijing: The People’s Posts and Telecommunications Press, 2008.
[8]楊淑文. 基于Speex技術(shù)的無線語音編/解碼和傳輸系統(tǒng)設(shè)計 [D]. 哈爾濱: 哈爾濱工業(yè)大學(xué)電子與信息工程學(xué)院, 2009.
YANG Shu-wen. Design of Wireless Voice Codec and Transmission System Based on Speex Technology [D]. Harbin: School of Electronics and Information Engineering, Harbin Institute of Technology, 2009.
[9]王慶輝, 李永哲. VOIP聲學(xué)回聲消除算法研究 [J]. 現(xiàn)代電子技術(shù), 2009(7): 157-159.
WANG Qing-hui, LI Yong-zhe. Research on VOIP Acoustic Echo Cancelation Algorithm [J]. Modern Electronics Technology, 2009(7): 157-159.
[10]程紅霞, 朱珠, 吳小強, 等. Linux下語音實時通信的一種實現(xiàn)方法 [J]. 兵工自動化, 2010, 29(3): 94-96.
CHENG Hong-xia, ZHU Zhu, WU Xiao-qiang, et al. An Implementation Method of Linux Audio Real-Time Communication [J]. Ordnance Industry Automation, 2010, 29(3): 94-96.
[11]張靜, 裴未遲, 許剛. 基于RTP協(xié)議的雙向語音通信 [J]. 計算機工程, 2003, 29(16): 133-134.
ZHANG Jing, PEI Wei-chi, XU Gang. Full-Duplex Speech Communication Based on RTP [J]. Computer Engineering, 2003, 29(16): 133-134.
[12]吳岳. Linux C程序設(shè)計大全 [M]. 北京:清華大學(xué)出版社, 2009.
WU Yue. Complete Volume for Linux C Program Design [M]. Beijing: Tsinghua University Press, 2009.