用PocketSphinx做離線命令詞識別

  主要內容轉自Android平臺使用PocketSphinx做離線語音識別,小範圍語音99%識別率,在此只是記錄一下實現過程中遇到的坑。
  

最近語音識別很火,但是都是用的在線語音識別,研究了一下離線語音識別,小範圍內的語音識別率還不錯,在此記錄一下
首先本文要說的兩個前提1.android平臺離線語音識別 2.小範圍語音
小範圍語音指的是相對固定的命令。本文的例子大概實現了20條語音命令,超出範圍的無法識別。因此本文中離線語音的使用範圍也有限,對於一些固定的輸入可能有用,比如用語音命令代替打開,播放,重啓這些簡單的固定的命令。
先上個例子
1.按照 http://leiwuluan.iteye.com/blog/1287305 的方法,先跑一個PocketSphinxDemo的例子起來。跑起來之後會發現語音識別率很低,大概20%不到。下面來優化一下
2.編寫自己的命令集
<s>百度</s>
<s>谷歌</s>
<s>音樂</s>
<s>擡頭</s>
<s>低頭</s>
保存爲command.txt
http://www.speech.cs.cmu.edu/tools/lmtool.html上點Browse,提交command.txt,在線生成語言模型文件。這裏只要生成的lm文件,命名爲test.lm。從這裏下載pocketsphinx-win32,解壓後在/model/lm/zh_cn有個mandarin_notone.dic的文件,打開後,搜索command.txt裏面的詞,然後替換相應的內容,替換後的內容如下
這裏寫圖片描述
存爲test.dic
3.替換語言模型文件。下載附件中的data.zip,解壓後文件如下(之前附件中的data不可用,已更新)
這裏寫圖片描述
分別放到一下目錄
/sdcard/Android/data/test/hmm/tdt_sc_8k
/sdcard/Android/data/test/lm/test.dic
/sdcard/Android/data/test/lm/test.lm
如果要換目錄的話,對應修改RecognizerTask.RecognizerTask()裏的如下代碼
c.setString(“-hmm”, “/sdcard/Android/data/test/hmm/tdt_sc_8k”);
c.setString(“-dict”, “/sdcard/Android/data/test/lm/test.dic”);
c.setString(“-lm”, “/sdcard/Android/data/test/lm/test.lm”);
lm和dic文件即3中生成的文件,tdt_sc_8k也可以從這裏下載。
4.文件準備完畢,重新跑1中的demo。語音輸入2中的命令,識別率99%以上,但是輸入命令集以外的無法識別。
這裏寫圖片描述
6.附件爲工程文件,將data解壓,按照3裏面寫的位置放到sd卡里面即可。以下字典內的詞可以識別
這裏寫圖片描述

按照他的方法,弄了幾個小時,最終成功實現了自己的離線語音命令詞識別。不過中途遇到的一些坑需要提一下,希望後面學習的朋友不再被這些困擾。
1、編寫自己的命令集
  <s>百度</s>
  <s>谷歌</s>
  <s>音樂</s>
  <s>擡頭</s>
  <s>低頭</s>
實際上這樣寫是錯誤的,正確的形式應該是
    百度  
    谷歌
    音樂
    擡頭
    低頭
因爲在生成lm文件的時候會產生很多<s></s>符號導致無法識別
2、編碼問題

1) test.lm文件

上傳到http://www.speech.cs.cmu.edu/tools/lmtool.html的命令集的txt文件必須爲utf-8的形式。且不能有UTF-8文件頭
在txt文件保存爲UTF-8格式之後,TXT文件會默認爲文件加上EF BB BF文件頭,導致數據出現問題。如圖:
UTF-8文件頭
正確的形式應該將這部分默認添加的內容刪掉,正確的格式如圖:
刪除文件頭
(我用的010Editor,隨便找個16進制編輯器就可以打開了)

2) test.dic文件
同理,編輯好命令之後,需要用16進制編輯器把UTF-8頭信息去掉。
test.dic

最後效果:個人感覺識別率還不錯。雖然說達不到99%那麼誇張,90%應該還是有的。
效果

3、start監聽的時間:
在我的三星note2上測試,語音識別start開始,一直不說話,在163秒的時候會出現下面的錯誤,可能是因爲緩存區溢出的原因。我的解決辦法是:new 一個新線程來作計時器,在100秒的時候就stop語音識別,再延遲200ms,重新start。

01-13 15:22:01.991: A/libc(31349): /root/workspace/VoiceRecognition/sphinxbase/src/libsphinxbase/feat/feat.c:362: feat_array_alloc: assertion "nfr > 0" failed

01-13 15:22:01.991: A/libc(31349): Fatal signal 6 (SIGABRT) at 0x00007a75 (code=-6), thread 31369 (Thread-925)

由於原博客下載DEMO需要註冊之後等待一天才能下載,我把它重新打包上傳了,需要的朋友不用再等待一天了。
下載地址:http://download.csdn.net/detail/adzcsx2/9401224

發佈了29 篇原創文章 · 獲贊 14 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章