
http://www.cnblogs.com/yin52133/archive/2012/06/21/2557219.html - (一)基本運行測試 http://www.cnblogs.com/yin52133/archive/2012/07/12/2587282.html - (二)自然語言處理原理研究 http://www.cnblogs.com/yin52133/archive/2012/07/12/2587419.html - (三)小范圍語音英文識別 http://www.cnblogs.com/yin52133/archive/2012/07/12/2588201.html - (四)小范圍語音中文識別 http://www.cnblogs.com/yin52133/archive/2012/06/22/2558806.html - (五)錯誤調試 http://www.cnblogs.com/yin52133/archive/2012/07/12/2588418.html - (六)我的目標和幾個想像的方案(閑置中)
這幾天忙完了一陣子,打算繼續研究下語音識別
文中都是根據自己的簡單測試得到的結論,可能有很多錯誤,發現問題,歡迎一起討論
先說一下一般的語音識別流程;以下內容很多都是看自吳軍博士的《數學之美》這本書
sphinx語音識別其實是基於統計語言模型的
它主要靠language model(lm),Hidden Markov Model(hmm)模型識別語音。
//很顯然有數據的情況下這個很好統計,遍歷就行了
P(w1,w2)w1.w2是連續出現的概率
P(w2|w1)是已知W1已出現的情況下w2
假設識別sentence的概率用P(S)表示
P(S)=P(w1,w2,...wn) 表示單詞集w1,w2,。。。wn連續出現並生成S的概率
使用條件概率公式S 把整個公式替換成
P(sentence) = P(w1)*P(w2|w1)*P(w3|w2)。。。P(wn|w1,w2.。。wn-1)
再用馬爾科夫假設精簡成
P(sentence) = P(w1)*P(w2|w1)*P(w3|w2)。。。P(wn|wn-1)的問題
而
P(wi|wi-1) = P(wi-1,wi) / P(wi)
然后P(wi,|wi-1)和p(wi)都可以從語料統計出來
最終就能得到P(sentence)。而lm模型存儲的就是這些p(wi-1,wi)這些概率統計值
實際識別就是算出Max{P(sentence)}的過程
然后是hmm 隱馬爾科夫模型
有興趣的可以去看《數學之美》或者其他相關書籍
然后再回到pocketSphinx上,我們可以知道識別一條語音至少需要
*.dic *.lm(或者*.DMP) 還有hmm模型
其中 *.dic是整個語料庫,包含了改系統能支持的所有單詞和對應的發音
*.lm就是統計語言模型
hmm是隱馬爾科夫模型、信號到實際數據的識別 這先不要管
我認為的識別流程應該是這樣的
hmm依賴lm和dic
lm和dic是靠txt生成的
然后hmm對我們錄制的音頻流,再使用dic和lm識別
而訓練需要的分別是wav和語料庫
實際音頻到理論音頻數據的(也就是訓練hmm)
而大量的語料庫是用於訓練lm
建立統計模型(訓練語言模型)
舉個例子
整句和單詞舉個例子就是
dic里面
open 發音
close 發音
door 發音
button 發音
這樣的話
識別單詞是
識別出來close;door;button;open什么的就靠dic發音映射表,對照判斷
而你要識別連續的單詞、如open door ,close button就需要靠大量數據或者手動的修改語言模型
還是open close door button這例子
你在lm里把句首 open close 出現的概率提高(接近100%)
然后 door button在句首出現的概率降低到 (接近 0%)
然后在第二個位置的概率弄反
這樣的話、他的語法結構就能接近 (open|close) (door|button)
這種形式,可以變相提高整句的識別能力
就是說一句話一個語音流輸入它的庫可能會把它分離成小的單詞流
采樣后和語音庫(*.dic)匹配
然后第一個有幾個備選,再給這些備選+第二個(第二個又是概率里面拿)
得到模糊的串經過語言統計模型然后返回總體可能性最大的。
所以我們最關鍵就是准確的單詞發音映射表還有統計語言模型(*.lm)
而統計語言模型這需要大量的樣例數據獲得更為准確的概率,也能進一步獲取更為准確的結果