淺談語音識別、匹配算法和模型
語音的基本概念
語音是一個復雜的現象。我們基本上不知道它是如何產生和被感知的。我們最基礎的認識就是語音是由單詞來構成的,然后每個單詞是由音素來構成的。但事 實與我們的理解大相徑庭。語音是一個動態過程,不存在很明顯的部分劃分。通過音頻編輯軟件去查看一個語音的錄音對于理解語音是一個比較有效的方法。下面就 是一個錄音在音頻編輯器里的顯示的例子。
目前關于語音的所有描述說明從某種程度上面講都是基于概率的(基于頻譜?)。這意味著在語音單元或者單詞之間并沒有確定的邊界。語音識別技術沒辦法 到達100%的準確率。這個概念對于軟件開發者來說有點不可思議,因為他們所研究的系統通常都是確定性的。另外,對于語音技術來說,它會產生很多和語言相 關的特定的問題。
語音的構成
在本文中,我們是按照以下方式去理解語音的構成的:
語音是一個連續的音頻流,它是由大部分的穩定態和部分動態改變的狀態混合構成。
一個單詞的發聲(波形)實際上取決于很多因素,而不僅僅是音素,例如音素上下文、說話者、語音風格等;
協同發音(指的是一個音受前后相鄰音的影響而發生變化,從發聲機理上看就是人的發聲器官在一個音轉向另一個音時其特性只能漸變,從而使得后一個音的 頻譜與其他條件下的頻譜產生差異。)的存在使得音素的感知與標準不一樣,所以我們需要根據上下文來辨別音素。將一個音素劃分為幾個亞音素單元。如:數字 “three”,音素的第一部分與在它之前的音素存在關聯,中間部分是穩定的部分,而最后一部分則與下一個音素存在關聯,這就是為什么在用HMM模型做語 音識別時,選擇音素的三狀態HMM模型。(上下文相關建模方法在建模時考慮了這一影響,從而使模型能更準確地描述語音,只考慮前一音的影響的稱為Bi- Phone,考慮前一音和后一音的影響的稱為 Tri-Phone。)
有時候,音素會被放在上下文中考慮,這樣就形成了三元音素或者多元音素。但它與亞音素不同,他們在波形中匹配時長度還是和單一音素一樣。只是名字上 的不同而已,所以我們更傾向于將這樣的多元音素稱為senone。一個senone的上下文依賴比單純的左右上下文復雜得多,它是一個可以被決策樹或者其 他方式來定義的復雜函數。(英語的上下文相關建模通常以音素為基元,由于有些音素對其后音素的影響是相似的,因而可以通過音素解碼狀態的聚類進行模型參數 的共享。聚類的結果稱為senone。決策樹用來實現高效的triphone對senone的對應,通過回答一系列前后音所屬類別(元/輔音、清/濁音等 等)的問題,最終確定其HMM狀態應使用哪個senone。分類回歸樹CART模型用以進行詞到音素的發音標注。)
音素phones構成亞單詞單元,也就是音節syllables。音節是一個比較穩定的實體,因為當語音變得比較快的時候,音素往往會發生改變,但是音節卻不變。音節與節奏語調的輪廓有關。有幾種方式去產生音節:基于形態學或者基于語音學。音節經常在詞匯語音識別中使用。
亞單詞單元(音節)構成單詞。單詞在語音識別中很重要,因為單詞約束了音素的組合。假如共有40個音素,然后每個單詞平均有7個音素,那么就會存在40^7個單詞,但幸運的是就算一個受過優等教育的人也很少使用過20k個單詞,這就使識別變得可行。
單詞和一些非語言學聲音構成了話語utterances,我們把非語言學聲音稱為fillers填充物,例如呼吸,um,uh,咳嗽等,它們在音頻中是以停頓做分離的。所以它們更多只是語義上面的概念,不算是一個句子。
語音識別過程
語音識別一般的方法是:錄制語音波形,再把波形通過靜音silences分割為多個utterances,然后去識別每個utterance所表達的意思。為了達到這個目的,我們需要用單詞的所有可能組合去匹配這段音頻,然后選擇匹配度最高的組合。
在匹配中有幾個關鍵的概念需要了解的:
特征:
由于描述一個語音,需要的參數個數非常多,這樣對處理速度的要求就很高(而且也沒必要處理那么多的信息,我們只需要處理對識別有幫助的就行),所以 我們需要做優化,進行降維。我們用幀frames去分割語音波形,每幀大概10ms,然后每幀提取可以代表該幀語音的39個數字,這39個數字也就是該幀 語音的特征,用特征向量來表示。而如何提取特征向量是當下熱門的研究課題,但這些提取方法都是由頻譜衍生出來的。
模型:
模型是用來描述一些數學對象的。這些數學對象描述了一些口語的共同屬性。在實際應用中,senone的音頻模型就是三態高斯混合模型。簡單的說,它 就是一個最有可能的特征向量。對于模型,有幾個問題需要考慮:模型到底多大程度上可以描述實際情況?在模型本身的局限情況下模型能表現得更優嗎?自適應模 型如何改變條件?
匹配算法:
語音識別需要對所有的特征向量和所有的模型做比較匹配,這是一個非常耗時的工作。而在這方面的優化往往是使用一些技巧,在每一點的匹配時,我們通過保留最好的匹配variants,然后通過它在下一幀產生最好的匹配variants。?
聲學模型acoustic model:
一個聲學模型包含每個senone的聲學屬性,其包括不依賴于上下文的屬性(每個音素phone最大可能的特征向量)和依賴于上下文的屬性(根據上下文構建的senone)。
語音學字典phonetic dictionary:
字典包含了從單詞words到音素phones之間的映射。
字典并不是描述單詞words到音素phones之間的映射的唯一方法。可以通過運用機器學習算法去學習得到一些復雜的函數去完成映射功能。
語言模型 language model:
語言模型是用來約束單詞搜索的。它定義了哪些詞能跟在上一個已經識別的詞的后面(匹配是一個順序的處理過程),這樣就可以為匹配過程排除一些不可能 的單詞。大部分的語言模型都是使用n-gram模型,它包含了單詞序列的統計。和有限狀態模型,它通過有限狀態機來定義語音序列。有時候會加入權值。為了 達到比較好的識別準確率,語言模型必須能夠很好的約束空間搜索,也就是說可以更好的預測下一個詞。語言模型是約束詞匯包含的單詞的,這就出現一個問題,就 是名字識別(因為名字可以隨便由幾個單詞組成)。為了處理這種情況,語言模型可以包含更小的塊,例如亞單詞,甚至音素。但是這種情況,識別準確率將會低于 基于單詞的語言模型。
特征、模型和搜索算法三部分構成了一個語音識別系統。如果你需要識別不同的語言,那么就需要修改這三個部分。很多語言,都已經存在聲學模型,字典,甚至大詞匯量語言模型可供下載了。
其他用到的概念
網格Lattice是一個代表識別的不同結果的有向圖。一般來說,很難去獲得一個最好的語音匹配結果。所以Lattices就是一個比較好的格式去存放語音識別的中間結果。
N-best lists和lattices有點像,但是它沒有lattices那么密集(也就是保留的結果沒有lattices多)。(N-best搜索和多遍搜索: 為在搜索中利用各種知識源,通常要進行多遍搜索,第一遍使用代價低的知識源(如聲學模型、語言模型和音標詞典),產生一個候選列表或詞候選網格,在此基礎 上進行使用代價高的知識源(如4階或5階的N-Gram、4階或更高的上下文相關模型)的第二遍搜索得到最佳路徑。)
單詞混淆網絡是從lattice的邊緣得到的一個嚴格的節點順序序列。
語音數據庫-一個從任務數據庫得到的典型的錄音集。如果我們開發的是一個對話的系統,那么數據庫就是包含了多個用戶的對話錄音。而對于聽寫系統,包含的就是朗讀的錄音。語音數據庫是來用訓練,調整和測試解碼系統的(也就是語音識別系統)。
文本數據庫-為了訓練語言模型而收集的文本。一般是以樣本文本的方式來收集形成的。而收集過程存在一個問題就是誤把PDFs, web pages, scans等現成文檔也當成口語文本的形式放進數據庫中。所以,我們就需要把這些文件帶進數據庫里面的標簽和文件頭去掉,還有把數字展開為它們的語音形式 (例如1展開為英文的one或者漢語的yi),另外還需要把縮寫給擴大還原為完整單詞。
語音的優化
隨著語音識別技術的發展,最復雜的難題是如何使搜索(也就是語音解碼,可以認為是需要匹配盡可能多的語音變體)更加準確和快速。還有在模型并不完美的前提下如何匹配語音和模型。
一般來說系統需要通過一個測試數據庫來驗證準確性,也就是是否達到了我們的預定目標。
我們通過以下幾個參數來表征系統的性能:
單詞錯誤率:我們有一個N個單詞長度的原始文本和識別出來的文本。(對單詞串進行識別難免有詞的插入,替換和刪除的誤識)I代表被插入的單詞個數,D代表被刪除的單詞個數,S代表被替換的單詞個數,那么單詞錯誤率就定義為:WER = (I + D + S) / N
單詞錯誤率一般通過百分百來表示。
準確度。它和單詞錯誤率大部分是相似的,但是它不計算插入單詞的個數,它定義為:Accuracy = (N – D – S) / N
對于大部分任務來說,準確度事實上是一個比較差的度量方法,因為插入的情況對于識別結果的影響也是很重要的。但對于一些任務而言,準確度也是一個合理的評價解碼器性能的參數。
速度:假設音頻文件是2個小時,而解碼花費了6個小時,那么計算出來的速度就是3xRT。(3倍速)
ROC曲線:對于一個檢測任務,檢測會出現誤報和命中兩種情況。ROC曲線就是用來評價檢測性能的。ROC曲線就是描述誤報和命中的數目比例的。而且可以通過ROC曲線取尋找一個最優點,在這個點誤報最小,而命中最大,也就是接近100%的命中率。
還有其他的方法來衡量識別性能,雖然這里沒有提及,但對于很多的實際應用來說還是比較重要的。你的第一個工作應該是建立這樣一個評價體系,然后系統地應用到開發過程中。第二個工作就是收集一個測試數據庫來測試你的系統性能。