PocketSphinx語音識別系統的編譯、安裝和使用
PocketSphinx語音識別系統的編譯、安裝和使用
Sphinx是由美國卡內基梅隆大學開發的大詞彙量、非特定人、連續英語語音識別系統。Sphinx從開發之初就得到了CMU、DARPA等多個部門的資助和支援,後來逐步發展為開源專案。目前CMU Sphinx小組開發的下列譯碼器:
Sphinx-2採用半連續隱含馬爾可夫模型(SCHMM)建模,採用的技術相對落後,使得識別精度要低於其它的譯碼器。
PocketSphinx是一個計算量和體積都很小的嵌入式語音識別引擎。在Sphinx-2的基礎上針對嵌入式系統的需求修改、優化而來,是第一個開源面向嵌入式的中等詞彙量連續語音識別專案。識別精度和Sphinx-2差不多。
Sphinx-3是CMU高水平的大詞彙量語音識別系統,採用連續隱含馬爾可夫模型CHMM建模。支援多種模式操作,高精度模式扁平譯碼器,由Sphinx3的最初版本優化而來;快速搜尋模式樹譯碼器。目前將這兩種譯碼器融合在一起使用。
Sphinx-4是由JAVA語言編寫的大詞彙量語音識別系統,採用連續的隱含馬爾可夫模型建模,和以前的版本相比,它在模組化、靈活性和演算法方面做了改進,採用新的搜尋策略,支援各種不同的語法和語言模型、聽覺模型和特徵流,創新的演算法允許多種資訊源合併成一種更符合實際語義的優雅的知識規則。由於完全採用JAVA語言開發,具有高度的可移植性,允許多執行緒技術和高度靈活的多執行緒介面。
針對不同的應用和平臺選用不同版本的引擎。因為我是需要把語音識別融合到我的人機互動系統上面的,而且未來還會移植到嵌入式平臺上面,所以我選擇了PocketSphinx語音識別引擎來提供語音識別功能。
為了可以更好的理解下面我安裝的是什麼工具,這些工具有什麼作用,我們最好可以先了解下語音識別的基礎知識和sphinx的知識,具體可以參考我的另一篇博文:
語音識別的基礎知識與CMUsphinx介紹:
http://blog.csdn.net/zouxy09/article/details/7941585
一、使用平臺
Ubuntu12.04
還需要安裝的包:
# sudo apt-get install libasound2-dev bison
二、 CMUSphinx語音識別工具包下載
Pocketsphinx —用C語言編寫的輕量級識別庫,主要是進行識別的。
Sphinxbase — Pocketsphinx所需要的支援庫,主要完成的是語音訊號的特徵提取;
Sphinx3 —為語音識別研究用C語言編寫的解碼器
Sphinx4 —為語音識別研究用JAVA語言編寫的解碼器
CMUclmtk —語言模型訓練工具
Sphinxtrain —聲學模型訓練工具
下載網址:http://sourceforge.net/projects/cmusphinx/files/
我們只需要下載以下四個最新版本的工具包即可:
sphinxbase-0.7、pocketsphinx-0.7、sphinxtrain-1.0.7、cmuclmtk-0.7;
三、安裝工具包
由於pocketsphinx依賴於另外一個庫Sphinxbase。所以先需要安裝Sphinxbase。
(1)安裝Sphinxbase
#tar -xzf sphinxbase-0.7.tar.gz
#cd sphinxbase-0.7
#./configure
#make
# make install
注意:./configure將會檢查你的系統是否具有其編譯所需要的所有包,如果沒有的話,它會提示缺少什麼包,例如缺少“bison”,那麼我們需要對它進行安裝:
//搜尋包含“bison”關鍵字的包,因為有些包可能不是這樣命名的,後面可能會加個-dev表示開發板,前面也可能加個lib表示庫等等。但這裡搜尋了,包的名字就是bison
#apt-cache search bison
//然後就下載相應的包安裝即可
#apt-get install bison
安裝完缺少的包後,繼續執行./configure,以後遇到類似情況同樣處理。
包預設安裝在/usr/local/bin下面,ls可檢視。可以在配置時用–prefix指定自定義的安裝路徑,但最好使用預設的安裝路徑,否則的話得自己新增這些庫的路徑進環境變數中。
(2)安裝pocketsphinx
得先把Sphinxbase的庫的路徑進環境變數中。通過:
export LD_LIBRARY_PATH=/usr/local/lib //這個一般系統都已經加進去了
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig //這個PKG_CONFIG_PATH主要指明Sphinxbase的.pc檔案的所在路徑,這樣 pkg-config工具就可以根據.pc檔案的內容動態生成編譯和連線選項,比如 cflags(編譯用的標頭檔案)和 libs (連線用的庫),至於說pkg-config的具體細節?百度下就知道了,瞭解這個工具非常有用。
另外,環境變數的設定只對當前的終端視窗有效,新建一個新的終端或者重啟系統之後,需要重新設定 PKG_CONFIG_PATH。所以我們可以通過編輯系統的連結檔案/etc/ld.so.conf去使其長期有效,如下:
#vi /etc/ld.so.conf
開啟後,在新的一行新增(每一個路徑一行):
/usr/local/lib
/usr/local/lib/pkgconfig
然後,執行:
#ldconfig
使其生效(ldconfig將 /etc/ld.so.conf列出的路徑下的庫檔案快取到/etc/ld.so.cache以供使用,系統是通過讀取這個庫列表檔案來加快搜索連結路徑的速度的)。
然後開始編譯安裝:
#tar -xzf pocketsphinx-0.7.tar.gz
#cd pocketsphinx-0.7
#./configure
#make
#sudo make install
預設安裝在/usr/local/bin下。
測試下安裝結果:
#pocketsphinx_continuous
若出現如下資訊,說明安裝成功。
INFO: cmd_ln.c(512): Parsing command line:
pocketsphinx_continuous
Current configuration:
[NAME] [DEFLT] [VALUE]
-adcdev
………………………………….
…………………………………
………………………………….
Warning: Could not find Mic element
INFO: continuous.c(261): pocketsphinx_continuous COMPILED ON: Feb 21 2011, AT: 22:31:47
READY....
(3)安裝語言模型訓練工具CMUCLMTK
順便把語言模型訓練工具也安裝上,因為後面需要用到(當然,如果你採用的是現成的模型的話,那就不需要安裝這個工具),安裝過程其實都是一樣的。
#tar -xzf cmuclmtk-0.7.tar.gz
#cd pocketsphinx-0.7
#./configure
#make
#sudo make install
預設安裝在/usr/local/bin下面,可以看到下面這些生成檔案
idngram2lm idngram2stats mergeidngram text2idngram
text2wfreq text2wngram wfreq2vocab
(4)安裝聲學模型訓練工具sphinxtrain
順便把聲學模型訓練工具也安裝上,因為後面需要用到(當然,如果你採用的是現成的模型的話,那就不需要安裝這個工具),安裝過程其實都是一樣的。
#tar -xzf sphinxtrain-1.0.7.tar.gz
#cd pocketsphinx-0.7
#./configure
#make
這裡沒有make install的安裝過程,因為sphinxtrain只是包含了用來訓練聲學模型的Perl和Python指令碼,還有一些工具命令。
所以我們還需要下載Perl和Python工具來使用這些指令碼:
他們的網址:http://www.perl.org和http://www.python.org/download/
ubuntu就是好啊,apt-get就行:
# apt-get install perl
# apt-get install python
四、獲得語言模型和聲學模型
語言模型和聲學模型的來源有以下三個方面:我們這裡主要講中文的。
(1)原始碼自帶的:
pocketsphinx-0.7/model/hmm/zh/tdt_sc_8k目錄下是中文的聲學模型
pocketsphinx-0.7/model/lm/zh_CN 目錄下是中文的語言模型
這些模型已經被安裝(拷貝)到了 /usr/local/share/pocketsphinx/model目錄下:
(hmm表示隱馬爾可夫聲學模型,lm表示language model語言模型)
.
├── hmm
│ ├── en
│ │ └── tidigits
│ │ ├── feat.params
│ │ ├── mdef
│ │ ├── means
│ │ ├── sendump
│ │ ├── transition_matrices
│ │ └── variances
│ ├── en_US
│ │ └── hub4wsj_sc_8k
│ │ ├── feat.params
│ │ ├── mdef
│ │ ├── means
│ │ ├── noisedict
│ │ ├── sendump
│ │ ├── transition_matrices
│ │ └── variances
│ └── zh
│ └── tdt_sc_8k
│ ├── feat.params
│ ├── mdef
│ ├── means
│ ├── noisedict
│ ├── sendump
│ ├── transition_matrices
│ └── variances
└── lm
├── en
│ ├── tidigits.dic
│ ├── tidigits.DMP
│ ├── tidigits.fsg
│ ├── turtle.dic
│ └── turtle.DMP
├── en_US
│ ├── cmu07a.dic
│ ├── hub4.5000.DMP
│ └── wsj0vp.5000.DMP
├── zh_CN
│ ├── gigatdt.5000.DMP
│ └── mandarin_notone.dic
└── zh_TW
├── gigatdt.5000.DMP
└── mandarin_notone.dic
我們可以通過#pkg-config --variable=modeldir pocketsphinx這個命令來獲得模型的安裝目錄。也就是/usr/local/share/pocketsphinx/model
(2)網上下載:
CMU sphinx的官網提供了各種語言的聲學模型和語言模型的下載,具體見:
http://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/
其中也有中文的:
聲學模型:zh_broadcastnews_16k_ptm256_8000.tar.bz2
語言模型:zh_broadcastnews_64000_utf8.DMP
字典檔案:zh_broadcastnews_utf8.dic
(3)自行訓練得到:
因為每個人的聲音不一樣,另外應用也不一樣(所需詞彙類別和不同),所以別人的模型可能在自己的語音下識別準確率不高,這樣就需要訓練自己的聲學模型和語言模型(CMU也提供一個改進現有聲學模型的方法)。因為訓練需要的準備和步驟挺多的,所以這裡就不寫了,具體的訓練方法會在下一個博文中說明。
五、使用語言模型和聲學模型
執行 pocketsphinx進行語音識別需要指定三個檔案:聲學模型、語言模型和字典檔案。我們以第二個網上下載回來的這三個檔案為例子說明如何使用他們進行語音識別。
聲學模型:zh_broadcastnews_16k_ptm256_8000.tar.bz2
語言模型:zh_broadcastnews_64000_utf8.DMP
字典檔案:zh_broadcastnews_utf8.dic
先把以上三個檔案放在同一個目錄下,再把聲學模型解壓:
#tar -xjf zh_broadcastnews_16k_ptm256_8000.tar.bz2
解壓後會在當前資料夾生成一個包含以下八個檔案的資料夾。
zh_broadcastnews_ptm256_8000/
├── feat.params //HMM模型的特徵引數
├── mdef //模型定義檔案(為每個即將進行訓練的HMM的每一狀態定義一個獨特的數字標識)
├── means //混合高斯模型的均值
├── mixture_weights //混合權重
├── noisedict //噪聲也就是非語音字典
├── sendump //用來從聲學模型中獲取mixture_weights檔案的??
├── transition_matrices //HMM模型的狀態轉移矩陣
└── variances //混合高斯模型的方差
然後我們執行:
#pocketsphinx_continuous -hmm zh_broadcastnews_ptm256_8000/ -lm zh_broadcastnews_64000_utf8.DMP -dict zh_broadcastnews_utf8.dic
-hmm選項指定聲學模型資料夾 –lm選項指定語言模型 –dict選項指定字典檔案;
pocketsphinx會分析你傳入的檔案取得模型和識別的引數,然後顯示出來,再有很多資訊,等到顯示:
Warning: Could not find Mic element
READY....
到這裡你就可以對她喊話讓它識別了。對著麥克風講話結束後在螢幕上以文字形式顯示識別結果。在麥克風輸入時,兩者的最長語音時間為5秒,前者是通過說話人的正常語句停頓作為斷句的分割點,並將停頓之前的語音訊號作為一個處理段。