KWS語音識別技術-簡介


博文參考:https://blog.csdn.net/mao_hui_fei/article/details/85129137 和 https://www.cnblogs.com/talkaudiodev/p/10635656.html 和 https://blog.csdn.net/weixin_30876945/article/details/97322378 和 https://blog.csdn.net/baienguon/article/details/80539296

1,語音認別技術發展過程

  語音識別技術是指機器自動將人的語音的內容轉成文字,又稱 Automatic Speech Recognition,即ASR技術。語音識別是一門交叉的、非常復雜的學科,需要具備生理學、聲學、信號處理、計算機科學、模式識別、語言學、心理學等相關學科的知識。

  語音識別的研究是個漫長而且艱難的過程,它的發展可以追溯到20世紀50年代,1952年貝爾實驗室首次實現Audrey英文數字識別系統,這個系統當時可以識別單個數字0~9的發音,並且對熟人的准確度高達90%以上。在同時期,MIT、普林斯頓相繼推出少量詞的獨立詞識別系統。

  1971年美國國防部研究所(DARPA)贊助了五年期限的語音理解研究項目,推動了語音識別的一次大發展。DARPA在整個科技的發展過程中扮演了非常重要的角色,它專門給高科技研究項目提供資金支持,包括無人機、衛星等等。在DARPA的支持下,IBM、卡內基梅隆大學(CMU)、斯坦福等學術界和工業界非常頂級的研究機構也都加入到語音識別的研究中去。其中,卡耐基梅隆大學研發出harpy語音識別系統,該系統能夠識別1011個單詞,在這個時期大詞匯量的孤立詞識別取得實質性進展。

 

  到了1980年,語音識別技術已經從從孤立詞識別發展到連續詞識別,當時出現了兩項非常重要的技術:隱馬爾科夫模型( HMM )、N-gram語言模型。1990年,大詞匯量連續詞識別持續進步,提出了區分性的模型訓練方法MCE和MMI,使得語音識別的精確度日益提高,尤其適用於長句子的情況下,與此同時,還提出了模型自適應方法MAP和MLLR。在工業方面,劍橋推出首個開源的語音識別訓練工具HTK,在商業方面,Nuance發布了首個消費級產品Dragon Dictate。

  到了21世紀,隨着深度學習的不斷發展,神經網絡之父Hinton提出深度置信網絡( DBN ),2009年, Hinton和學生Mohamed將深度神經網絡應用於語音識別,在小詞匯量連續語音識別任務TIMIT上獲得成功。

2,傳統語音認別方法介紹

  語音識別傳統方法主要分兩個階段:訓練和識別,訓練階段主要是生成聲學模型和語言模型給識別階段用。傳統方法主要有五大模塊組成,分別是特征提取(得到每幀的特征向量),聲學模型(用GMM從幀的特征向量得到狀態,再用HMM從狀態得到音素)、發音字典(從音素得到單詞)、語言模型(從單詞得到句子)、搜索解碼(根據聲學模型、發音字典和語言模型得到最佳文本輸出),即從幀得到特征向量(VAD(voice activity detect)降噪和分幀,特征提取干的話),從特征向量得到狀態(GMM干的話),從狀態得到音素(HMM干的話),從音素得到單詞(發音字典干的活),從單詞得到句子(語言模型干的活)。傳統方法除了在特征提取上用到信號處理知識,其余全都是概率統計等知識。

  

 

 

 

  

  

  

 

  

   

  

  

  

  

  

 

 

  

   

 

  

  

3,語音認別---VAD語音活動性處理介紹

   完整的amr編碼器還包括語音激活檢測(VAD)和丟幀、錯幀的消除。VAD的作用是檢測當前輸入信號中是否有語音,它的輸入是輸入信號本身和AMR編碼器計算出來的參數集,VAD用這個信息來決定每20ms語音幀中是否包括語音。在VAD沒有檢測到語音的情況下,AMR采用8種速率之外的低速率噪聲編碼模式,以節省移動台的功率,降低整個網絡的干擾和負載。此外,當語音幀由於傳輸錯誤而丟失時,為了使接聽者感覺不到丟幀,應完成丟幀和錯幀的消除,並用預測的參數集進行語音合成。

  在語音增強中,我們希望從帶噪語音信號中剔除噪音,得到純凈的語音信號,第一步就是提取噪音信息。通常的思路是通過VAD函數得到非語音片段,而非語音片段可以認為是純噪音片段。從而可以從純噪音信號中提取出有用信息,例如進行傅里葉變換得到噪音頻譜等,再進而做下一步處理。例如譜減法,維納濾波。此處不作討論。

  VAD有很多種方法,此處介紹一種最簡單直接的辦法。 通過short timeenergy (STE)和zero cross counter (ZCC) 來測定。(實際上精確度高的VAD會提取4種或更多的特征進行判斷,這里只介紹兩種特征的基本方法)。

l  STE: 短時能量,即一幀語音信號的能量

l  ZCC: 過零率,即一幀語音時域信號穿過0(時間軸)的次數。

  理論基礎是在信噪比(SNR)不是很低的情況下,語音片段的STE相對較大,而ZCC相對較小;而非語音片段的STE相對較小,但是ZCC相對較大。因為語音信號能量絕大部分包含在低頻帶內,而噪音信號通常能量較小且含有較高頻段的信息。故而可以通過測量語音信號的這兩個特征並且與兩個門限(閾值)進行對比,從而判斷語音信號與非語音信號。

  通常對語音信號分幀時取一幀20ms (因為一般會進行短時傅里葉變換,時域和頻域的分辨率需要一個平衡,20ms為平衡點,此處不用考慮)。此處輸入信號采樣率為8000HZ。因此每一幀長度為160 samples.STE的計算方法是 , 即幀內信號的平方和。

  在本文中ZCC的計算方法是,將幀內所有sample平移1,再對應點做乘積,符號為負的則說明此處過零,只需將幀內所有負數乘積數目求出則得到該幀的過零率。

  VAD(Voice Activity Detection)基於能量的特征常用硬件實現,譜(頻譜和倒譜)在低信噪比(SNR)可以獲得較好的效果。當SNR到達0dB時,基於語音諧波和長時語音特征更具有魯棒性。 

  當前的判決准則可以分為三類:基於門限,統計模型和機器學習。

  基於能量的准則是檢測信號的強度,並且假設語音能量大於背景噪聲能量,這樣當能量大於某一門限時,可以認為有語音存在。然而當噪聲大到和語音一樣時,能量這個特征無法區分語音還是純噪聲。 
  早先基於能量的方法,將寬帶語音分成各個子帶,在子帶上求能量;因為語音在2KHz以下頻帶包含大量的能量,而噪聲在2~4KHz或者4KHz以上頻帶比0~2HKz頻帶傾向有更高的能量。這其實就是頻譜平坦度的概念,webrtc中已經用到了。在信噪比低於10dB時,語音和噪聲的區分能力會加速下降。

 

    可以將一段語音片段分為 靜音段、過度段、語音段、結束。

  比較常用的VAD技術是基於短時能量和過零率的雙門限端點檢測。

1. 分別對短時能量和過零率設置兩個門限值energy_low, energy_high和zcr_low, zcr_high

energy_high > energy_low

zcr_high > zcr_low

2. 計算一幀的短時能量enegry和過零率zcr

若enegry > energy_low && zcr > zcr_low,則進入過度段

3. 計算一幀的短時能量和過零率,

若enegry > energy_high && zcr > zcr_high, 此時還不能斷定語音開始,

繼續計算幾幀短時能量和過零率,若enegry > energy_high && zcr > zcr_high,則可判定語音開始。

 能量雙門限VAD流程圖:

 

基於短時能量和短時平均過零率的端點檢測介紹:

 

 

 

 

 

                                             數字“4”的短時能量與平均過零率

   音頻端點檢測就是從連續的語音流中檢測出有效的語音段。它包括兩個方面,檢測出有效語音的起始點即前端點,檢測出有效語音的結束點即后端點。可以降低存儲或傳輸的數據量,在有些應用場景中,使用端點檢測可以簡化人機交互,比如在錄音的場景中,語音后端點檢測可以省略結束錄音的操作。

語音信號是一個以時間為自變量的一維連續函數,計算機處理的語音數據是語音信號按時間排序的采樣值序列,這些采樣值的大小同樣表示了語音信號在采樣點處的能量。

  采樣點的能量值通常使用采樣值的平方,一段包含N個采樣點的語音的能量值可以定義為其中各采樣值的平方和。這樣,一段語音的能量值既與其中的采樣值大小有關,又與其中包含的采樣點數量有關。為了考察語音能量值的變化,需要先將語音信號按照固定時長比如20毫秒進行分割,每個分割單元稱為幀,每幀中包含數量相同的采樣點,然后計算每幀語音的能量值。如果音頻前面部分連續M0幀的能量值低於一個事先指定的能量值閾值E0,接下來的連續M0幀能量值大於E0,則在語音能量值增大的地方就是語音的前端點。同樣的,如果連續的若干幀語音能量值較大,隨后的幀能量值變小,並且持續一定的時長,可以認為在能量值減小的地方即是語音的后端點。現在的問題是,能量值閾值E0怎么取?M0又是多少?理想的靜音能量值為0,故上面算法中的E0理想狀態下取0。不幸的是,采集音頻的場景中往往有一定強度的背景音,這種單純的背景音當然算靜音,但其能量值顯然不為0,因此,實際采集到的音頻其背景音通常有一定的基礎能量值。

  我們總是假設采集到的音頻在起始處有一小段靜音,長度一般為幾百毫秒,這一小段靜音是我們估計閾值E0的基礎。對,總是假設音頻起始處的一小段語音是靜音,這一點假設非常重要!!!!在隨后的降噪介紹中也要用到這一假設。在估計E0時,選取一定數量的幀比如前100幀語音數據(這些是“靜音”),計算其平均能量值,然后加上一個經驗值或乘以一個大於1的系數,由此得到E0。這個E0就是我們判斷一幀語音是否是靜音的基准,大於這個值就是有效語音,小於這個值就是靜音。

至於M0,比較容易理解,其大小決定了端點檢測的靈敏度,M0越小,端點檢測的靈敏度越高,反之越低。語音應用的場景不同,端點檢測的靈敏度也應該被設置為不同的值。例如,在聲控遙控器的應用中,由於語音指令一般都是簡單的控制指令,中間出現逗號或句號等較長停頓的可能性很小,所以提高端點檢測的靈敏度是合理的,M0設置為較小值,對應的音頻時長一般為200-400毫秒左右。在大段的語音聽寫應用中,由於中間會出現逗號或句號等較長時間的停頓,宜將端點檢測的靈敏度降低,此時M0值設置為較大值,對應的音頻時長一般為1500-3000毫秒。所以M0的值,也就是端點檢測的靈敏度,在實際中應該做成可調整的,它的取值要根據語音應用的場景來選擇。以上只是語音端點檢測的很簡單的一般原理,實際應用中的算法遠比上面講的要復雜。

   要對聲音進行分析,需要對聲音分幀,也就是把聲音切開成一小段一小段,每小段稱為一幀。分幀操作一般不是簡單的切開,而是使用移動窗函數來實現,這里不詳述。幀與幀之間一般是有交疊的,就像下圖這樣:

 

  圖中,每幀的長度為25毫秒,每兩幀之間有25-10=15毫秒的交疊。我們稱為以幀長25ms、幀移10ms分幀。

   在用VAD算法確定靜音和語音數據的開始和起止點之前,需要對語音數據進行處理,然后再計算語音數據的開始和起止點,這個過程稱為數據的預處理,有些VAD算法是基於短時能量和過零率實現的,並不進行預處理操作,但實驗表明,對數據進行預處理之后的效果要比不進行預處理的效果好。可以對數據進行去除直流和加窗兩個預處理。采樣頻率的設置:我們人耳一般可以聽到的頻率最高就是16000HZ。根據采樣定理,一般采樣頻率要是這個的兩倍才不會發生混疊。所以我們在通話的時候采樣頻率一般是8Khz,帶寬就需要16Khz。這樣就基本可以使得通話的體驗非常到位,還原度非常高!不是說采樣頻率越高聲音的效果就越好,這是一個此消彼長的情況。這一次我們采樣就用16Khz,這樣其實已經可以把基本的聲音采下來。因為人耳對於低頻還是更加敏感!現在的高保真就是44.1Khz的采樣率。  

4,語音認別---喚醒技術KWS介紹

   由於目前終端(如手機)上的CPU還不足夠強勁,不能讓語音識別的各種算法跑在終端上,尤其現在語音識別都是基於深度學習來做了,更加不能跑在終端上,所以目前主流的語音識別方案是聲音采集和前處理在終端上做,語音識別算法則放在服務器(即雲端)上跑。雖然這種方案有泄漏隱私(把終端上的語音數據發給服務器)和沒有網絡不能使用等缺點,但也是不得已而為之的,相信在不久的將來等終端上的CPU足夠強勁了會把語音識別的所有實現都放在終端上的。

  是不是意味着終端上做不了語音識別相關的算法了?其實也不是,語音喚醒功能是需要在終端上實現的。語音喚醒是指設定一個喚醒詞,如Siri的“Hi Siri”,只有用戶說了喚醒詞后終端上的語音識別功能才會處於工作狀態,否則處於休眠狀態。這樣做主要是為了降功耗,增加續航時間。目前很多終端都是靠電池供電的,對功耗很敏感,是不允許讓語音識別功能一直處於工作狀態的。

 

  

  

  

  

  

 

 

 

  

Google 基於CNN實現的算法,屬於Deep KWS方案

評判標准:FRR (False Reject Rate), "漏警率", CNN的FRR比DNN的FRR提升了27%~44%.

限制了乘法的運算量,限制了參數的數量

很早以前大家使用HMM,后來2014年,Google使用了DNN的方案SMALL-FOOTPRINT KEYWORD SPOTTING USING DEEP NEURAL NETWORKS - 2014 IEEE,然后2014年有人使用CNN進行語音識別Deep Convolutional Neural Networks for large-scale speech tasks, 但是這種CNN架構對計算量要求比較大,而KWS方案對計算量要求有一定的限制,所以本論文中他們提出了優化了版本的CNN方案。

Baidu基於CRNN實現的算法KWS方案

又一個Deep KWS方案

CRNN (Convolutional Recurrent Neural Networks): CNN+RNN,

流程:PCEN -> CNN -> BRNN -> DNN -> SoftMax

RNN對信噪比大的場景很有幫助

Apple基於DNN實現的算法KWS方案

沒找到Apple發的相關論文,只找到兩篇Apple官方提供的文檔,Apple對音頻的識別是基於DNN模型實現的,但是他有2個DNN模型,首先會用一個計算量較小的模型進行預檢,然后再用更加精確的Large DNN進行計算,語音識別后,在通過HMM Scorer計算得分,如果分數滿足閾值要求,會觸發Siri。但是如果不滿足要求,系統也會進入幾秒的敏感期,這個敏感期內,如果用戶再次重復這個主題,那么會快速識別,這樣降低了漏報率。
手表中使用的DNN模型只有一個,是介於Small DNN和Large DNN之間的模型。

  


免責聲明!

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



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