朱雷堅(jiān),彭 宏
(浙江省通信網(wǎng)應(yīng)用技術(shù)研究重點(diǎn)實(shí)驗(yàn)室,浙江杭州310023)
隨著多媒體信息技術(shù)的發(fā)展,人們對(duì)信息的要求與日俱增,以往的語音傳輸模式占用帶寬大、延時(shí)長(zhǎng),已經(jīng)無法滿足時(shí)代發(fā)展的要求。如何在有限的帶寬上傳輸盡量多的信息,成為社會(huì)關(guān)注的焦點(diǎn)[1]。ITU-T于1996年3月發(fā)布的G.729語音壓縮編解碼標(biāo)準(zhǔn)以其8kb/s的傳輸碼率,以及低延時(shí)、語音質(zhì)量高的特點(diǎn),在IP電話、視頻電話、移動(dòng)通信等領(lǐng)域有廣泛應(yīng)用[2]。而在國(guó)內(nèi),也有許多關(guān)于如何在DSP芯片上實(shí)現(xiàn)G.729算法的研究,但是基本都是依賴硬件實(shí)現(xiàn),因?yàn)槌杀具^高而未能得到廣泛應(yīng)用[3]。本文研究并實(shí)現(xiàn)了一種軟件G.729算法,并針對(duì)Android平臺(tái)做了適當(dāng)?shù)膬?yōu)化,在點(diǎn)對(duì)點(diǎn)實(shí)時(shí)語音通信測(cè)試中表現(xiàn)良好。
在編碼端,把8kHz/s采樣得到的音頻數(shù)據(jù)分為100幀,每幀占據(jù)10ms。然后通過對(duì)每個(gè)語音幀的分析來提取各種參數(shù)(包括線性預(yù)測(cè)濾波器系數(shù)、自適應(yīng)碼書延遲、固定碼書索引、自適應(yīng)碼書增益和固定碼書增益),再把這些參數(shù)編碼發(fā)送。
在解碼端,把接收到的比特?cái)?shù)據(jù)恢復(fù)成相應(yīng)的參數(shù)編碼,解碼后得到各個(gè)參數(shù)。自適應(yīng)碼矢通過自適應(yīng)碼矢序號(hào)從自適應(yīng)碼書中提取,固定碼矢通過固定碼矢序號(hào)從固定碼書中提取,兩者分別乘以它們的增益后再相加就構(gòu)成激勵(lì)序列。計(jì)算出合成語音后,用后置濾波器進(jìn)一步增強(qiáng)音質(zhì)[4]。
本文主要對(duì)粗化搜索和固定碼書搜索的優(yōu)化算法進(jìn)行了研究,通過在Android實(shí)現(xiàn)相應(yīng)的優(yōu)化算法來降低G.729的運(yùn)算復(fù)雜度。
在G.729的算法中,運(yùn)用了許多多級(jí)查詢或多級(jí)量化的方法。典型的例子是開環(huán)基音周期搜索。首先,它利用開環(huán)基音搜索得到最佳開環(huán)延遲Top;然后,在后續(xù)的自適應(yīng)碼書搜索中,將第一子幀的音調(diào)延遲T1的搜索范圍限定在Top附近的小范圍內(nèi),而第二子幀的延遲T2的搜索范圍又在第一子幀選擇的延遲的附近。通過這樣的多級(jí)運(yùn)算最終求得兩子幀的音調(diào)延遲。開環(huán)基音搜索(第一級(jí))的方法,是通過加權(quán)話音信號(hào)sω(n)的相關(guān)系數(shù)來進(jìn)行計(jì)算的。相關(guān)系數(shù)的表達(dá)式如下:
對(duì)該搜索算法進(jìn)行優(yōu)化,可以將其中的迭代次數(shù)從80次降到40次,而且求解上述相關(guān)系數(shù)的目的是為了進(jìn)行比較并得到最大值,最后再將最大值歸一化,因此,適當(dāng)降低迭代次數(shù)對(duì)最終的結(jié)果影響不大,優(yōu)化后的表達(dá)式如下:
在G.729的編碼中,碼書的搜索占據(jù)了絕大部分的運(yùn)算量。對(duì)此,本文研究了一種自適應(yīng)子矢量共扼結(jié)構(gòu)代數(shù)碼書算法[5]。這種碼書的編制方法為:將原G.729固定碼書分裂成兩個(gè)4維的子矢量碼書,每個(gè)子矢量用40比特表示。第一個(gè)子矢量碼書結(jié)構(gòu)如表1所示。
表1 第一個(gè)子矢量碼書結(jié)構(gòu)表
由于語音信號(hào)的相關(guān)性較強(qiáng),相鄰子幀的激勵(lì)碼字在一定程度上有較短時(shí)間的延續(xù)。因此,可以考慮用前一子幀的激勵(lì)碼字,對(duì)當(dāng)前子幀激勵(lì)碼字做平滑處理。所以,可以將第二個(gè)子矢量碼書設(shè)計(jì)成一個(gè)自適應(yīng)矢量碼書,用來存儲(chǔ)前一子幀的子矢量碼書的激勵(lì)碼字。通過將兩個(gè)子矢量碼書的激勵(lì)碼字組合來構(gòu)成語音信號(hào)子幀的激勵(lì)碼字,省去了G.729固定碼書搜索對(duì)激勵(lì)碼字的基音預(yù)測(cè)濾波平滑處理,降低了運(yùn)算復(fù)雜度。激勵(lì)生成過程如圖1所示。
圖1 自適應(yīng)子矢量共軛結(jié)構(gòu)代數(shù)碼書算法碼字生成圖
圖1中CA為子矢量碼書1,Ca(n)為子矢量碼書1的當(dāng)前激勵(lì)碼字,Ca(n-1)為子矢量碼書1前一時(shí)刻的激勵(lì)碼字,Cb(n)是自適應(yīng)子矢量碼書2的當(dāng)前激勵(lì)碼字。Cb(n)向右平移1位與Ca(n)組合構(gòu)成當(dāng)前子幀的激勵(lì)碼字C(n)。
這種自適應(yīng)子矢量共扼結(jié)構(gòu)代數(shù)碼書的激勵(lì)碼字與原G.729固定碼書的激勵(lì)碼字具有相同維數(shù)和結(jié)構(gòu),因此完全適用于G.729固定碼書增益及符號(hào)的計(jì)算。從表1可以計(jì)算出子矢量1固定碼書長(zhǎng)度為9,因此只需用9個(gè)bit來傳輸固定碼書的索引。因此固定碼書索引的計(jì)算需做相應(yīng)的調(diào)整,原固定碼書的表達(dá)式變?yōu)?
由于優(yōu)化的碼書矢量的非零位m比原G.729固定碼書矢量減少了一半,因此固定碼書搜索的計(jì)算量下降了一半左右。此外,每一子幀的固定碼書索引從原來的13bit降低到現(xiàn)在的9bit,這樣兩個(gè)子幀又比原來減少8bit的數(shù)據(jù)量,編碼速率從原來的8kbit/s降低到現(xiàn)在的7.2kbit/s。
G.729算法在Android上的移植通過NDK實(shí)現(xiàn)。NDK是一個(gè)工具集,它集成了Android的交叉編譯環(huán)境,并提供了一套比較方便的Makefile。通過NDK,開發(fā)者可以快速將C/C++代碼編譯成能在Android調(diào)用的 so動(dòng)態(tài)庫文件[6]。
Java接口函數(shù)的主要作用是在Android工程中聲明JNI接口,示例代碼如下:
其中,F(xiàn)un1()、Func2()等一系列函數(shù)代表G.729庫在Android工程中可以調(diào)用的接口。
Java中聲明過的jni接口函數(shù),由對(duì)應(yīng)的C/C++接口函數(shù)實(shí)現(xiàn),示例代碼如下:
C/C++接口函數(shù)的函數(shù)名有固定為“Java+Android工程中包名+Java接口函數(shù)所在文件名+Java接口函數(shù)名”,參數(shù)的前兩個(gè)也固定為env和thiz。
Android.mk是Android交叉編譯的Makefile文件,交叉編譯器根據(jù)該文件指定的規(guī)則編譯生成so動(dòng)態(tài)庫文件。
其中LOCAL_PATH指示c源代碼文件的位置;LOCAL_MODULE指示生成的共享庫的名稱;LOCAL_SRC_FILES指示C/C++代碼的文件。
新建一個(gè)名為jni的文件夾,將寫好的C/C++接口實(shí)現(xiàn)函數(shù)、G.729庫的源文件和Android.mk都放到j(luò)ni文件夾下,在jni文件夾這一層目錄(不用進(jìn)入到j(luò)ni文件夾內(nèi))運(yùn)行ndk-build,如果編譯無誤的話,就會(huì)在libs/armeabi目錄下生成所需so動(dòng)態(tài)庫文件。
在HTC野火(600M CPU、512M RAM)上對(duì)G.729代碼進(jìn)行測(cè)試,對(duì)比優(yōu)化前后每一幀的處理時(shí)間,以及優(yōu)化前后音質(zhì)的MOS得分,具體結(jié)果如表2所示:
表2 優(yōu)化性能總結(jié)表
從表2中可以看出,經(jīng)過對(duì)G.729算法的優(yōu)化,平均一幀處理時(shí)間由原來的17.54ms縮短到7.16ms,小于G.729一幀的語音長(zhǎng)度10ms。
MOS得分是目前應(yīng)用最廣泛的評(píng)價(jià)語音質(zhì)量的方法,MOS得分滿分為5分。當(dāng)MOS大于4.0時(shí),幾乎與原音沒有區(qū)別;當(dāng)MOS在3.5到4.0之間時(shí),雖然能感覺到失真,但不影響通信;當(dāng)MOS小于3.0時(shí),難以從噪聲中辨別發(fā)聲者。從表中可知,優(yōu)化后的G.729語音在MOS得分上僅比優(yōu)化前降低了0.1分,并且都在3.5到4.0的區(qū)間內(nèi)。因此,無論是在延時(shí)方面還是在音質(zhì)方面,優(yōu)化后的算法很好的滿足了Android平臺(tái)實(shí)時(shí)點(diǎn)對(duì)點(diǎn)語音傳輸?shù)男枰?/p>
[1] 江波,張江鑫.線性預(yù)測(cè)編碼技術(shù)及其在G.729中的應(yīng)用研究[J].浙江工業(yè)大學(xué)學(xué)報(bào),2009,37(2):46-51.
[2] Regis J,Bates Donald,W Gregory.語音與數(shù)據(jù)通信第四版[M].北京:人民郵電出版社,2005:236-257.
[3] 胡仕兵,向敬成,翟義然.G.729語音編碼器定點(diǎn)DSP的實(shí)時(shí)實(shí)現(xiàn)[J].電子科技大學(xué)學(xué)報(bào),2003,32(4):12-19.
[4] R Salami,C Laflamme.ITU-T G.729 Annex A:reduced complexity 8 kb/s CS-ACELP codec for digital simultaneous voice and data[J].IEEE Communications Magazine,1997,35(9):56 -63.
[5] 劉曉明,馮榮,田雨.一種改進(jìn)的G.729標(biāo)準(zhǔn)固定碼本快速搜索算法[J].計(jì)算機(jī)應(yīng)用研究,2011,28(9):67-73.
[6] 邵長(zhǎng)彬,張重陽,鄭世寶.基于Android的可視IP電話多媒體終端設(shè)計(jì)與實(shí)現(xiàn)[J].電視技術(shù),2011,35(6):12-19.