智能語音之遠場關鍵詞識別實踐(一)


語音識別主要分兩大類:大詞匯量連續語音識別技術(Large Vocabulary Continuous Speech Recognition,LVCSR)和關鍵詞識別(keyword Spotting,KWS)。LVCSR由於對算力要求較高,一般在雲端(服務器側)做,而KWS對算力的要求相對較小,可以在終端上做。我們公司是芯片設計公司,主要設計終端上的芯片,想要在語音識別上做點事情,最可能的是做KWS,於是我們就選擇KWS來實踐語音識別。按距離遠近,語音識別可分為近場識別和遠場識別,遠場的應用場景更豐富些,如智能音箱、智能家居等,如是遠場的話需要用到麥克風陣列。討論下來我們決定做遠場下的關鍵詞識別。圖1是其框圖:(麥克風陣列為圓陣且有四個麥克風,即有四個語音通道)

                                                  圖 1

從上圖可以看出,系統可以分為前端和后端兩部分。前端主要包括去混響、聲源定位和波速形成(beamforming)、單通道降噪四大模塊。混響是指聲音信號遇到牆壁、天花板、地面等障礙物形成反射聲,並和直達聲相疊加的現象。去混響就是去除那些疊加的聲音。聲源定位是利用多通道語音信號來計算目標說話人的角度和距離從而實現對目標說話人的跟蹤,嚴格的聲源定位是指同時確定說話人的角度(包括方位角、俯仰角)和距離。在消費級的麥克風陣列中,通常關心的是聲源到達的方向,也就是波達方向(Direction of Arrival,DOA)。波束形成是對信號進行空域濾波,將多個通道的語音數據變成一個波束(即一個通道)的目標聲源,目標聲源的信干噪比(SINR)得到提升。單通道降噪是抑制單個通道上的噪聲。后端主要包括特征提取和神經網絡模型推理兩大模塊,特征提取是得到作為神經網絡模型輸入的語音的特征向量,神經網絡模型推理是根據輸入的特征向量計算出一個輸出。不管是前端還是后端,對我們都是陌生的,討論下來由於我們team人數較少就先從后端入手,有一個識別率較高的模型后再去做前端相關的。本篇先講在后端上的一些實踐,下篇講在前端上的一些實踐以及將前端和后端連起來形成一個完整的方案。

 

后端主要是語音識別相關的。語音識別分為訓練和識別兩個階段。在訓練階段,用海量的相關的語料訓練出一個識別率較高的神經網絡模型。在識別階段,采集到的語音經過前端處理后提取出特征向量再經過神經網絡模型推理得到相應的輸出。后端的主要工作如下:訓練語料獲取、語料數據增強、模型訓練、模型量化、模型推理實現等。

 

1,  訓練語料獲取

訓練語料一般有三種辦法獲得。一是用公開的語料庫,中文比較出名的語料庫有thchs30等,但這些公開的一般適用於LVCSR,不太適用於KWS,因為KWS是一些特定詞。二是花錢買,三是自己錄。花錢買的語料庫一般較貴,當前我們處於起步階段,所以我們決定自己錄語料。自己錄要先選定應用場景和關鍵詞,討論后我們選定了智能家居場景,關鍵詞包括“打開空調”、“關閉空調”、“打開窗簾”、“拉上窗簾”等。定好關鍵詞后就開始錄音了,我們先后錄過兩次音。第一次錄音是在做后端神經網絡模型時,錄的是單聲道數據。找來5台安卓手機,裝上錄音軟件easyrecord,放在一個安靜的會議室里,距離說話人50CM左右處,示意如圖2:

                                      圖 2

說話人先以正常語速說一遍關鍵詞,然后以較快語速說一遍,最后以較慢語速說一遍。當時請了部門里幾乎所有同學近100人參與錄音,得到了一個我們自己定義的單聲道關鍵詞的語料庫。由於人數較少,是一個小語料庫。第二次錄音是在做前端麥克風陣列中去混響、波束形成等算法時,錄的是多聲道數據。買來一塊多聲道采集的評估板放在一個大會議室里,同時評估板邊上放風扇、菜場等噪聲,說話人在相對遠處不同的位置上說關鍵詞,示意如圖3:

                                                             圖 3

依舊是先以正常語速說一遍關鍵詞,然后以較快語速說一遍,最后以較慢語速說一遍。這是一個帶不同種類噪聲的關鍵詞多聲道語料庫。

 

2,對語料做數據增強

剛開始我們采集到語料后就開始訓練模型了。由於錄到的語料都是干凈語音,模型訓練好后干凈語音識別率還可以,但是帶噪語音就不行了。遇到問題就要找解決方法。調查后發現通常的做法是對語料做數據增強(augmentation)。所謂數據增強就是用一些音頻處理的算法(比如加噪聲)對已有的訓練集里的語音(通常訓練集里的語音是在安靜的環境下錄制的,比如錄音棚里)進行一定的處理,讓其變得更接近真實場景中的語音,來增加訓練樣本的多樣性。基於神經網絡的深度學習技術,通常都需要使用大量的數據來訓練,語音識別也不例外。對一個語音識別系統而言,決定其識別准確率的關鍵因素,大致可以分為兩個方面:一是模型本身的好壞;二是訓練所使用的訓練數據。對於訓練數據而言,其與真實使用場景中的數據的匹配度越高,則語音識別的性能越好。實際應用中,語音識別的使用場景很復雜,環境噪聲、人的說話方式,如音量、語速等,都會一定程度上影響語音識別系統的准確率。訓練數據對這些復雜的情況覆蓋得越全面,則語音識別系統的效果越好。為了構建一個強大的語音識別系統,應該廣泛地搜集各種復雜的真實場景下的語音數據,來構建訓練集。然而在現實條件下,想要做到這一點卻很不容易,尤其對於中小廠商。因為不是每個廠商都有獲取真實場景語音數據的渠道和能力,即使成功獲得了真實場景的語音數據,數據標注也是一項極為費時費力費錢的工作。在訓練集數據有限的情況下,可以通過數據增強的方法來擴充訓練集數據,使訓練集數據更多樣性,來提高語音識別的准確率。我們用python開源庫(nlpaug.augmenter.audio)做了數據增強,用的數據增強方法主要有如下幾種:

1)Loudness:調整音頻的音量(增大或減小)

2)Speed:調整音頻的播放速度(加速或減速)

3)Pitch:調整音頻的音高

4)Noise:加入噪聲,主要有白噪聲、粉紅噪聲、環境噪聲等。

做好數據增強后語料庫就增大了好多倍。用增大后的語料庫去訓練得到新的模型,再用帶噪語音去測試模型識別率提高了好多。

 

3,模型訓練

模型訓練是個大話題,這里就簡述了,主要分幾塊:語料庫的數據預處理、模型選擇和迭代訓練及評估。這些都在python下實踐。找一個開源的語音識別開源框架,並根據自己的需求改造。我們是在框架中基於keras來訓練模型的。

1)       數據預處理

數據預處理主要包括語音的特征(feature)選取和提取以及標簽(label)處理。語音識別里常用的特征是MFCC和Fbank。我們剛開始用的特征是MFCC,后來隨着用的深入,發現Fbank的效果比MFCC好,就改成用Fbank了。特征提取就是把wav中的每幀PCM數據變成特征向量,作為神經網絡模型的輸入。標簽(label)就是標注wav文件對應的內容。語音識別神經網絡模型通常都是分類模型,且有不同的分類方法。可以以音素分類,分出來的音素類型有幾十或者上百個,標注時就是以音素為標簽(label),代碼中每個音素都有一個數字ID。如果用作喚醒詞識別(喚醒詞識別是關鍵詞識別的一個特例,只有一個關鍵詞),就是一個典型的二分類問題,是喚醒詞的標注為1,不是的標注為0。把這些label作為target也作為模型的輸入。訓練前要把語料分成訓練集/驗證集/測試集,通常比例是8:1:1。訓練集和驗證集用於訓練,測試集用於評估。

 

2)模型訓練和評估

模型訓練的第一步是選擇網絡架構。對於語音識別,目前主流的網絡架構有卷積神經網絡(CNN)和循環神經網絡(RNN/LSTM)等。我們根據項目的需求選擇CNN作為網絡架構(主要是因為CNN相對簡單且有很多KWS論文里的網絡模型可以參考)。網絡架構確定后訓練模型時最好先找一個相關論文里的成熟模型來借鑒,然后對其進行改進,最終通過訓練確定CNN層數、每層的Kernel個數、Kernel Size、Stride等。訓練過程就是用訓練集的數據作為輸入,經過網絡前向傳播計算出輸出,再同事先設定的標簽(label)進行loss計算(根據設定的損失函數計算),然后通過反向傳播來更新權重后,再迭代進行前向傳播、loss計算和反向傳播更新權重,直至loss值達到預期效果的過程。根據應用場景我們先后訓練出兩個網絡模型,多關鍵詞網絡模型和單關鍵詞(即喚醒詞)網絡模型。多關鍵詞網絡模型是音素分類模型,以CTC為損失函數,網絡模型輸出是每個音素的概率值,概率最大的那個音素作為輸出,后接CTC解碼,得到結果。喚醒詞網絡模型是二分類模型,以交叉熵為損失函數,網絡模型輸出是喚醒詞和非喚醒詞的概率值,再設定一個是喚醒詞概率的閾值,如果輸出的喚醒詞概率大於閾值,就認為是喚醒詞了,反之不是。

 

模型訓練好后要對其進行評估,看是否滿足要求。KWS模型一般都是分類模型,對於分類模型,曾寫過文章介紹過評價指標,具體見《深度學習分類問題中accuracy等評價指標的理解》。只有這些評價指標都符合要求了,模型訓練工作才算結束。否則要分析不達標的原因,找解決方法,再重新訓練,直到所有指標都達標。模型訓練就是一個不斷重復迭代的過程。

 

4,模型量化

訓練好的模型中的參數都是浮點數,在識別過程中模型推理(inference)時為了降低CPU load和節省memory,需要對模型做量化處理。至於具體怎么做,請參見曾寫過的文章《深度學習中神經網絡模型的量化》。

 

5,模型推理實現

KWS模型訓練是在python下完成的,但識別推理是在嵌入式系統上完成,因此要用其他語言把模型推理實現了。嵌入式系統上最常用的語言是C,我們就用C實現了模型推理。實現過程中參考了CMSIS的代碼。為了節省memory,我們對實現過程做了優化,具體見曾寫過的文章《嵌入式設備上卷積神經網絡推理時memory的優化》。

 

以上就是后端的主要工作。寫起來簡單,其實都是需要花不少時間的,尤其在模型訓練上。如果是第一次做,則需要花更多的時間,有一個摸索的過程。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM