崔智恒,焦繼業(yè),祝禛天
(1.西安郵電大學計算機學院,陜西 西安 710121;2.西安郵電大學電子工程學院,陜西 西安 710121)
語音增強是語音識別的重要組成部分,目前已經被廣泛應用于電話語音撥號、家電遙控、汽車設備的語音控制、智能玩具等領域。此外,隨著IC技術和信號處理技術的不斷發(fā)展,電子設備的體積變得越來越小,這就要求在擁有良好增強效果的前提下,減少麥克風的數量,壓縮體積,才能滿足設備的小型化需求[1]。語音增強主要分為單通道語音增強和多通道語音增強。單通道的算法中都有一個基本的假設,即噪聲是平穩(wěn)的[5],因此對非平穩(wěn)噪聲的抑制能力有限。為了解決單通道語音增強系統(tǒng)存在的不足,提出了多通道的語音增強算法[8]。對于小型化的嵌入式設備語音增強,如何在保證陣列體積不能過大及系統(tǒng)實時性的前提下,提升語音增強的性能成為需要解決的問題。
針對這一問題,文中提出一種結合一階差分陣列與語音活動檢測的雙麥克風語音增強算法,并給出了硬件實現方案。
在不考慮聲學反射的條件下,雙麥克風陣列中每個麥克風所接收到的信號可以表示為:
式中,xi(t)(i=1,2)為兩個麥克風接收到的帶噪語音信號,s(t)為純凈語音信號,ni(t)(i=1,2)為兩個麥克風接收到的噪聲信號,Δt為聲源到達兩個麥克風之間的延遲時間。
對于遠場語音信號,聲音到達兩個麥克風的傳播模型[11]如圖1所示,圖中d為麥克風間距,由圖1可知,聲源到達兩個麥克風之間的延遲時間Δt=(dcosθ)/c,c為聲速。
圖1 雙麥克風陣列傳播模型
一階差分陣列的延遲相減實現框圖[12]如圖2 所示,延遲單元T=c/d,∑表示求和運算。
圖2 延遲相減實現框圖
由圖2 可得,一階差分陣列的輸出信號為:
一階差分陣列的期望聲源一般在陣列的沿線方向,即θ≈0°,所以式(4)可以近似為:
因此,y2(t)中只包括噪聲項,y1(t)不僅包括空間波束所增強的語音,還包括部分殘余噪聲,通過y2(t)通道中的參考噪聲來抵消y1(t)通道的殘余噪聲就可以進一步實現語音增強。
根據文獻[13]給出的具體設計方法,定義先驗信噪比:
上述雙麥克風陣列語音增強方法需要首先估計先驗信噪比,而先驗信噪比的計算又依賴于參數β,即靜音段的比值,所以靜音段的估計決定著語音增強性能的好壞。傳統(tǒng)方法采用語音數據的前幾幀作為對靜音段的估計[14],這種方法易于實現,可以在一定程度上實現噪聲的去除;但是對靜音段的估計過于粗略,當估計不準確時會大大降低語音增強的性能。語音活動檢測可以通過計算語音數據的特征參數實現有無聲段的判定。因此引入語音活動檢測來實現靜音段的準確估計,由此可以進一步提升語音增強的性能。綜合考慮小型化嵌入式設備對計算量和實時性的要求,文中設計選擇基于短時幅度值和過零率的雙門限語音活動檢測方法[15]來實現對靜音段的估計。
短時幅度值主要用來區(qū)分清音和濁音,因為清音的能量相對于濁音要小的多,因此可以用它作為有無聲段的判定門限之一。其定義如式(8)所示:
式中,N為幀長,E為每一幀對應的短時幅度值。短時過零率指信號在一幀時間內通過零值的次數,其定義如式(9):
式中,Z為每一幀對應的過零率,sgn(x)是符號函數。
圖3 給出了改進前增強算法的實現流程,采用語音數據的前幾幀作為靜音段的估計。圖4給出了引入語音活動檢測后增強算法的實現流程,使用語音活動檢測實現對靜音段的估計,VAD表示語音活動檢測。
圖3 改進前算法流程
圖4 改進后算法流程
增強算法最初是在可以進行高精度浮點運算的Matlab 平臺開發(fā)的。在FPGA 實現時,需要考慮到數據精度的問題。全浮點運算無疑會占用較多的資源,不利于部署在資源有限的平臺。全定點計算雖然降低了資源的占用,但是由于數據精度不足,會導致系統(tǒng)中增加量化噪聲,影響語音增強的質量。文中設計為了平衡硬件資源和性能,制定了定點—浮點分塊結構,分為定點計算部分和浮點計算部分,系統(tǒng)整體架構如圖5 所示。
圖5 硬件實現架構圖
因為語音信號具有短時平穩(wěn)性,所以需要對其進行分幀操作。為了保證語音信號的連續(xù)性和完整性,每幀數據之間都會有重疊,即幀移。為了便于FPGA 實現,設計中幀長選擇為256,幀移為128。
加窗處理可以避免傅里葉變換時發(fā)生頻譜泄漏。該設計中窗函數選擇升余窗中的漢寧窗,窗長為256。
圖6 所示是語音預處理模塊的FPGA 實現框圖,該模塊主要包括分幀、加窗、FFT、CORDIC 及去除鏡像緩存FIFO。為了實現更高效的開發(fā),FIFO、FFT 和CORDIC 均采用Xilinx 現有的IP 核。通過兩個FIFO作乒乓緩存實現分幀操作,這里參考時鐘頻率為50 MHz。分幀之后數據重疊一半,導致數據率增加一倍,而FFT 及CORDIC 模塊占用資源較多,所以將這部分計算模塊的時鐘頻率增加一倍來匹配數據率,參考時鐘頻率為100 MHz。數據分幀之后的加窗是利用LUT 查找表的方式提取漢寧窗函數,再通過乘法器實現的。經過FFT 處理后的數據有一半是鏡像頻率,只需要處理有效頻率,所以數據率降低了1/2,此時,同步時鐘頻率降為50 MHz。
圖6 語音預處理框圖
語音活動檢測主要涉及短時幅度值和過零率兩個關鍵參數的計算。數據的絕對值可以通過判斷最高位進行計算,將一幀數據的絕對值進行累加就可以輸出這幀的短時幅度值,同時累加器清零開始下一幀的累加。在過零率的計算中,分幀后的數據被延遲一個時鐘,然后在每個時鐘周期中判斷延遲前每一幀和延遲后每一幀的最高位。如果數據的最高位不同,則判別結果為1,否則判別結果為0。最后,在一幀數據范圍內對判別結果進行累加得到過零率。
對靜音段的估計采用有限狀態(tài)機實現,門限閾值的設定基于背景噪聲,取前6 幀數據的短時幅度值和過零率,分別求取平均值來計算短時幅度值和過零率的門限閾值,如式(10)、(11)所示。
式中,amp_average、zero_average 分別為前6 幀數據短時幅度值和過零率均值,amp_th 為短時幅度值門限,zero_th 為過零率門限。狀態(tài)轉移如圖7 所示,包括4 個狀態(tài):S0(初始態(tài))、S1(靜音態(tài))、S2(過渡態(tài))、S3(語音態(tài))。frm_count表示幀計數,voice_count表示語音幀計數,voice_min 表示語音最小幀數。
圖7 靜音段估計狀態(tài)轉移圖
在初始態(tài)S0,復位voice_count,當幀計數大于或等于1 時跳轉到靜音態(tài)S1。在靜音態(tài)S1,如果短時幅度值小于或等于amp_th 且過零率小于或等于zero_th,則繼續(xù)停留在S1 態(tài);如果短時幅度值大于amp_th 或過零率大于zero_th,則跳轉到過渡態(tài)S2,同時voice_count 加1。在過渡態(tài)S2,如果短時幅度值大于amp_th 或過零率大于zero_th 且語音幀計數小于voice_min,繼續(xù)停留在過渡態(tài),同時voice_count加1,這是為了消除能量比較大的突發(fā)噪聲所造成的影響。如果短時幅度值小于或等于amp_th 且過零率小于或等于zero_th,則跳轉到靜音態(tài)S1,同時voice_count 清零;如果短時幅度值大于amp_th 或過零率大于zero_th且語音幀計數大于或等于voice_min,則跳轉到語音態(tài)S3,此時靜音段的估計流程結束。
經過化簡,增強之后的語音功率可以表示為:
根據上述所設計的開方及相位插入模塊如圖8所示。
圖8 開方及相位插入
得到增強語音的頻域輸出之后需要進行傅里葉逆變換,將頻域信號還原為時域信號。由于前面去除了鏡像頻率數據,而IFFT 又做256 點,所以需要補零,這就導致數據率提高了一倍。為了節(jié)省資源,這里只使用一個IFFT IP,IFFT 處理時鐘也提高一倍,利用FIFO 進行跨時鐘域處理。IFFT 輸出的數據實部是分幀之后的語音數據,需要通過重疊相加來進行幀還原,數據率降低1/2,與IFFT 之前輸入數據的數據率相同,這里也使用FIFO 進行跨時鐘域處理。IFFT 及幀還原如圖9 所示。
圖9 IFFT及幀還原
文中設計在FPGA平臺Xilinx Artix-7(XC7A35TL1CSG324I)開發(fā)板進行驗證,驗證平臺如圖10所示。
圖10 驗證平臺
測試語音數據來自中文語音數據庫THCHS30,使用軟件模擬雙麥克風陣列模型得到兩路語音數據,并將兩路數據存儲到FPGA 的ROM 中作為語音輸入。為了數據的直觀顯示,通過邏輯分析儀ILA抓取硬件產生的輸出,并導入到Matlab 中與軟件端實現的結果進行比較,實驗結果如圖11 所示。
圖11 語音波形圖
通過對比波形可以看出,帶噪語音經過處理后可以有效實現語音增強,引入語音活動檢測可以大大提高語音增強的質量,并且FPGA 的實現也是有效的。
文中還使用多段語音進行客觀語音質量評估(Perceptual Evaluation of Speech Quality),將PESQ 得分作為評價語音質量的指標,PESQ 得分對比如表1。
表1 PESQ得分對比
由表1 可以看出,引入VAD 后,Matlab 輸出增強語音PESQ 得分平均提高了20.18%;FPGA 輸出的增強語音與Matlab 輸出相比,得分平均下降了1.83%,與帶噪語音相比,得分平均提高了45.61%,可見通過引入VAD 可以有效提高語音增強的性能,并且FPGA 的實現與Matlab 等效,證明了FPGA 實現的準確性。
另外,對該設計進行了實時性評估,以處理1 s的16 kHz 語音的時間為評價指標,該設計僅需要1.92 ms 便可完成語音增強,可以滿足實時語音增強的需求。
表2 為該設計經過Vivado 綜合布局布線之后的資源消耗情況。由表可知,該設計相對于文獻[16-17]中單通道語音增強設計,資源消耗有所增加,但是卻實現了雙通道語音增強,克服了單通道語音增強對非平穩(wěn)噪聲抑制效果不佳的缺點,并且占用的硬件資源適中,適合應用于嵌入式設備[18]。
表2 資源利用對比
文中面向小型化嵌入式設備提出一種基于一階差分陣列的雙麥克風語音增強方案,針對現有算法容易因靜音段估計不準確造成語音增強性能下降這一問題,提出了通過語音活動檢測對有無聲段進行判別,實現對靜音段準確估計的改進方案。實驗結果表明,該方案相對于優(yōu)化前設計,語音PESQ 得分平均提高20.18%,并且基于FPGA 的實現與純浮點Matlab 平臺等效,可實現實時語音增強,為小型化嵌入式設備語音增強提供了方法。后續(xù)工作中還需要深入研究,使用更高效的語音活動檢測方法來提升語音增強的性能。