非算法,只能從業(yè)務流和原理上作解釋
語音識別原理
回顧人類發(fā)展史,不難看出,隨著人的不斷進化,從最初通過手掌、肢體使用簡單工具、傳遞簡單信息,發(fā)展到控制發(fā)聲并通過耳朵接收,形成了一個以語音為載體的快速信息傳遞通道和收發(fā)閉環(huán),成為人類間最自然、最重要的信息交互手段。聲波作為一種音頻信號,和視頻信號、無線電信號一樣是,非接觸方式的傳播,也是人類唯一可以不借助工具就可自由掌控的一種天然“無線”資源。要讓機器能夠聽見,首先要做的事情是我們需要將聲波輸入到計算機中。
信號處理,聲學特征提取
我們都知道聲音信號是連續(xù)的模擬信號,要讓計算機處理首先要轉(zhuǎn)換成離散的數(shù)字信號,進行采樣處理。正常人聽覺的頻率范圍大約在20Hz~20KHz之間,為了保證音頻不失真影響識別,同時數(shù)據(jù)又不會太大,通常的采樣率為16KHz。
語音采樣
在數(shù)字化的過程中,我們首先要判斷端頭,確定語音的開始和結(jié)束,然后要進行降噪和過濾處理(除了人聲之外,存在很多的噪音),保證讓計算機識別的是過濾后的語音信息。獲得了離散的數(shù)字信號之后,為了進一步的處理我們還需要對音頻信號 分幀。因為離散的信號單獨計算數(shù)據(jù)量太大了,按點去處理容易出現(xiàn)毛刺,同時從微觀上來看一段時間內(nèi)人的語音信號一般是比較平穩(wěn)的,稱為 短時平穩(wěn)性,所以會需要將語音信號分幀,便于處理。
我們的每一個發(fā)音,稱為一個 音素,是語音中的最小單位,比如普通話發(fā)音中的元音,輔音。不同的發(fā)音變化是由于人口腔肌肉的變化導致的,這種口腔肌肉運動相對于語音頻率來說是非常緩慢的,所以我們?yōu)榱吮WC信號的短時平穩(wěn)性,分幀的長度應當小于一個音素的長度,當然也不能太小否則分幀沒有意義。
通常一幀為20~50毫秒,同時幀與幀之間有交疊冗余,避免一幀的信號在兩個端頭被削弱了影響識別精度。常見的比如 幀長為25毫秒,兩幀之間交疊15毫秒,也就是說每隔25-15=10毫秒取一幀,幀移為10毫秒,分幀完成之后,信號處理部分算是完結(jié)了。
隨后進行的就是整個過程中極為關(guān)鍵的特征提取。將原始波形進行識別并不能取得很好的識別效果,而需要進行頻域變換后提取的特征參數(shù)用于識別。常見的一種變換方法是提取MFCC特征,根據(jù)人耳的生理特性,把每一幀波形變成一個多維向量,可以簡單地理解為這個向量包含了這幀語音的內(nèi)容信息。
實際應用中,這一步有很多細節(jié),聲學特征也不止有MFCC這一種,具體這里不講,但是各種特征提取方法的核心目的都是統(tǒng)一的:盡量描述語音的根本特征,盡量對數(shù)據(jù)進行壓縮。
比如下圖示例中,每一幀f1,f2,f3…轉(zhuǎn)換為了14維的特征向量,然后整個語音轉(zhuǎn)換為了14*N(N為幀數(shù))的向量矩陣。
分幀示意圖
一幀一幀的向量如果不太直觀,還可以用下圖的頻譜圖表示語音,每一列從左到右都是一個25毫秒的塊,相比于原始聲波,從這種數(shù)據(jù)中尋找規(guī)律要容易得多。
發(fā)音Robert的頻譜圖
不過頻譜圖主要用作語音研究,語音識別還是需要用一幀一幀的特征向量。
識別字符,組成文本
特征提取完成之后,就進入了特征識別,字符生成環(huán)節(jié)。這部分的核心工作就是從 每一幀當中找出當前說的音素,再由多個音素組成單詞,再由單詞組成文本句子。 其中最難的當然是從每一幀中找出當前說的音素,因為我們每一幀是小于一個音素的,多個幀才能構(gòu)成一個音素,如果最開始就錯了則后續(xù)很難糾正。
怎么判斷每一個幀屬于哪個音素了?最容易實現(xiàn)的辦法就是概率,看哪個音素的概率最大,則這個幀就屬于哪個音素。那如果每一幀有多個音素的概率相同怎么辦,畢竟這是可能的,每個人口音、語速、語氣都不同,人也很難聽清楚你說的到底是Hello還是Hallo。而我們語音識別的文本結(jié)果只有一個,不可能還讓人參與選擇進行糾正。
這時候多個音素組成單詞的統(tǒng)計決策,單詞組成文本的統(tǒng)計決策就發(fā)揮了作用,它們也是同樣的基于概率:音素概率相同的情況下,再比較組成單詞的概率,單詞組成之后再比較句子的概率。
比如以上那個詞很有可能是「HHHEE_LL_LLLOOO」。但它同時認為我說的也可能是「HHHUU_LL_LLLOOO」,或者甚至是「AAAUU_LL_LLLOOO」。我們可以遵循一些步驟來整理這個輸出。首先,我們將用單個字符替換任何重復的字符:
· HHHEE_LL_LLLOOO 變?yōu)?HE_L_LO· HHHUU_LL_LLLOOO 變?yōu)?HU_L_LO· AAAUU_LL_LLLOOO 變?yōu)?AU_L_LO
然后,我們將刪除所有空白:
· HE_L_LO 變?yōu)?HELLO· HU_L_LO 變?yōu)?HULLO· AU_L_LO 變?yōu)?AULLO
這讓我們得到三種可能的轉(zhuǎn)寫——「Hello」、「Hullo」和「Aullo」,最終根據(jù)單詞概率我們會發(fā)現(xiàn)Hello是最可能的,所以輸出Hello的文本。上面的例子很明確的描述怎么從幀到音素,再從音素到單詞,概率決定一切,那這些概率是怎么獲得的了?難道為了識別一種語言我們把人類幾千上百年說過的所有音素,單詞,句子都統(tǒng)計出來,然后再計算概率?傻子都知道這是不可能的,那怎么辦,這時我們就需要模型:
聲學模型
發(fā)聲的基本音素狀態(tài)和概率,盡量獲得不同人、不同年紀、性別、口音、語速的發(fā)聲語料,同時盡量采集多種場景安靜的,嘈雜的,遠距離的發(fā)聲語料生成聲學模型。為了達到更好的效果,針對不同的語言,不同的方言會用不同的聲學模型,在提高精度的同時降低計算量。
語言模型
單詞和語句的概率,使用大量的文本訓練出來。如果模型中只有兩句話“今天星期一”和“明天星期二”,那我們就只能識別出這兩句,而我們想要識別更多,只需要涵蓋足夠的語料就行,不過隨之而來的就是模型增大,計算量增大。所以我們實際應用中的模型通常是限定應用域的,同比如智能家居的,導航的,智能音箱的,個人助理的,醫(yī)療的等等,降低計算量的同時還能提高精度,
詞匯模型
針對語言模型的補充,語言詞典和不同的發(fā)音標注。比如定期更新的地名,人名,歌曲名稱,熱詞,某些領(lǐng)域的特殊詞匯等等。
語言模型和聲學模型可以說是語音識別中最重要的兩個部分,語音識別中一個很重要的工作就是訓練模型,有不識別的句子我們就加進去重新訓練。不過我們在訓練和計算概率時會發(fā)現(xiàn)一個問題,假設(shè)某條句子S出現(xiàn)的概率為P(S),其中單詞序列為W1,W2,W3 …, Wn
P(S) = P(W1,W2,W3 …, Wn) 展開為每個詞出現(xiàn)的條件概率相乘= P(W1)·P(W2|W1)·P(W3|W1,W2)···P(Wn|W1,W2,W3 …, Wn-1)
從計算上看第一個詞的條件概率P(W1)很好計算,第二個詞P(W2|W1)在已知第一個詞的情況下,還不太麻煩,第三個詞開始變得很難了,因為涉及到三個變量W1,W2,W3,每一個詞都可能是一種語言字典的大小,到了Wn基本無法估計了,計算量太大了。
這時我們有很多簡化但是有效的方法進行計算,比如說HMM隱馬爾科夫模型Hidden Markov Model。
隱馬爾科夫模型基于了兩個最大的假設(shè):一是內(nèi)部狀態(tài)的轉(zhuǎn)移只與上一狀態(tài)有關(guān),另一是輸出值只與當前狀態(tài)(或當前的狀態(tài)轉(zhuǎn)移)有關(guān)。就把問題簡化了,
也就是說一個句子中某個單詞序列出現(xiàn)的概率只和前面的一個單詞有關(guān),這樣計算量就被大大簡化了。
P(S) = P(W1)·P(W2|W1)·P(W3|W2)···P(Wn|Wn-1)
如上圖示例,基于隱馬爾科夫算法生成語言模型。我們只要按照實際要求構(gòu)造出對應的模型,模型中涵蓋足夠的語料,就能解決各種語音識別問題。
語音識別過程其實就是在模型的狀態(tài)網(wǎng)絡(luò)中搜索一條最佳路徑,語音對應這條路徑的概率最大,這稱之為“解碼”。路徑搜索的算法是一種動態(tài)規(guī)劃剪枝的算法,稱之為Viterbi算法,用于尋找全局最優(yōu)路徑。
如此一來整個語音識別的流程就很清晰了,再來回顧以下整個步驟:
信號處理:模數(shù)轉(zhuǎn)換,識別端頭,降噪等等。信號表征:信號分幀,特征提取,向量化等等。模式識別:尋找最優(yōu)概率路徑,聲學模型識別音素,詞匯模型和語言模型識別單詞和句子。ASR語音識別模型
最后將語音識別成文本。
JimmyChen:語音交互(一)—— 語音識別JimmyChen:智能語音專題(三):泛語音識別