梁瑞宇, 王青云, 趙 力
(1.南京工程學院 通信工程學院,南京 211167; 2.東南大學 信息科學與工程學院,南京 210096)
·計算機技術應用·
嵌入式語音信號處理實驗系統的設計與實現
梁瑞宇1,2, 王青云1, 趙 力2
(1.南京工程學院 通信工程學院,南京 211167; 2.東南大學 信息科學與工程學院,南京 210096)

為體現教學與科研相互促進的教學理念,面向語音信號處理教學和科研需要,以Cortex-A8微處理器和專用音頻編解碼芯片WM8960為硬件核心,構建一款嵌入式語音信號處理綜合實驗平臺。基于該實驗平臺,利用QT開發軟件,設計一款語音信號處理綜合實驗教學與開發軟件。文中完整地講述了系統的硬件構成,驅動程序的移植,并結合基于譜減法的語音增強算法,介紹了基于QT的語音開發流程。基于該實驗平臺,學生不僅可以掌握語音信號處理的基本知識,還可以熟悉面向語音應用的嵌入式軟件開發流程。系統界面友好,功能強大,可有效用于高校語音及信號處理教學工作,也可用于相關科研人員進行語音信號處理相關課題的研發工作。
語音信號處理; 語音增強; 嵌入式; 實驗教學
隨著人機交互和智能機器人技術的發展,語音信號處理已成為信息科學研究領域中發展最為迅速的一個分支。語音信號處理是用數字信號處理技術和語音學知識對語音信號進行處理的一門新興學科,是一門理論性強、實用面廣、內容新、難度大的交叉學科[1-2]。語音信號處理作為信息處理專業的一門重要的專業課,所涉及的理論知識較多。語音信號處理包括語音增強[3]、語音編碼、語音合成、語音識別[4]、說話人識別[5]、情感識別[6]、語音隱藏、聲源定位[7]等。圍繞著這些應用,該課程還會涉及一些相關理論,如矢量量化、隱馬爾科夫模型、高斯混合模型,支撐向量機等。因此,如何激發學生的學習興趣,從枯燥的理論中升華出來,是提升課堂教學質量的關鍵。
目前,很多高校的語音信號處理課程的授課時間在32~48學時。在短暫的課堂授課時間內,使學生對各種應用有所了解,并從中選擇一到兩種進行深入研究,是非常困難的一件事。為此,很多高校都會增加實驗環節使學生對課堂內容進行鞏固和吸收。但是,目前語音信號處理實驗主要以MATLAB仿真為主[8],雖然有助于學生快速理解理論知識,但是缺乏對語音如何采集、處理和播放整個流程的深入了解。因此,開發出一款功能強大且實用的語音信號處理綜合實驗平臺,為學生和老師從事教學科研工作提供方便,已經成為語音信號處理教學工作的重中之重。一個有效的實驗平臺不但可以使學生掌握理論知識,還可以使學生了解語音信號處理的整個開發流程,為學生后期從事語音信號處理科創、競賽或工作積累經驗。針對目前語音教學科研平臺較少的現狀[9-10],本文按照主流的嵌入式系統開發設計理念,研發了一款語音信號處理綜合實驗平臺,介紹了平臺的硬件構成和軟件實現,并通過語音增強實驗驗證了平臺的有效性。
嵌入式語音實驗平臺的硬件結構如圖1所示,實驗平臺由S5PV210核心處理器、WM8960語音編解碼芯片、存儲電路、揚聲器、麥克風、外設接口、電源和時鐘電路構成。其中,電源和時鐘電路提供系統工作必需的電源和時鐘。外設接口包括串口、USB接口、網絡接口,用來與電腦通信,實現人機交互等功能。

圖1 嵌入式語音實驗平臺硬件結構圖
實驗平臺的核心處理器選用Samsung公司高端的ARM Cortex-A8微處理器S5PV210芯片。S5PV210基于ARM v7指令架構,適用于復雜操作系統及用戶應用,芯片功耗在300 mW以下,而性能卻高達2 000 MIPS[11-12]。S5PV210微處理器具有復雜的流水線架構,帶有先進的動態分支預測,可實現2.0 DMIPS/MHz。
語音編解碼芯片選用歐勝微電子公司的低功耗、高質量的立體編解碼器芯片WM8960。該芯片內置有麥克風接口和立體聲耳機驅動器以及立體聲24 bit sigma-delta模數轉換器和數模轉換器。其運行的模擬電源電壓低至2.7 V,數字內核運行電壓可低至1.7 V。其高級的片上數字信號處理能夠實現麥克風輸入的自動電平控制,并支持多種采樣率。該芯片與麥克風和揚聲器進行配合,可實現語音的采集和播放。
存儲電路由DDR2 SDRAM芯片K4T1G164QQ和NAND Flash芯片K9F2G08UOD構成。系統采用4片16位128MB的SDRM芯片來構成32位的數據接口,總大小為512MB。DDR2 SDRAM相比于老式的DDR SDRAM具有更高的運行速率與更低的功耗。SDRAM主要用來存儲臨時數據,而NAND Flash主要用來存儲根文件系統、boot代碼、系統內核代碼和簡單的數據。NAND Flash是連續存儲介質,適合存放大的數據量,其共用地址和數據總線,對一個固定大小的區域進行操作,且使用壽命長。
因為嵌入式Linux的開源性、可裁剪性和可移植性,所以其成為嵌入系統開發最常用的操作系統之一。在Linux操作系統中,內核主要用來管理軟硬件資源,并提供運行環境。要想通過Linux系統來對硬件進行操作,必須在硬件和內核之間架設一個通道,即Linux設備驅動。平臺以WM8960作為語音采集和播放芯片,因此下面簡單介紹WM8960芯片的驅動移植過程。
由于WM8960語音芯片是采用模塊的方式編譯進Linux內核系統的,故其驅動程序的入口和出口函數分別為WM8960_modinit,WM8960_exit。所謂的入口和出口函數指的是:當系統上電時,內核會將所有的驅動代碼掛載到系統里,而加載驅動首先執行的就是驅動的入口函數。而當卸載不想要的驅動時,執行的是對應驅動的出口函數。
入口函數只是將WM8960設備對應的數據結構注冊到I2C總線中。采用的方式就是調用I2C總線的接口函數i2c_add_driver()。為增強驅動的移植性,內核采用了驅動-設備分離的方式,即與硬件相關的信息放在一個結構體里注冊進內核,而與硬件無關的信息放在另一個結構體中注冊進內核。驅動和設備二者通過匹配注冊的name來進行識別,此處的注冊name為WM8960。
當驅動層和設備層通過name匹配成功之后,第一個會執行的函數就是probe函數。probe函數會判斷是否是負責驅動的設備,然后完成該設備的初始化操作。代碼如下:
static __devinit int WM8960_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id){
struct WM8960_priv *WM8960; //WM8960的私有數據結構體
struct snd_soc_codec *codec; //Codec結構體
WM8960 = kzalloc(sizeof(struct WM8960_priv),GFP_KERNEL);//分配空間
if (WM8960 == NULL)
return -ENOMEM;
codec = &WM8960->codec;
i2c_set_clientdata(i2c,WM8960);
codec->control_data = i2c;
codec->dev = &i2c->dev;
return WM8960_register(WM8960,SND_SOC_I2C); //注冊
}
probe函數首先定義了兩個非常復雜數據結構:一個WM8960的私有數據結構體WM8960,另一個是片上Linux音頻架構中的Codec結構體codec。然后,程序調用Linux內核內存分配接口kzalloc函數分配了一個空間,并且將空間的首地址交給了WM8960私有數據結構體。為了讓其他函數也能使用該內存,此處通過i2c_set_client函數將地址保存到i2c_client結構體下面的一個void*指針里。這樣,其他函數可以通過i2c_get_client函數接口來得到保存的數據。probe函數最后調用WM8960_register函數來完成WM8960的注冊。
完成上述驅動添加和注冊工作后,音頻文件的采集和播放就可以通過調用Linux系統的聲卡驅動,再調用剛注冊的WM8960音頻編解碼芯片來完成。通常,在進行語音信號采集與處理前,主程序需要對音頻采集參數進行設置,主要包括采樣率的設置、單雙通道的配置、錄音與播音緩沖區大小的設置、采樣位數的設置等。配置完成后,算法便可以從錄音緩沖區讀取采集的語音數據,處理完成后,送入語音播放緩沖區。
錄音程序的核心代碼如下:
......
int SIZE = 8;
int CHANNELS = 1;
int RATE = 8000;
int LENGTH = 3;
if (snd_open(SND_PCM_STREAM_CAPTURE, CHANNELS, RATE, SIZE) < 0) {
fprintf(stderr, "設備打開失敗= ");
return; }
size_t c, frame_size;
c = (off64_t)capture.chunk_bytes; //定義塊的大小
int count = (LENGTH*RATE)/c; //計算塊的數量
unsigned char data_buff[count*c]; //定義數據緩存大小
frame_size = c * 8 / capture.bits_per_frame; //求幀的數量
for(int i=0;i if (SND_readPcm(&capture, frame_size) != frame_size) { fprintf(stderr, "讀取錯誤
"); return; } memcpy(data_buff+i*c, capture.data_buf, c); //從數據緩沖區讀出數據 } QVector for(int i=0;i Y1[i] = (data_buff[i]-128)/128.0; //預處理 snd_close(SND_PCM_STREAM_CAPTURE); //關閉設備 ...... 3.1 實驗設計 本文設計的語音信號處理綜合實驗平臺功能比較強大,可以面向不同層次的學生進行實驗。教師可以根據學生基礎,為學生量身定制實驗套餐。如表1所示,實驗主要分為3類。 表1 實驗套餐及適用學生 注:字母說明——學生條件:A.嵌入式底層程序開發基礎;B.QT編程基礎;C.C或C++語言基礎。提供資料——I.實驗原理及要求;II.編譯好內核;III.QT界面及函數定義 由表可知,根據學生的學習基礎,老師可以選擇不同的套餐進行實驗設置,而學生可以跨過不同階段進行超前學習。不同于MATLAB的教學方法和實驗設置,該實驗設置并不固定在一種單一模式下,可進行選擇性擴展和加深。通過分層次的設置,教師可以通過不同層次的實例演示來激發學生的學習興趣,加深學生對知識的理解,也為學生從事語音信號處理相關的實際課題或競賽提供一種切實可行的實現方案和思路。對于電子類學生來說,C語言或C++是非常重要和普遍的基礎課,因此學生進行實驗困難不大,還可以鍛煉學生C語言的編程能力。下面以語音增強算法為例,介紹面向套餐3的學生實驗安排情況。 3.2 語音增強算法原理 對于任何實驗來說,學生都必須首先了解實驗的基本原理。因此,簡單介紹基于譜減法的語音增強算法的基本原理。 語音增強主要研究如何利用信號處理技術消除信號中的強噪聲干擾,從而提高輸出信噪比以提取出有用信號的技術。語音增強是語音算法中最基本,最常用的算法之一,其主要目的:①改進語音質量,消除背景噪音,使聽者樂于接受,不感覺疲勞,這是一種主觀度量;②提高語音可懂度,這是一種客觀度量。這兩個目的往往不能兼得,所以實際應用中總是視具體情況而有所側重。根據語音和噪聲的特點,常用的語音增強算法包括譜減法、維納濾波法、卡爾曼濾波法、自適應濾波法等。考慮到學生的理解程度,本文以譜減法[13]為例來進行說明。整個算法的原理如圖2所示。 圖2 譜減法原理圖 設語音信號的時間序列為x(n),加窗分幀處理后得到第i幀語音信號為xi(m),幀長為N。任何一幀語音信號xi(m)做FFT后為 (1) 對Xi(k)求出每個分量的幅值和相角,幅值是|Xi(k)|,相角為 (2) 已知前導無話段(噪聲段)時長為IS,對應的幀數為NIS,可以求出該噪聲段的平均能量為 (3) 譜減公式為 (4) 式中:a和b是兩個常數,a稱為過減因子,b稱為增益補償因子。 3.3 基于QT的算法實現 此處選擇QT作為編程載體目的:①為了便于學生直觀觀測結果;②QT是優秀的跨平臺C++圖形界面應用程序開發框架。基于QT進行Linux下的圖形界面開發,可以大大提高Linux下的編程效率[14-16]。 在沒有QT編程的基礎下,教師可以選擇套餐3開展實驗。此時,套餐3提供的基本資料包括:添加好語音采集設備的Linux內核,構建好的QT執行界面,QT的運行說明文檔以及針對該實驗的函數定義:QVector〈double〉ssubspec(QVector〈double〉&signal, int wlen, int inc, int NIS, doublea, doubleb)。這里,譜減法的實現函數為ssubspec,其輸入變量包括signal(輸入語音信號),wlen(幀長),inc(幀移),NIS(前導幀數),a(過減因子),b(增益補償因子)。基于譜減法原理設計的語音增強函數如下: QVector〈double〉ssubspec(QVector〈double〉&signal, int wlen, int inc, int NIS, double a, double b) { QVector〈double〉wnd = hamming(wlen) ; //設置窗函數 QVector〈double〉 output,X ; //譜減后的語音序列和幅值 QVector〈double〉Yphase,Yeng; //譜減前相位和能量 int N = signal.size();//信號長度 int nf = (N-wlen)/inc +1 ; //幀數 QVector〈double〉 Y = enframe(signal,wnd,wlen,nf,inc); //信號分幀 //噪聲段平均能量,參考式(3) QVector〈double〉 D=noiseeng(Y,NIS,wlen); //計算信號相位 for(int i= 0 ; i std::complex〈double〉f[wlen]; for(int j =0 ; j f[j].real() = Y[i*wlen+j]; f[j].imag() = 0;} //求信號的傅里葉變換,參考式(1) fft(f,wlen); for(int j=0 ; j //求信號相位,參考式(2) Yphase< for(int j=0 ; j Yeng<< abs(f[j])* abs(f[j]);} //譜減法降噪,參考式(4) for(int j=0 ; j if(Yeng[j]>=a*D[j]){ X< else{ X< }} output = OverlapAdd2(X,Yphase,wlen,inc,nf); //合成譜減后的語音 return output; } 當輸入為一段信噪比為5 dB語音信號時,譜減法語音增強后的效果如圖3所示。顯示的軟件為語音信號處理平臺的綜合性實驗軟件(此處為實驗平臺的完 圖3 譜減法語音增強效果圖 整界面,在單獨實驗時可根據需要進行裁剪)。菜單欄顯示了平臺可以完成的實驗,中心區為波形顯示區域,右邊為參數顯示區域。中心區的上部為原始語音信號,下部分兩段,分別為帶噪的語音波形和譜減后的輸出信號。由圖可知,增強后的信號信噪比由5 dB變為12.843 7 dB,提高了7.843 7 dB,改善效果比較明顯。從信號波形也可看出,譜減后的波形較帶噪語音有了明顯改善。 針對目前語音信號處理課程偏重于理論教學的現狀,本文秉承學以致用原則,開發了一款基于嵌入式系統的語音信號處理綜合實驗平臺。本文重點介紹了系統的硬件構成和軟件設計架構,并通過基于譜減法的語音增強實驗,驗證了平臺的性能有效性和界面友好性。此外,該平臺涉及了語音信號處理目前的主流研究方向,因此既可用于高等學院語音信號處理課程的教學工作,也可以滿足從事語音信號處理相關科研人員學習和研發的需要。 [1] 劉衛東, 孟曉靜,王艷芬. 語音信號處理實驗教學研究探索[J]. 實驗室研究與探索, 2008, 27(4): 72-74. [2] 趙 力, 梁瑞宇, 魏 昕,等. 語音信號處理[M].3版.北京: 機械工業出版社, 2016. [3] Deng F, Bao C, Kleijn W B. Sparse hidden markov models for speech enhancement in non-stationary noise environments[J]. IEEE/ACM Transactions on Audio, Speech, and Language Processing, 2015, 23(11): 1973-1987. [4] 周 健, 趙 力, 梁瑞宇,等. 基于噪聲魯棒性特征和SVM的耳語音可懂度增強[J]. 東南大學學報(英文版), 2012, 28(3): 261-265. [5] Zhang X, Zhang Y, Shi Y,etal. Power control algorithm in cognitive radio system based on modified Shuffled Frog Leaping Algorithm[J]. International Journal of Electronics and Communications, 2012, 66(6): 448-454. [6] 王 薇, 楊麗萍, 魏 麗,等. 語音情感特征的提取與分析[J]. 實驗室研究與探索, 2013, 32(7): 91-94,191. [7] 張瀟丹, 胡 峰,趙 力. 基于改進的蛙跳算法與支持向量機的實用語音情感識別[J]. 信號處理, 2011, 27(5): 678-689. [8] 楊 毅, 李澤偉, 鄧北星,等. 語音信號處理實驗的改革與實踐[J]. 實驗室研究與探索, 2014, 33(4): 123-126. [9] 伍技祥, 仲元昌, 李彩玲,等. 嵌入式數字語音處理實驗系統的設計與實現[J]. 實驗室研究與探索, 2012, 31(10): 46-49. [10] 宋亞男, 林錫海, 徐榮華,等. 機器人語音識別實驗設計與實現[J]. 實驗技術與管理, 2013, 30(2): 36-38. [11] 楊繼森, 張 靜, 朱 革,等. 基于ARM Cortex平臺的嵌入式系統課程虛擬實驗平臺設計[J]. 實驗技術與管理, 2014, 31(7): 97-101. [12] 王青云, 梁瑞宇,馮月芹. ARM Cortex-A8嵌入式原理與系統設計[M].北京: 機械工業出版社, 2014. [13] Boll S F. Suppression of acoustic noise in speech using spectral subtraction[J]. IEEE Transactions on Acoustics, Speech and Signal Processing, 1979, 27(2): 113-120. [14] 房漢雄, 穆偉斌, 齊 跡,等. 移動終端實驗教學平臺設計與應用[J]. 實驗技術與管理, 2014, 31(8): 103-105. [15] 田 磊. 嵌入式Linux系統中基于QT庫的應用程序設計[J]. 實驗室研究與探索, 2014, 33(5): 84-86,115. [16] 趙明波, 謝 楠, 王亞軍, 等. 基于RFID和QT/E車輛出入監控系統的設計[J]. 實驗室研究與探索, 2014, 33(11): 95-99. Design and Implementation of an Experimental System for Embedded Speech Signal Processing LIANGRuiyu1,2,WANGQingyun1,ZHAOLi2 (1. School of Communication Engineering, Nanjing Institute of Technology, Nanjing 211167, China; 2. School of Information Science and Engineering, Southeast University, Nanjing, 210096, China) To embody the idea of mutual promotion between teaching and scientific research, and to meet the needs of teaching and research for speech signal processing, an integrated experimental platform for embedded speech signal processing is design by using Cortex-A8 microprocessor and WM8960 audio coding and decoding chip as core hardware. Moreover, an integrated experimental teaching and development software is designed on this platform by using QT development software. Then, the system hardware structure and transplant of driver are described. By taking an example of the speech enhancement algorithm based on spectral subtraction, the speech development process based on QT is introduced. Based on this experimental platform, students can master not only the basic knowledge of speech signal processing, but also the development process of embedded software for the speech application. The system had friendly interface and strong functions, can be used for the teaching of speech and signal processing in colleges and universities, and for the research and development of related topics on speech signal processing. speech signal processing; speech enhancement; embedded; experimental teaching 2016-09-15 江蘇省“六大人才高峰”項目(2016-DZXX-023);江蘇省青藍工程,江蘇省高等教育教學改革研究課題(2015JSJG123);南京工程學院高等教育研究課題重點課題(2015ZD02) 梁瑞宇(1978-),男,江蘇徐州人,博士,副教授,主要研究方向語音信號處理。Tel.:15380920360;E-mail:lly1711@163.com TN 912.3;G 642.0 A 1006-7167(2017)05-0126-053 語音信號處理實驗設計




4 結 論