劉澤琛,焦繼業,崔智恒,安超
(1.西安郵電大學電子工程學院,陜西 西安 710121;2.西安郵電大學計算機學院,陜西 西安 710121)
在離線語音產品中,由于其系統脫離了云端的服務器,語音模板庫的訓練只能通過自身系統來建立[1],所以合理的使用人體模型作為參考,選用合適的語音特征參數對于語音識別系統非常重要[2],也是離線語音識別技術的研究重點[3]。對于離線語音識別產品,不是越先進的算法就越適用[4],需合理地選用算法結構和運算以達到提取特征參數的效果[5],既可以降低系統的成本又可以很快地應用到產品中去[6]。該文面向離線語音產品的設計,對MFCC 參數的提取階段進行了重點學習和研究,使用合理的算法結構來降低系統運算成本,并針對軟件實現MFCC 參數提取過程中產生的大量且重復性計算問題,對MFCC 參數的提取進行了算法優化設計,并給出硬件設計方案以提高運算效率。
MFCC 參數由Davis[7]等人在二十世紀八十年代提出,具有良好的識別性能和抗噪能力[8-9]。MFCC參數的提取過程充分考慮了人耳聽覺特性,而且沒有任何前提假設[10],該參數通過將線性頻譜轉換到Mel 頻譜中,再將信號的對數能量轉換在倒譜上而得到。MFCC 特征參數提取流程如圖1 所示。

圖1 MFCC參數提取流程圖
1)語音信號在經過預處理(預加重、分幀、加窗)后變為短時信號,使用傅里葉變換將這些時域信號X(n)轉化為頻域信號X(m),并由此計算它的短時能量譜P(f)。

2)求出的每一幀能量譜P(f)通過Mel 濾波器,計算在該Mel 濾波器中的能量。在頻域中相當于把每幀的能量譜P(f)與Mel 濾波器的頻域響應Hm(k)相乘并相加,最后求其對數能量S(m)。

式中,k表示第k個濾波器,M表示濾波器總個數。
3)S(m)表示第k個濾波器的輸出能量,則C(n)為輸出的MFCC 參數。

式中,P為MFCC 參數的階數。
在時域上,提取出語音信號的信息特征非常困難[11],通常會把時域的語音信號轉換至頻域上來分析,該設計采用快速傅里葉變換FFT 進行時頻轉換,作為離散傅里葉變換DFT 的快速算法,其函數表達式如下:

其中,原始的語音信號表示為x(n)。在該設計中,由于語音信號都是實數計算,所以直接將x(n)作為一個虛部為0 的復數序列進行計算。
但是在語音分幀時相鄰幀之間需要相互重疊來彌補加窗時的信號消弱,相鄰兩幀起始位置的時間間隔就是幀移[12],在本設計中讓幀移等于幀長的一半,也就是每相鄰的兩幀語音信號就會重疊50%,以此保證語音信號的連續性[13-14]。由于語音信號有50%的幀重疊段,所以在對語音信號做FFT 計算時,每兩幀信號就會產生一次重復計算,但是兩幀重疊部分的計算結果是相同的。為了節省運算時間,該設計提出優化的時頻轉換方法,重復利用這半幀的數據,節省了FFT 計算時間。假設一幀語音信號中有樣本點N,并且帶有50%的幀移,每幀的計算公式可用式(5)表示:

其中,k=0,1,…,N-1,Xold(k)和Xnew(k) 又都可以用式(6)表示:

在計算過程中,Xold(k) 就是在幀移N/2 的基礎上,上一幀語音信號計算過的后半重疊部分,Xnew(k)是在幀移N/2 的基礎上,下一幀語音信號計算過的前半重疊部分,又將在下一幀計算中變為Xold(k)。使用Matlab 對改進后的優化設計與直接進行時頻轉換的結果進行了比較,輸出結果相同。在此算法改進的基礎上,下文給出了硬件結構圖,避免了由于幀移而產生的重復計算,進而節省了運算時間。
該設計使用一組三角形濾波器形成濾波器組,為了更好地提取出語音低頻信息,這些濾波器在頻率坐標軸上不是均勻分布的,在低頻區域有很多的濾波器,它們分布比較密集,但在高頻區域,濾波器的數目就變得比較少,分布很稀疏。此過程中,濾波器參數的計算過程復雜,如果每次都直接計算,會存在很大的計算量。通過分析算法可知,濾波器中心頻率f(m)、對應的線性頻率f和線性頻率對應的FFT點數等參數的計算都可以脫離中間參數進行提前計算。該設計的每一個三角濾波器的中心頻率f(m)可以使用式(7)進行轉換,假設在采樣率為fs的情況下,語音經過N點FFT 計算之后得到三角濾波器中心頻率f(m)的計算公式為:

其中,fl為濾波器頻率范圍的最低頻率;fh為濾波器頻率范圍的最高頻率;N為FFT 時的長度;fs為采樣頻率。fMel函數為:

根據式(8)可以得出最大的Mel頻率為2 146 mel,由于在Mel 頻率刻度范圍內,各個濾波器的中心頻率是相等間隔的線性分布。由此可以計算出兩個相鄰三角濾波器中心頻率的間距為ΔMel=fmax/(k+1)=93.3 mel。各三角濾波器在Mel頻率刻度的中心頻率可以由Mel頻率與線性頻率的關系式求出,由中心頻率計算出對應的線性刻度的頻率。該設計中Mel 濾波器共有24 組,FFT 計算點數為256,所以此過程的計算,提前使用Matlab 工具計算產生24×128 的bank系數矩陣,將bank 系數矩陣存入系統中,需要時直接讀取使用,大幅減少了計算量和時間。同時該設計采用DCT 進行傅里葉逆變換,輸出12 階的MFCC 參數,式(3)為DCT 變換公式。由于這部分計算大多是重復性計算,而且三角函數的計算會引入CORDIC 算法,使得MFCC 參數的輸出精度變低,準確性將被影響,所以可以提前計算好nπ/M、(m-0.5)、余弦值等參數,產生一個12×24 的DCT 的變換系數矩陣,將DCT 的變換系數矩陣存入系統,使用時直接讀取。
語音特征參數提取階段系統的硬件實現流程框圖如圖2所示。整個語音特征參數提取系統分為定點計算部分和浮點計算部分,原始語音信號使用Matlab將wav格式文件轉換為coe格式文件,保存在原始語音存儲ROM 中。語音特征參數提取系統先從原始語音數據存儲的ROM 中讀取出一幀的音頻數據傳送給預加重模塊,然后開始計算該幀數據的MFCC 參數。等待該幀的MFCC 參數計算結束后,再讀取下一幀音頻數據,以此類推,直到檢測完語音最后一幀數據為止。將處理后得到的MFCC 參數使用在線抓取的方式存儲于ILA 中,然后導出至本地文件。

圖2 硬件實現流程框圖
輸入語音信號以后,進行語音信號預處理,語音被分為很多幀數據等待處理。該設計中一段語音的MFCC 參數計算是以幀為單位進行的,計算每幀信號會產生12 個特征參數,測試語音共127 幀數據,使用全局狀態機進行控制。如圖3 所示,特征參數提取模塊空閑狀態為IDLE 狀態,等待觸發起始條件進行數據處理。

圖3 全局狀態機轉移圖
當啟動計算信號Start 有效時,由IDLE 狀態進入COMUTEMFCC 狀態,開始對第一幀數據的MFCC 進行計算。當第一幀數據計算完成時,將計算結果存儲在FIFO 中等待COMPUTEEND 狀態對其數據進行讀取,當觸發計算結束的信號MFCC_ValidEnd 有效時,模塊進入COMPUTETAP 狀態,對部分相關的變量進行復位,取數地址減128,這個位置就是前一幀數據地址的中間位置,這樣進行取地址操作,就可以實現兩幀數據重疊50%。Cnt計數至127時,127幀數據的MFCC 全部計算完成,模塊進入COMPUTEEND狀態,對COMUTEMFCC 狀態下存儲在FIFO 中的MFCC 參數進行讀取,Cnt1 計數到1 525,證明127 幀數據的MFCC 系數被全部讀取完成,讀取結束后系統回到IDLE 狀態等待Start信號再次啟動計算。
時頻轉換模塊的硬件設計結構圖如圖4 所示。

圖4 時頻轉換模塊
當語音信號進入到輸入緩沖區buff 后,語音數據被分為N/2 個采樣樣本,每兩個連續語言段將形成一個重疊幀,每一段語音幀都要經過式(6)的計算,然后將當前語音段的計算結果Xnew(k)又存儲在輸入緩沖區H_RAM 中的K 地址處(又在下一幀計算中被重新用作Xold(k),同時Xold(k)在輸入緩沖區H_RAM 中的K 地址被讀取,并與Xnew(k)又一起產生如式(5)所示的當前幀的快速傅里葉變換結果。經過FFT 之后,產生的數據格式是復數,為了給FFT 產生的頻譜求模值,該設計使用CORDIC 算法計算復數模值,使用簡單的移位,加減操作減少計算量。
該模塊用于實現MFCC 參數的輸出并通過狀態機來控制。CORDIC 算法計算結束之后,使用全浮點運算來提升運算精確度。該模塊可以分為緩存模塊和計算模塊兩個部分,緩存模塊部分包括常數的存儲和計算結果的緩存。Mel 濾波器的中心頻率、對應的線性頻率和特征提取流程中的中間參數可脫離中間參數,提前使用Matlab 工具計算并產生bank 系數矩陣,將bank 系數矩陣存放在Mel 濾波器組參數ROM 中,等待計算時直接提取。再將離散余弦變換中的DCT 系數矩陣存入bank ROM 等待使用。該模塊MFCC 參數的輸出計算使用如圖5 所示。

圖5 該模塊狀態機轉移圖
具體計算實現的過程:將待處理的功率數據向量t存儲于ROM 中。bank 系數矩陣中每一行向量都要與t向量相乘,即128 個元素的相乘再相加的運算。按順序每次讀取bank ROM 的128 個數和t進行乘累加運算,得到一個數,對bank ROM 中所有數計算完后,即完成bank 系數矩陣和t向量的相乘,就會得到24 個數,分別對其取自然對數后存于RAM 中。同理,計算DCT 的變換系數矩陣和自然對數向量的乘積向量c1;不同之處在于每得到c1 的一個元素,就利用浮點乘法器計算其與對應歸一化倒譜提升窗口w元素的乘積,然后存于MFCC_FIFO 中。
該設計在使用Matlab 測試之前,提前錄制好一段測試語音,保存為wav 格式,等待測試時使用,測試時使用Matlab 工具直接讀取wav 格式的語音數據進行處理,測試所使用的語音時長為2 s,共有127幀,每幀經過特征參數提取系統都會產生一組12 階的MFCC 參數,從而形成一個12×127 的MFCC 參數矩陣,將其作為語音特征參數矩陣,以便語音識別階段使用,測試使用Matlab 和Vivado 分別對測試語音的MFCC參數矩陣輸出進行仿真,波形結果如圖6所示。

圖6 特征參數矩陣Matlab仿真圖
將bit 文件下載至FPGA 開發板。隨機選取一幀語音的12 階MFCC 參數,將該幀的Matlab 仿真計算結果與ILA 抓取到的MFCC 參數做對比,數據結果顯示平均誤差僅為0.92%,可以滿足設計的準確率要求,數據結果如表1 所示。

表1 誤差對比表
測試使用的示例語音總計127 幀數據,每當系統計算出一幀語音數據的MFCC 參數,MFCC_ValidEnd標志位信號就有效一次,語音有效次數為127 次,總計提取出127 幀語音信號的MFCC 參數,總計用時為22.71 ms,該設計中特征參數提取模塊計算一幀MFCC 參數的時間為0.18 ms。
文中對MFCC參數提取系統的性能參數進行了對比,性能參數對比如表2 所示。相較于ARM Cortex-M4、TMS320 DSP 平臺使用軟件實現MFCC 參數提取,該設計采用硬件設計進行語音特征參數提取加速,在運行速度上有了大幅度提升,提取一幀語音數據的MFCC 參數運算速度分別提升了51 倍和67 倍。相較于其他硬件實現方案,該設計在時頻轉換模塊,節省了FFT 的重復計算并將MFCC 輸出階段做了優化,將Mel 濾波器和DCT 計算的相關參數脫離系統計算形成稀疏矩陣,保存在參數ROM 中,供直接訪存使用,省去每次計算的耗時,較少硬件資源利用率,換來了計算速度近3 倍的提升,系統功耗也得到了降低,可以滿足實時性較高的離線語音識別產品設計要求。

表2 性能參數對比表
該文提出優化的語音MFCC 參數提取方案,節省了由于幀移而產生的FFT 重復計算,同時省去了Mel 濾波器和DCT 計算帶來的耗時,平均誤差為0.92%,提取一幀MFCC 參數的耗時為0.18 ms,可以滿足離線語音識別產品設計的實時性要求。