Sphinx語音識別學習記錄 (四)-小范圍語音中文識別


CMUSphinx系列目錄
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武林秘籍(上)

但很多人照做之后紛紛表示識別不出來,我們猜測是某個參數設定錯誤或者版本變化導致的

http://www.cnblogs.com/huanghuang/archive/2011/07/14/2106579.html

然后最近我也看了幾篇,查看思路發現了下面兩篇文章

http://leiwuluan.iteye.com/blog/1287305 - pocketsphinxAdroid離線語音識別---入門

http://zuoshu.iteye.com/blog/1463867 - Android平台使用PocketSphinx做離線語音識別,小范圍語音99%識別率

 

這兩篇文章,一個說20%識別,一個說99%

然后再仔細看之后發現是 tdt_sc_8k 中文識別模型

然后小范圍語音99%識別率這個博客的博主(好長的稱呼,直接叫99博主算了。。。)說的直接用在線工具(http://www.speech.cs.cmu.edu/tools/lmtool.html)生成的字典和語言模型,那時候我去測試了下,發現不支持分詞,也不支持語料庫里注音,我就直接扔掉了結果。。。現在想來,我應該也測試一把的

然后我突然想到,上次那個zh_broadcastnews_ptm256_8000 雖然測試的沒識別出來任何東西,但不是有個很全的語料庫嗎?2.1mb的純文本

我就去打開了看,並挨個單詞搜了下,單詞的確很全

但是LM模型呢?在線工具不支持中文分詞。。。我自己有沒搞懂lm的格式和參數各自是什么

然后想到不支持分詞,那我自己分詞,然后讓在線工具生成不行嗎?就跟上午英語識別一樣

下面是我的command6.txt

打開 瀏覽器
打開 音樂
打開 記事本
關閉 窗口
關閉 音樂

然后直接用生成的6010.lm,因為6010.dic注音表完全是空白的(在線工具不支持中文注音映射到英文)直接扔掉。

然后直接調用了zh_broadcastnews_utf8.dic,發現識別不出來。。。明明和上午的格式一樣

然后想起來zh_broadcastnews_utf8.dic這個這么大,lm那么小,是不是太大了,而且文件開頭一大段看不懂的東東然后我自己就臨時創建了一個6010.dic

內容是

窗口 ch uang k ou
打開 d a k ai
關閉 g uan b i
記事本 j i sh ib b en
瀏覽器 l iu l an q i
音樂 y in uxs uxe

這里的發音是怎么出來的?我其實就是在zh_broadcastnews_utf8.dic里面查找到那個單詞后,復制過來的

然后測試

pocketsphinx_continuous -hmm tdt_sc_8k -lm 6010.lm -dict 6010.dic

我去,竟然能識別的出來。。。下面是結果

INFO: ngram_search.c(875): bestpath 0.00 CPU 0.000 xRT
INFO: ngram_search.c(878): bestpath 0.00 wall 0.001 xRT
000000003: 打開 瀏覽器
READY....
Listening...
Stopped listening, please wait...
INFO: cmn_prior.c(121): cmn_prior_update: from < 50.66  1.37  0.15  0.75 -0.44
0.37  0.02  0.19 -0.09  0.08  0.04 -0.07 -0.00 >
INFO: cmn_prior.c(139): cmn_prior_update: to   < 52.13  1.51  0.64  0.68 -0.80
0.44 -0.26  0.10 -0.07 -0.03  0.08 -0.19 -0.02 >
INFO: ngram_search_fwdtree.c(1549):      825 words recognized (5/fr)
INFO: ngram_search_fwdtree.c(1551):    18335 senones evaluated (111/fr)
INFO: ngram_search_fwdtree.c(1553):     7691 channels searched (46/fr), 965 1st,
 4828 last
INFO: ngram_search_fwdtree.c(1557):     1203 words for which last channels evalu
ated (7/fr)
INFO: ngram_search_fwdtree.c(1560):      343 candidate words for entering last p
hone (2/fr)
INFO: ngram_search_fwdtree.c(1562): fwdtree 0.05 CPU 0.028 xRT
INFO: ngram_search_fwdtree.c(1565): fwdtree 2.52 wall 1.528 xRT
INFO: ngram_search_fwdflat.c(305): Utterance vocabulary contains 5 words
INFO: ngram_search_fwdflat.c(940):      630 words recognized (4/fr)
INFO: ngram_search_fwdflat.c(942):    14119 senones evaluated (86/fr)
INFO: ngram_search_fwdflat.c(944):     6618 channels searched (40/fr)
INFO: ngram_search_fwdflat.c(946):     1293 words searched (7/fr)
INFO: ngram_search_fwdflat.c(948):      206 word transitions (1/fr)
INFO: ngram_search_fwdflat.c(951): fwdflat 0.03 CPU 0.019 xRT
INFO: ngram_search_fwdflat.c(954): fwdflat 0.02 wall 0.015 xRT
INFO: ngram_search.c(1201): </s> not found in last frame, using <sil>.163 instea
d
INFO: ngram_search.c(1253): lattice start node <s>.0 end node <sil>.105
INFO: ngram_search.c(1281): Eliminated 99 nodes before end node
INFO: ngram_search.c(1386): Lattice has 215 nodes, 219 links
INFO: ps_lattice.c(1352): Normalizer P(O) = alpha(<sil>:105:163) = -1028613
INFO: ps_lattice.c(1390): Joint P(O,S) = -1029390 P(S|O) = -777
INFO: ngram_search.c(875): bestpath 0.00 CPU 0.000 xRT
INFO: ngram_search.c(878): bestpath 0.00 wall 0.001 xRT
000000004: 關閉 音樂

如果的確說了的話,也跟上午的准確率差不多,說了11句,全部識別正確了

不過這個識別庫貌似比較敏感,我沒說話,只有鍵盤聲音他竟然能識別成打開

要實用的話、這個問題可能要解決。

 

然后hmm模型調用 zh_broadcastnews_ptm256_8000之后,發現他智能識別一開始語料庫里出現過,所以在語料庫有記錄的組合

這樣的話,損失一些自由度,比如我開始的語料庫沒有 ”打開窗口“這句話,但是使用tdt_sc_8k這個模型,他能准確的識別出來,而zh_broadcastnews_ptm256_8000識別不出來。應該是對lm的依賴度和策略選擇問題。

上午的hub4wsj_sc_8k和tdt_sc_8k都是默認提供的簡單模型,實際使用識別都很准確。但是tdt_sc_8k有時候過於自由敏感,某一次連鍵盤敲擊聲竟然都識別成了打開

不過有人說話的話還是很准確的。

至於這個自由度的度量,只能看你們需要什么程度的模型了。

 

然后就是那個zh_broadcastnews_utf8.dic這個字典、如果你不想自己搜索,並粘貼過去,可以。但是你需要把dic字典文檔的編碼轉換成GB2312的、那樣才能識別,否則系統識別不了你的字典。因為zh_broadcastnews_utf8.dic這個本身的編碼是utf8的、而windows下貌似默認識別的是GB2312;UTF-8的會出現亂碼或者不能識別

而linux下又只是識別UTF-8,而不識別GB2312。跟着武林秘籍訓練lm和dic的可以查看下你們訓練的文檔編碼格式對不對,有時候這個編碼錯誤,直接出現空白的

 

 

能識別到中文真是糾結啊,各種查官網資料,語音識別資料,還有好幾個博客。

雖然有些照做不能跑,但是畢竟博主們都各自運行成功過,都有不少借鑒價值

這套方案,雖然挺麻煩的,但至少可以用。大家先參考下

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM