語音識別的基礎知識與CMUsphinx介紹

語音識別的基礎知識與CMUsphinx介紹

[email protected]

http://blog.csdn.net/zouxy09

 

       語音識別技術就是讓機器通過識別和理解過程把語音信號轉變爲相應的文本或命令的技術。

       基於語音識別芯片的嵌入式產品也越來越多,如Sensory公司的RSC系列語音識別芯片、Infineon公司的UnispeechUnilite語音芯片等,這些芯片在嵌入式硬件開發中得到了廣泛的應用。在軟件上,目前比較成功的語音識別軟件有:NuanceIBMViavoiceMicrosoftSAPI以及開源軟件HTK,這些軟件都是面向非特定人、大詞彙量的連續語音識別系統。

        語音識別本質上是一種模式識別的過程,未知語音的模式與已知語音的參考模式逐一進行比較,最佳匹配的參考模式被作爲識別結果。

        語音識別的目的就是讓機器賦予人的聽覺特性,聽懂人說什麼,並作出相應的動作。目前大多數語音識別技術是基於統計模式的,從語音產生機理來看,語音識別可以分爲語音層和語言層兩部分。

        當今語音識別技術的主流算法,主要有基於動態時間規整(DTW)算法、基於非參數模型的矢量量化(VQ)方法、基於參數模型的隱馬爾可夫模型(HMM)的方法、基於人工神經網絡(ANN)和支持向量機等語音識別方法。

 

語音識別分類:

根據對說話人的依賴程度,分爲:

1)特定人語音識別(SD):只能辨認特定使用者的語音,訓練→使用。

2)非特定人語音識別(SI):可辨認任何人的語音,無須訓練。

根據對說話方式的要求,分爲:

1)孤立詞識別:每次只能識別單個詞彙。

2)連續語音識別:用者以正常語速說話,即可識別其中的語句。

 

        語音識別系統的模型通常由聲學模型和語言模型兩部分組成,分別對應於語音到音節概率的計算和音節到字概率的計算。

 

         Sphinx是由美國卡內基梅隆大學開發的大詞彙量、非特定人、連續英語語音識別系統。一個連續語音識別系統大致可分爲四個部分:特徵提取,聲學模型訓練,語言模型訓練和解碼器。

1)預處理模塊:

       對輸入的原始語音信號進行處理,濾除掉其中的不重要的信息以及背景噪聲,並進行語音信號的端點檢測(找出語音信號的始末)、語音分幀(近似認爲在10-30ms內是語音信號是短時平穩的,將語音信號分割爲一段一段進行分析)以及預加重(提升高頻部分)等處理。

2)特徵提取:

        去除語音信號中對於語音識別無用的冗餘信息,保留能夠反映語音本質特徵的信息,並用一定的形式表示出來。也就是提取出反映語音信號特徵的關鍵特徵參數形成特徵矢量序列,以便用於後續處理。

        目前的較常用的提取特徵的方法還是比較多的,不過這些提取方法都是由頻譜衍生出來的。Mel頻率倒譜系數(MFCC)參數因其良好的抗噪性和魯棒性而應用廣泛。在sphinx中也是用MFCC特徵的。MFCC的計算首先用FFT將時域信號轉化成頻域,之後對其對數能量譜用依照Mel刻度分佈的三角濾波器組進行卷積,最後對各個濾波器的輸出構成的向量進行離散餘弦變換DCT,取前N個係數。

       在sphinx中,用幀frames去分割語音波形,每幀大概10ms,然後每幀提取可以代表該幀語音的39個數字,這39個數字也就是該幀語音的MFCC特徵,用特徵向量來表示。

3)聲學模型訓練:

      根據訓練語音庫的特徵參數訓練出聲學模型參數。在識別時可以將待識別的語音的特徵參數同聲學模型進行匹配,得到識別結果。

      目前的主流語音識別系統多采用隱馬爾可夫模型HMM進行聲學模型建模。聲學模型的建模單元,可以是音素,音節,詞等各個層次。對於小詞彙量的語音識別系統,可以直接採用音節進行建模。而對於詞彙量偏大的識別系統,一般選取音素,即聲母,韻母進行建模。識別規模越大,識別單元選取的越小。(關於HMM,網上有很多經典的解說,例如《HMM學習最佳範例》和《隱馬爾科夫模型(hmm)簡介》等,不瞭解的可以去看看)

         HMM是對語音信號的時間序列結構建立統計模型,將其看作一個數學上的雙重隨機過程:一個是用具有有限狀態數的Markov鏈來模擬語音信號統計特性變化的隱含(馬爾可夫模型的內部狀態外界不可見)的隨機過程,另一個是與Markov鏈的每一個狀態相關聯的外界可見的觀測序列(通常就是從各個幀計算而得的聲學特徵)的隨機過程。

        人的言語過程實際上就是一個雙重隨機過程,語音信號本身是一個可觀測的時變序列,是由大腦根據語法知識和言語需要(不可觀測的狀態)發出的音素的參數流(發出的聲音)。HMM合理地模仿了這一過程,是較爲理想的一種語音模型。用HMM刻畫語音信號需作出兩個假設,一是內部狀態的轉移只與上一狀態有關,另一是輸出值只與當前狀態(或當前的狀態轉移)有關,這兩個假設大大降低了模型的複雜度。

       語音識別中使用HMM通常是用從左向右單向、帶自環、帶跨越的拓撲結構來對識別基元建模,一個音素就是一個三至五狀態的HMM,一個詞就是構成詞的多個音素的HMM串行起來構成的HMM,而連續語音識別的整個模型就是詞和靜音組合起來的HMM

4)語言模型訓練:

       語言模型是用來計算一個句子出現概率的概率模型。它主要用於決定哪個詞序列的可能性更大,或者在出現了幾個詞的情況下預測下一個即將出現的詞語的內容。換一個說法說,語言模型是用來約束單詞搜索的。它定義了哪些詞能跟在上一個已經識別的詞的後面(匹配是一個順序的處理過程),這樣就可以爲匹配過程排除一些不可能的單詞。

       語言建模能夠有效的結合漢語語法和語義的知識,描述詞之間的內在關係,從而提高識別率,減少搜索範圍。語言模型分爲三個層次:字典知識,語法知識,句法知識

         對訓練文本數據庫進行語法、語義分析,經過基於統計模型訓練得到語言模型。語言建模方法主要有基於規則模型和基於統計模型兩種方法。統計語言模型是用概率統計的方法來揭示語言單位內在的統計規律,其中N-Gram模型簡單有效,被廣泛使用。它包含了單詞序列的統計。

          N-Gram模型基於這樣一種假設,第n個詞的出現只與前面N-1個詞相關,而與其它任何詞都不相關,整句的概率就是各個詞出現概率的乘積。這些概率可以通過直接從語料中統計N個詞同時出現的次數得到。常用的是二元的Bi-Gram和三元的Tri-Gram

         Sphinx中是採用二元語法和三元語法的統計語言概率模型,也就是通過前一個或兩個單詞來判定當前單詞出現的概率P(w2| w1)P(w3| w2, w1)

5)語音解碼和搜索算法:

       解碼器:即指語音技術中的識別過程。針對輸入的語音信號,根據己經訓練好的HMM聲學模型、語言模型及字典建立一個識別網絡,根據搜索算法在該網絡中尋找最佳的一條路徑,這個路徑就是能夠以最大概率輸出該語音信號的詞串,這樣就確定這個語音樣本所包含的文字了。所以解碼操作即指搜索算法:是指在解碼端通過搜索技術尋找最優詞串的方法。

        連續語音識別中的搜索,就是尋找一個詞模型序列以描述輸入語音信號,從而得到詞解碼序列。搜索所依據的是對公式中的聲學模型打分和語言模型打分。在實際使用中,往往要依據經驗給語言模型加上一個高權重,並設置一個長詞懲罰分數。當今的主流解碼技術都是基於Viterbi搜索算法的,Sphinx也是。

       基於動態規劃的Viterbi算法在每個時間點上的各個狀態,計算解碼狀態序列對觀察序列的後驗概率,保留概率最大的路徑,並在每個節點記錄下相應的狀態信息以便最後反向獲取詞解碼序列。Viterbi算法本質上是一種動態規劃算法,該算法遍歷HMM狀態網絡並保留每一幀語音在某個狀態的最優路徑得分。

        連續語音識別系統的識別結果是一個詞序列。解碼實際上是對詞表的所有詞反覆搜索。詞表中詞的排列方式會影響搜索的速度,而詞的排列方式就是字典的表示形式。Sphinx系統中採用音素作爲聲學訓練單元,通常字典就用來記錄每個單詞由哪些個音素組成,也可以理解爲對每個詞的發音進行標註

         N-best搜索和多遍搜索:爲在搜索中利用各種知識源,通常要進行多遍搜索,第一遍使用代價低的知識源(如聲學模型、語言模型和音標詞典),產生一個候選列表或詞候選網格,在此基礎上進行使用代價高的知識源(如4階或5階的N-Gram4階或更高的上下文相關模型)的第二遍搜索得到最佳路徑。

 

對於語音識別過程個人的理解:

      例如我對電腦說:“幫我打開“我的電腦”!”然後電腦得理解我說了什麼,然後再執行打開“我的電腦”的操作,那怎麼實現呢?

       這個得預先有一個工作,就是電腦得先學會“幫我打開“我的電腦”!”這句語音(實際上是一個波形)所代表的文字就是“幫我打開“我的電腦”!”這句詞串。那麼如何讓它學會呢?

       如果以音節(對漢語來說就是一個字的發音)爲語音基元的話,那麼電腦就是一個字一個字地學習,例如“幫”字、“我”字等等,那麼“幫”字怎麼學習呢?也就是說電腦接收到一個“幫”字的語音波形,怎麼分析理解才知道它代表的是“幫”字呢?首先我們需要建立一個數學模型來表示這個語音。因爲語音是連續的不平穩的信號,但是在短的時間內可以認爲是平穩的,所以我們需要分割語音信號爲一幀一幀,假如大概25ms一幀,然後爲了讓每一幀平穩過渡,我們就讓每幀見存在重疊,假如重疊10ms。這樣每幀的語言信號就是平穩的了,再從每幀語音信號中提取反映語音本質特徵的信息(去除語音信號中對於語音識別無用的冗餘信息,同時達到降維)。那麼採用什麼特徵最能表達每一幀的語音呢?MFCC是用的比較多的一種,這裏不介紹了。然後我們就提取每一幀語音的MFCC特徵,得到了是一系列的係數,大概四五十個這樣,sphinx中是39個數字,組成了特徵向量。好,那麼我們就通過39個數字來描述每一幀的語音了,那不同的語音幀就會有不同的39個數字的組合,那我們用什麼數學模型去描述這39個數字的分佈情況呢?這裏我們可以用一個混合高斯模型來表示着39個數字的分佈,而混合高斯模型就存在着兩個參數:均值和方差;那麼實際上每一幀的語音就對應着這麼一組均值和方差的參數了。呵呵,挺囉嗦的啊。

       好了,這樣“幫”字的語音波形中的一幀就對應了一組均值和方差(HMM模型中的觀察序列),那麼我們只需要確定“幫”字(HMM模型中的隱含序列)也對應於這一組均值和方差就可以了。那麼後者是怎麼對應的呢?這就是訓練的作用了!我們知道描述一個HMM模型需要三個參數:初始狀態概率分佈π、隱含狀態序列的轉移矩陣A(就是某個狀態轉移到另一個狀態的概率觀察序列中的這個均值或者方差的概率)和某個隱含狀態下輸出觀察值的概率分佈B(也就是某個隱含狀態下對應於);而聲學模型可以用HMM模型來建模,也就是對於每一個建模的語音單元,我們需要找到一組HMM模型參數(π,AB)就可以代表這個語音單元了。那麼這三個參數怎麼確定呢?訓練!我們給出一個語音的數據庫,指明說這個語音代表這個詞,然後讓電腦去學習,也就是對數據庫進行統計,得到(π,AB)這三個參數。

         好了,一個字(建模單元)的聲學模型建立了。那漢語是不是有很多個字啊,那我們就得對每一個建立聲學模型了。假設就有幾千個模型,然後每個模型就有了三個或者5HMM狀態,那麼如果你說的句子有10個字,那我們就得搜索這所有可能的模型去匹配你的語音,那是多麼大的搜索空間了,這非常耗時。那我們就需要採用一個比較優的搜索算法了(這裏是Viterbi-Beam算法),它每搜索到一個狀態點,就保留概率最大的,然後捨棄之前的狀態點,這樣就裁剪了很多的搜索路徑,但因爲忽略了之前的路徑,所以它就只能得到一個局部的最優解。

        那假如出現以下情況呢?例如,Its a nice day,從語音上可能會被識別爲:It sun niced A,或者是It son ice day。從聲學模型來看它是無法區別這些結果,因爲其不同之處只是在於每個單詞的邊界劃分位置不同造成的。這時候語言模型就該閃亮登場了,從語義上判斷那個結果出現的概率最大,即爲搜索結果。語言模型N-Gram基於這樣一種假設,第n個詞的出現只與前面N-1個詞相關,而與其它任何詞都不相關,整句的概率就是各個詞出現概率的乘積。這些概率可以通過直接從語料中統計N個詞同時出現的次數得到。這樣就可以約束搜索,增加識別的準確率了。

 

       好了,有點囉嗦啊,我也是前幾天爲了要將語音識別加入到我的人機交互系統,然後纔去瞭解語音識別的,所以可能理解不是很正確,希望各位不吝指正!謝謝

 

對於一些語音的基本概念我翻譯了CMUsphinxwiki的部分,具體見:

http://blog.csdn.net/zouxy09/article/details/7941055

 

補充的一些概念:(整理自百度百科)

音節:

      音節是聽覺能感受到的最自然的語音單位,有一個或幾個音素按一定規律組合而成。

漢語音節:

       漢語中一個漢字就是一個音節,每個音節由聲母、韻母和聲調三個部分組成;漢語普通話中的無調音節(不做音調區分)共有400個音節。拼音是拼讀音節的過程,就是按照普通話音節的構成規律,把聲母、韻母、聲調急速連續拼合並加上聲調而成爲一個音節。如:q-i-ángqiáng(強)。

 

英語音節:

        音節是讀音的基本單位,任何單詞的讀音,都是分解爲一個個音節朗讀。英語中一個元音音素可構成一個音節,一個元音音素和一個或幾個輔音音素結合也可以構成一個音節。英語的詞有一個音節的,兩個音節的,多個音節的。一個音節叫單音節詞,兩個音節叫雙音節詞,三個音節以上叫多音節。如:take拿,ta'ble 桌子,pota'to馬鈴薯,popula'tion人口,congratula'tion祝賀。telecommunica'tion電訊。

        元音音素是構成音節的主體,輔音是音節的分界線。每個元音音素都可以構成一個音節,如:bed牀,bet 打賭。兩個元音音素都可以構成一個音節,如:seat坐位,beat 毒打,beast極好的。兩元音音素之間有一個輔音音素時,輔音音素歸後一音節,如:stu'dent學生,la'bour 勞動。有兩個輔音音素時,一個輔音音素歸前一音節,一個歸後一音節,如: win'ter冬天 fa'ther 父親,tea'cher教師。

 

音素:

         音素是根據語音的自然屬性劃分出來的最小語音單位。從聲學性質來看,音素是從音質角度劃分出來的最小語音單位。從生理性質來看,一個發音動作形成一個音素。如〔ma〕包含〔m〕〔a〕兩個發音動作,是兩個音素。相同發音動作發出的音就是同一音素,不同發音動作發出的音就是不同音素。如〔ma-mi〕中,兩個〔m〕發音動作相同,是相同音素,〔a〕〔i〕發音動作不同,是不同音素。

 

漢語音素:

        音節只是最自然的語音單位,而音素是最小的語音單位音素。漢語包括10個元音,22個輔音,總共有32個。一個音節,至少有一個音素,至多有四個音素。如“普通話”,由三個音節組成(每個字一個音節),可以分析成“p,u,t,o,ng,h,u,a”八個音素。

 

英語音素:

      記錄英語音素的符號叫做音標。英語國際音標共有48個音素,其中元音音素20個,輔音音素28個。英語輔音和元音在語言中的作用,就相當於漢語中的聲母和韻母。

 

語料:

        通常,在統計自然語言處理中實際上不可能觀測到大規模的語言實例。所以,人們簡單地用文本作爲替代,並把文本中的上下文關係作爲現實世界中語言的上下文關係的替代品。我們把一個文本集合稱爲語料庫(Corpus),當有幾個這樣的文本集合的時候,我們稱之爲語料庫集合(Corpora)。語料庫通常指爲語言研究收集的、用電子形式保存的語言材料,由自然出現的書面語或口語的樣本彙集而成,用來代表特定的語言或語言變體。

語料庫就是把平常我們說話的時候的句子、一些文學作品的語句段落、報刊雜誌上出現過的語句段落等等在現實生活中真實出現過的語言材料整理在一起,形成一個語料庫,以便做科學研究的時候能夠從中取材或者得到數據佐證。

例如我如果想寫一篇關於“給力”這個詞的普及性的文章,就可以到語料庫中查詢這個詞出現的頻率、用法等等。

 

Reference

王韻,基於Sphinx的漢語連續語音識別,太原理工大學,碩士學位論文

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章