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