劉生
(南京熊貓電子裝備有限公司,南京210033)
近幾年來(lái),人工智能技術(shù)的興起,推動(dòng)了語(yǔ)音識(shí)別技術(shù)的發(fā)展,涌現(xiàn)出越來(lái)越多的智能語(yǔ)音類(lèi)產(chǎn)品。語(yǔ)音已成為基于云的語(yǔ)音助手和語(yǔ)音物聯(lián)網(wǎng)設(shè)備的主要人機(jī)交互接口。這些設(shè)備要求在任何給定的環(huán)境中都能接收到干凈的語(yǔ)音信號(hào),以確保智能揚(yáng)聲器、耳機(jī)、移動(dòng)電話、可穿戴設(shè)備、信息娛樂(lè)和智能家居系統(tǒng)的語(yǔ)音處理的準(zhǔn)確性。
語(yǔ)音前端處理[1]部分會(huì)在語(yǔ)音信號(hào)進(jìn)行語(yǔ)音識(shí)別之前,對(duì)語(yǔ)音原始信號(hào)進(jìn)行處理,實(shí)現(xiàn)降噪、回聲消除、聲源定位[2]及波束形成[3]等功能。訊飛、云知聲等相關(guān)的語(yǔ)音處理產(chǎn)品供應(yīng)商提供了麥克風(fēng)陣列處理模塊,市面上大部分模塊是使用DSP 或?qū)S眯酒瑏?lái)完成前端語(yǔ)音處理的,雖然該方案能保證前端語(yǔ)音處理的性能,但是對(duì)于一些產(chǎn)品進(jìn)行集成并不是特別方便,開(kāi)放的接口也不是很豐富。同時(shí)提高了產(chǎn)品的復(fù)雜度,增加了系統(tǒng)的成本。針對(duì)該問(wèn)題,提出基于WebRTC[4]、Snowboy[5]等開(kāi)源庫(kù),設(shè)計(jì)并開(kāi)發(fā)了語(yǔ)音前端處理系統(tǒng)。
語(yǔ)音前端處理系統(tǒng)的目標(biāo)是將麥克風(fēng)接收到的用戶發(fā)出的聲音,進(jìn)行降噪處理,更加突出語(yǔ)音識(shí)別用到的特定語(yǔ)音信號(hào)。去除的噪音包括外界的背景噪聲,也包括自身設(shè)備播放的音頻。噪音去除的越干凈,語(yǔ)音信號(hào)就越接近于聲源信號(hào),能提高語(yǔ)音識(shí)別的精確度。
語(yǔ)音前端處理主要包括語(yǔ)音活動(dòng)檢測(cè)(Voice Ac?tivity Detection,VAD)[6]、噪聲抑制(Noise Suppression,NS)、回聲消除(Acoustic Echo Cancellation,AEC)、關(guān)鍵詞識(shí)別(Keyword Detection,KWD)聲源定位(Direction Of Arrival,DOA)、波束成形(Beamforming,BF)等關(guān)鍵功能。
語(yǔ)音活動(dòng)檢測(cè)技術(shù)主要用于語(yǔ)音編碼和語(yǔ)音識(shí)別,目的是檢測(cè)語(yǔ)音信號(hào)是否存在。語(yǔ)音活動(dòng)檢測(cè)技術(shù)通過(guò)識(shí)別音頻流中的語(yǔ)音片段并對(duì)有效語(yǔ)音數(shù)據(jù)進(jìn)行處理來(lái)簡(jiǎn)化語(yǔ)音處理。該處理結(jié)果也是前端語(yǔ)音處理系統(tǒng)進(jìn)行流程控制的一項(xiàng)關(guān)鍵信號(hào)。噪聲抑制技術(shù)可以將音源中的噪音部分去除,提高語(yǔ)音信號(hào)的信噪比。噪聲可以是隨機(jī)噪聲或具有均勻頻率分布的白噪聲,也可以是由設(shè)備的機(jī)械裝置或收音過(guò)程中通過(guò)麥克風(fēng)引入的頻率相關(guān)噪聲?;芈曄梢园颜Z(yǔ)音信號(hào)中由設(shè)備本身播放設(shè)備發(fā)出的聲音剔除,只留下從外界收到的聲音。關(guān)鍵詞識(shí)別技術(shù)用來(lái)識(shí)別聲音中是否出現(xiàn)了所關(guān)注的關(guān)鍵詞,常被用來(lái)當(dāng)作喚醒詞,用來(lái)激活與設(shè)備的交互。在信號(hào)處理中,聲源定位用來(lái)確定波到達(dá)信號(hào)接收點(diǎn)的方向,通常會(huì)使用多個(gè)傳感器來(lái)組成傳感器陣列,并進(jìn)行信號(hào)的接收及處理。在前端語(yǔ)音處理中,使用麥克風(fēng)陣列進(jìn)行收音,確定音源方向。常用的聲源定位技術(shù)有波達(dá)角(AOA)、時(shí)間差定位(TDOA)、到達(dá)頻率差(FDOA)等。波束成形利用麥克風(fēng)陣列的多路語(yǔ)音信號(hào),可以對(duì)特定方向的音源進(jìn)行增強(qiáng),對(duì)其他方向的信號(hào)進(jìn)行削減。一般使用聲源定位的音源判定結(jié)果作為波束成形的語(yǔ)音增強(qiáng)方向。
整個(gè)語(yǔ)音處理系統(tǒng)主要由音源獲取、語(yǔ)音前端處理、語(yǔ)音識(shí)別及交互三部分構(gòu)成。在Linux 系統(tǒng)中,音源獲取部分通過(guò)系統(tǒng)提供的ALSA(Advanced Linux Sound Architecture)接口[7],可以讀取麥克風(fēng)陣列錄制的聲音以及系統(tǒng)播放的聲音。由于使用的是6 麥克風(fēng)陣列,所以獲得的音頻為6 通道數(shù)據(jù)。同時(shí)獲取1 個(gè)通道的系統(tǒng)播放聲音,在自動(dòng)回聲消除中使用。語(yǔ)音前端處理模塊首先對(duì)6 通道的數(shù)據(jù)進(jìn)行降噪處理,隨后利用獲得的1 通道的放音數(shù)據(jù)進(jìn)行回聲的消除。此時(shí)已經(jīng)獲得了比較純凈的聲音,對(duì)該聲音進(jìn)行語(yǔ)音活動(dòng)檢測(cè)。語(yǔ)音活動(dòng)檢測(cè)會(huì)配合關(guān)鍵詞檢測(cè)使用,當(dāng)語(yǔ)音活動(dòng)檢測(cè)有效后進(jìn)行關(guān)鍵詞檢測(cè),關(guān)鍵詞有效后會(huì)進(jìn)行聲源定位以及波束成形的處理,最終將獲得的音源方向以及通過(guò)波束成形獲得的1 通道最終的處理結(jié)果通過(guò)庫(kù)接口的形式提供給語(yǔ)音識(shí)別及交互部分。系統(tǒng)結(jié)構(gòu)圖見(jiàn)圖1。
圖1 系統(tǒng)結(jié)構(gòu)圖
在音頻處理過(guò)程中,為了提高處理效率,采用單幀依次處理的方式。對(duì)數(shù)據(jù)幀進(jìn)行劃分,幀的長(zhǎng)度為10ms,若采用16Khz 的采樣率,單通道有160 組數(shù)據(jù)。對(duì)單幀數(shù)據(jù)的處理流程圖如圖2 所示。
圖2 單幀數(shù)據(jù)處理流程圖
首先語(yǔ)音信號(hào)進(jìn)行噪聲抑制以及回聲消除處理。在進(jìn)行KWD 檢測(cè)前,需要對(duì)音頻流進(jìn)行VAD 的標(biāo)記及劃分,以獲得有效數(shù)據(jù)。及當(dāng)關(guān)鍵詞結(jié)束之后,才對(duì)緩存的數(shù)據(jù)進(jìn)行KWD 的處理。具體實(shí)現(xiàn)方法為當(dāng)VAD 有效時(shí),對(duì)當(dāng)前處理的幀做緩存并對(duì)當(dāng)前有效數(shù)據(jù)的長(zhǎng)度做計(jì)時(shí)。當(dāng)VAD 無(wú)效時(shí),即出現(xiàn)了語(yǔ)音間隔,對(duì)VAD 有效數(shù)據(jù)進(jìn)行長(zhǎng)度判定。如果大于500ms,則認(rèn)為收音長(zhǎng)度是足夠的,進(jìn)行KWD 處理,如果小于500ms,則重新統(tǒng)計(jì)時(shí)間。在KWD 處理之后,如果KWD 識(shí)別成功,則對(duì)關(guān)鍵詞部分進(jìn)行DOA 處理,獲得音源方向,并以此為定向波束形成的參數(shù),進(jìn)行BF 的處理,最后將BF 的處理結(jié)果傳遞給上層應(yīng)用。當(dāng)進(jìn)入BF 的處理流程后,由于DOA_Flag 會(huì)持續(xù)有效,后續(xù)的數(shù)據(jù)流會(huì)直接進(jìn)入BF 處理,不需要再次進(jìn)行KWD 以及DOA 的檢測(cè)。當(dāng)外界的語(yǔ)義停止后,如果持續(xù)時(shí)間大于10 秒,需要將系DOA_Flag 置為無(wú)效,重新進(jìn)行VAD、KWD 以及DOA 的檢測(cè)。即如果用戶如果持續(xù)10 秒不進(jìn)行對(duì)話,則認(rèn)為對(duì)話終止,需要重新通過(guò)關(guān)鍵詞喚醒。
前端語(yǔ)音模塊的主處理函數(shù)對(duì)數(shù)據(jù)幀逐幀處理,關(guān)鍵代碼如下:
對(duì)于前端語(yǔ)音各個(gè)功能組件,主要使用了We?bRTC、Snowboy 等開(kāi)源庫(kù),DOA 部分基于SRP-PHAT實(shí)現(xiàn)。WebRTC(Web Real-Time Communication)是基于網(wǎng)頁(yè)瀏覽器進(jìn)行實(shí)時(shí)語(yǔ)音或視頻對(duì)話的開(kāi)源庫(kù)。主要使用了其中的語(yǔ)音引擎部分。Snowboy 是一款高度可定制的喚醒詞檢測(cè)引擎,可以用于實(shí)時(shí)嵌入式系統(tǒng),并且始終監(jiān)聽(tīng)(即使離線)。使用Snowboy 提供的關(guān)鍵詞訓(xùn)練方法,在線訓(xùn)練了定制的關(guān)鍵詞。DOA 部分使用了基于相位變換加權(quán)可控響應(yīng)功率(SRP-PHAT:Steered Response Power-Phase Transform)[8]的聲源定位算法,基于Xtensor、Xtl、OpenBLAS 等庫(kù)實(shí)現(xiàn)。關(guān)鍵代碼如下:
本文使用ReSpeaker Core v2.0 作為實(shí)驗(yàn)平臺(tái)。Re?Speaker Core v2.0 基于四核ARM Cortex A7 的Rock?chip RK3229,運(yùn)行頻率為1.5GHz,具有1GB RAM,集成六個(gè)麥克風(fēng)陣列,如圖3 所示。軟件環(huán)境為L(zhǎng)inux Debian-9。通過(guò)使用alsa-lib 庫(kù)讀取麥克風(fēng)采集到的音頻信號(hào)。采集到的音頻信號(hào)如圖4 所示。實(shí)驗(yàn)中,從麥克風(fēng)陣列的mic1 方向說(shuō)出“小貝小貝,天氣”,重復(fù)兩次。其中關(guān)鍵詞為小貝小貝,指令詞為天氣。使用ReSpeaker 連接喇叭在同樣的方向播放音樂(lè)。在偏移90°方向利用放音裝置播放一段語(yǔ)音。在靠近時(shí)長(zhǎng)約為6 秒,音頻波形圖見(jiàn)圖4。
圖3 ReSpeaker Core v2.0麥克風(fēng)陣列板
圖4 測(cè)試音頻波形圖
圖4 中自上而下依次為:從麥克風(fēng)采集到的數(shù)據(jù)6個(gè)通道中的一路數(shù)據(jù);經(jīng)過(guò)降噪以及回聲消除之后的數(shù)據(jù);經(jīng)過(guò)關(guān)鍵詞檢測(cè)、聲源定位以及波束形成處理后的音頻數(shù)據(jù)??梢钥吹?,經(jīng)過(guò)降噪處理,數(shù)據(jù)的背景噪音得到了較好的抑制,同時(shí)對(duì)音頻中干擾比較大的通過(guò)喇叭播放的音樂(lè)數(shù)據(jù),基本以及過(guò)濾干凈,主要留下發(fā)音人以及外界放音裝置播放的一段語(yǔ)音。由于在最初的約200ms 時(shí)間,系統(tǒng)降噪功能需進(jìn)行采樣初始化,所以最初約200ms 時(shí)間并未得到有效的降噪處理,但這對(duì)系統(tǒng)整體功能,并無(wú)太大影響。
對(duì)比中間以及最下面的音頻波形圖,觀察3 秒附近以及5 秒之后的數(shù)據(jù),可以明顯看到通過(guò)波束形成處理,將干擾源方向的數(shù)據(jù)進(jìn)行了有效過(guò)濾,最后只剩下關(guān)注方向的音源數(shù)據(jù)。但是同時(shí),經(jīng)過(guò)波束成形處理之后,音頻整體的增益有所下降,如果有必要,可以實(shí)時(shí)自動(dòng)增益控制(AGC)的處理。
波形圖中的第一段為關(guān)鍵詞(約1 秒到2 秒間數(shù)據(jù)),在進(jìn)行聲源定位及波束形成前,音頻數(shù)據(jù)并不輸出,所以關(guān)鍵詞部分的音頻數(shù)據(jù)并不會(huì)通過(guò)調(diào)用接口傳給上層應(yīng)用。當(dāng)語(yǔ)音活動(dòng)檢測(cè)以及關(guān)鍵詞檢測(cè)都有效之后,會(huì)進(jìn)行聲源定位以及波束形成的處理,同時(shí)將輸出的數(shù)據(jù)發(fā)送到上層應(yīng)用。所以在最后的音頻數(shù)據(jù)中,是將首次進(jìn)行關(guān)鍵詞喚醒的音頻去除了的。第二次關(guān)鍵詞數(shù)據(jù)(約3.3 秒到4.3 秒間數(shù)據(jù)),由于系統(tǒng)未達(dá)到VAD 無(wú)效時(shí)間大于10 秒的條件,所以不會(huì)重啟關(guān)鍵詞識(shí)別功能,會(huì)利用上次關(guān)鍵詞喚醒階段獲得的音源定位方向進(jìn)行波束成形的處理。
需要指出的是,在實(shí)驗(yàn)中,如果偏移90°方向的放音裝置播放的語(yǔ)音聲音太大,或者在和關(guān)鍵詞數(shù)據(jù)重合的時(shí)候,容易造成關(guān)鍵詞識(shí)別無(wú)效。對(duì)于該問(wèn)題可以通過(guò)進(jìn)一步訓(xùn)練關(guān)鍵詞識(shí)別庫(kù),提高關(guān)鍵詞的識(shí)別能力,另外需要盡量加大音源與干擾源間的功率差來(lái)提高聲源定位的精度。
本文結(jié)合智能語(yǔ)音機(jī)器人對(duì)語(yǔ)音前端處理的功能需求,對(duì)語(yǔ)音前端處理系統(tǒng)做了系統(tǒng)設(shè)計(jì),利用開(kāi)源的庫(kù)進(jìn)行了實(shí)現(xiàn)。通過(guò)實(shí)現(xiàn)結(jié)果驗(yàn)證,系統(tǒng)的降噪、回聲消除、聲源定位以及波束形成等功能可以正常運(yùn)行,該語(yǔ)音前端處理系統(tǒng)能滿足語(yǔ)音機(jī)器人的基本要求。由于整個(gè)系統(tǒng)都是使用C 及C++語(yǔ)言實(shí)現(xiàn),對(duì)于基于嵌入式ARM 系統(tǒng)來(lái)實(shí)現(xiàn)智能語(yǔ)義對(duì)話機(jī)器人的實(shí)現(xiàn),具有重要意義。