標籤:

語音識別kaldi該如何學習?

目前為語音識別方向,但是實驗室目前只有我一個人做這個方向,處於自我探索無人帶的狀態,自己嘗試了半個月,感覺還是沒有入門,各種演算法也有了個大致了解,但我想實打實地做個語音識別系統出來,結合網上的推薦,選擇了kaldi來做,但是這方面的資料特別少,看他的官方文檔,也是懵懂不能入門呀,比如跑了例子,WER,CER這些都沒資料詳細說明代表什麼,只能靠運氣去看看誰的博客中有提及這些很基礎的東西才恍然大悟,想請教一下大家都是怎麼學習kaldi的?謝謝大家!


我目前使用kaldi分成兩塊: hmm-gmm和神經網路。

學習kaldi的話,先從hmm-gmm入手比較好,像steps/train_delta.sh, steps/train_fmllr.sh, steps/decode.sh這些腳本都是基於hmm-gmm模型。kaldi官網上沒有多少關於hmm-gmm的資料,沒有hmm-gmm基礎知識的初學者可能對於decision tree,alignment, lattice這些概念一頭霧水。若要搞清楚這些概念,可以看語音識別另一開原工具htk的文檔htk book,htk book是學習hmm-gmm很好的一部著作,將hmm-gmm從訓練到解碼的過程講解的很透徹。只要知道決策樹,訓練/識別網路擴展,viterbi解碼,EM演算法,區分訓練這幾個概念的原理hmm-gmm也就理解透徹了。htk book對於這些都有講解,部分內容如EM演算法,區分訓練需要看一些文獻。htk book第二,八,十,十二,十三章需要重點看;在學習htkbook的過程中,可以結合著kaldi的腳本對照理解;比如steps/train_delta.sh中build-tree命令那部分的代碼對應htk book第十章tree-based clustering, gmm-est命令那部分的代碼對應htk book第八章的Parameter Re-Estimation Formulae;

搞清楚hmm-gmm之後對語音識別就有了一個清晰的理解,接下來就可以上手神經網路。kaldi支持很多神經網路,如MLP, RNN, CNN, LSTM,如果對神經網路了解不多還是從MLP入手較好,MLP是神經網路中最基礎的模型。

神經網路kaldi有3個工具nnet1, nnet2, nnet3,初學者可以從nnet1開始。nnet1使用的是hmm-dnn架構,相關的知識可以查閱微軟俞棟2009-2013期間發表的論文。

nnet2的架構和nnet1同樣是hmm-dnn架構,但是使用的是dan povey團隊設計的NSGD演算法,支持多線程並行訓練,學習nnet2可以追dan povey從2012年之後的論文

至於nnet3,chain model,以及其他的神經網路結構(rn,cnn,lstm)的學習,當完成我上面的說的學習內容後自然對語音識別有一個大體的認識,後面要做的就是看相關的文獻。微軟,dan povey,google, 多倫多大學來自這些地方的論文不斷的追就行了。

最後總結,語音識別是對理論要求很高的方向,學習過程中一定要注重理論知識的學習,很多公式還是有必要自己去推導下才能有深刻的理解。

文獻:

HMM-GMM部分

&: HTK Speech Recognition Toolkit

http://lasa.epfl.ch/teaching/lectures/ML_Phd/Notes/GP-GMM.pdf

此文獻詳細講解了hmm-gmm訓練演算法的推導過程

http://www.cc.gatech.edu/~dellaert/em-paper.pdf

此文獻詳細講解了EM演算法的基本原理

Discriminative Training for Large Vocabulary Speech Recognition (PDF Download Available)

此文獻詳細講解了區分訓練的基本原理

神經網路部分:

Dan Povey

kaldi作者Dan Povey的個人主頁,學習nnet2, nnet3, chain model看Povey的論文會很有幫助;

《語音識別實踐》:微軟研究院俞棟對HMM-DNN架構在語音識別中的相關理論講解;內容主要是2009~2014期間學術界關於HMM-DNN架構的論文;

《模式識別》: 這本書第四章的非線性分類器作為神經網路的入門還是很合適的,理論講解很詳細;


謝邀了謝邀了,一直不知道應該說些什麼,因為早期我學kaldi的契機與方法都很粗暴,所以那時候對大家能不能起作用真的不知道;而這學期以來有了師弟陪我一起鑽研,就開始學得更細緻,效率更高,想的角度開始多了。

一開始我是先用HTK的,HTK是我用的第一款開源工具,當時學會了怎麼做bat批處理,寫腳本做列表,理解HTKbook裡面的概念;不過由於只是給我師兄做些數據準備工作,所以也沒碰到過多深層次的工程,但也確實多虧第一學期這樣反覆的數據準備勞動,現在寫python腳本理解各種數據集的屬性列表的寫法都熟能生巧。還有就是這學期看了好多論文和博客,雖然當時不知道能不能起作用,但可謂是廣泛涉獵。

第二學期是跟著導師上課,因為老師的課堂作業也開始有機會接觸HTK更多的東西,例如訓練HTK3.5的DNN網路和語音解碼,HCopy,Hvite等等我都跟著導師操作過;後來還和現在的師弟一起開始研究Kaldi的SRE10腳本。不過當時是趕著期末作業,只有一周半時間,所以直接一股腦兒拚命地做,找到了網上一個博客:

kaldi中改寫sre10/v1用timit dataset做說話人識別總結 照著裡面所需要的列表文件:wav.scp, utt2spk, spk2gender, trials寫,又因為shell第一次接觸就改腳本有點粗暴了,直接地把SRE10里v1和v2的代碼直接刪掉了各種原有的關於SRE數據集的操作(因為導師當時只需要我們跑自己採集的數據集就行),接著就是跑了啊~~~~~當中遇到不少錯,但記得翻看 log 文件就能很快get到point了;然後要多翻看中間exp輸出的文件,各種文件不妨都點開來看,會發現裡面有很多細節;最後做了一個期末報告,裡面列寫了我各種工程心得和debug的情況,就交了。

到了現在這個學期,感覺人開始沒以往那麼迷茫,過去一年所學的都慢慢可以發揮作用,從接觸新的project腳本,到Kaldi更新了新的function,再到調nnet3的超參,都可以從過去學到的東西找到理論經驗。然後現在和師弟一起研究nnet3,儘管每天都遇到問題也沒有停下腳步的意思。學一門東西,如果心情好真是會沉浸其中,雖然我也用過tf幾個月,但還是最後選擇了耕耘Kaldi……

-----------------------------------------------分割線----------------------------------------

總結一下上面的經驗吧:

1、多做經驗總結~真的很有用,好記性不如爛筆頭,我把每一步操作和每天的新發現都一一記錄下來,不過筆記也做得略為個性化,只需要自己看懂,重點是事無巨細

2、多嘗試錯,從bug中分析原因,這樣就可以規避重複的錯誤和耗時,畢竟做語音演算法這塊,跑程序還是蠻耗時,時間寶貴,能避開的bug就避開吧,經驗也同樣寫在筆記里~~

3、多看深層的腳本,總目錄下的run.sh都是頂層調用腳本,要寫出屬於自己的總腳本就需要理解裡面每個分支腳本,要善用每個分支腳本就要去挖掘每個Kaldi源命令的格式寫法;接觸源命令多了的話,就能很活用,會發現source path.sh之後,kaldi的命令都是如此自然可操作,跟sort、grep、awk沒什麼兩樣;其次就是kaldi有時候覺得裡面設計怪怪的,但坑挖的越深,就發現從設計者角度來看,是很有科學之處,很符合哲學思維,就慢慢愛上了這個開源工具……

4、多討論~這個確實有點難,如果課題組裡沒有興趣相投的人陪著你就好容易犯難,畢竟自己犯的錯好多時候檢查都是覺得多麼的對啊QAQ……所以這時候就需要一位好朋友陪你一起研究。我是很感謝我有師弟一起鑽研,而且他工程能力很強,他剛好彌補了我的短板^0^

5、多看Dan Povey的論文,多看Kaldi原文檔,多逛Kaldi論壇,如果能翻牆的話就去看看那個論壇和提問吧,他們組真的很耐心和熱情,可以從作者維護者本人學到很多~如果不能翻牆的話,可以發郵件喔~我就發過很多封,當時遇到問題幾乎周周一封。。T_T

6、多關注ICASSP,InterSpeech的論文集,裡面的論文都是精華啊~我也從裡面學到了很多有價值的知識,當讀paper時遇到知識點不懂,可以去翻看更深層的知識,或者追本溯源從參考文獻入手,從文獻逐步追朔說不定能領悟到作者的思考意圖。學別人的東西,我都很喜歡代入作者的角度去思考,從作者的角度想問題,是要比作為讀者的角度看問題更有意義。

7、國內有好多志同道合的人也在耕耘Kaldi噠~~可以去加入kaldi相關的qq群,和裡面的朋友討論討論,結識多點朋友~~真的很感謝有這麼多前輩的幫助~~~~~可能大家討論的東西我一開始不是很懂,或者方向不對,但不妨幫助別人解決或者去默默學習一下,語音演算法無分彼此,無論是語音識別還是聲紋識別,都可以去學習~兩者都是有交匯之處。現在我還偷閑陪我大師姐搞一波語音合成了//==\

8、多看基礎知識,不要一味往前沖而忽略了淺顯的基礎,這是很危險的。基礎知識可以多翻翻看,經典的演算法要時常溫習,這些可以從書本裡面獲取,例如《語音信號處理》《語音識別實踐》《統計學習方法》《機器學習》等等

附上一些資源:

Dan Povey

Wangd-kaldi-book - cslt Wiki

CS231n Convolutional Neural Networks for Visual Recognition


看到 實驗室只有我一個人做這個方向 ,那種孤獨和無助就湧上心頭。我最初用的HTK,各種調試報錯,跟著教程跑,知其然而不知其所以然,暈暈乎乎的跑完第一個timit例子,感覺整個人都要散架了,後來聽說kaldi里也有說話人識別的例子,並且被畢業多年的師兄安利,於是轉戰kaldi,然而,c++底子弱,shell腳本不會,linux不熟,來回折騰了一個月,直到遇到了@jinming,在他的幫助下終於跑通了sre10,一切熟悉之後,就開始了自我創(shui)作(wen)道路,發了幾篇文章,嗯,我要畢業了


被"實驗室目前只有我一個人做這個方向"刺痛了。。。

說實話,一方面語音識別門檻高,另一方面在實驗室一個人埋頭搞,感覺我走了很多彎路,很多方面慢慢慢慢地才開始清楚一點。

說下我的經歷:

研一上了導師的《言語信息處理》課程,就是語音識別基礎課程,用的教材是黃學東老師的&(這是一本很經典的教材,很全面吧。當然有點老...)。上完課程,我是堅定要研究語音識別的。(雖然課上完之後,腦子裡對語音識別的認識簡直是一團麻。尤其不知道怎麼去訓練連續語音的HMM/GMM模型,這個疑問困擾了我很久很久。因為課上把HMM,GMM分開講的,而且沒講怎麼訓練連續語音的模型)。

課上完了,然後就需要自己讀文獻、學工具實踐了。

1.實踐

Sphinx和HTK都接觸過,完成課程的大小作業。兩個工具都比較老了(不過聽說HTK居然還在更新,會加上神經網路等新技術...),所以,導師就建議研究Kaldi。

學Kaldi的過程中,一方面跑egs。建議就拿一個例子做重點研究,比如thchs30,數據都是可以下載openslr.org,數據放進去,只用修改數據路徑就可以直接跑了。邊跑邊研究腳本,弄清楚每一步在幹嘛,輸入輸出是什麼。(開始的時候不建議研究源碼,因為Kaldi源碼還是有些複雜的,會影響你理解的進度)。一個例子堅持研究完,這樣基本就清楚了語音識別流程了。

2.理論

英文方面,把&和HTK book翻來覆去地看。因為那時候腦子裡一直想弄明白HMM/GMM那一套,所以,帶著疑問去讀,比較有目的性。其他英文論文也沒少讀。

當時,還在網上看了一個博客(u010384318的專欄 - CSDN博客),並且認識了博主,還進了他維護的Kaldi交流群。

從小白到入門確實是很個很痛苦的過程。

最後,推薦一些我給好多人都推薦過的學習資源吧:

中文:

(1)語音識別的技術原理是什麼?

(2)https://zhihu-live.zhimg.com/0af15bfda98f5885ffb509acd470b0fa

(3)http://blog.csdn.net/wbgxx333

英文:

(1)&

(2)HTK book

(3)ASR webpage (ASR 課程)

(4)Speech Processing: 15-492/18-492 (CMU ASR課程)

路漫漫其修遠兮,吾將上下而求索...


如果對WER,CER不清楚的話,說明你對語音識別領域的基本功課做的不到位,推薦多看幾本書,比如俞棟,鄧力的紅寶書(語音識別實踐);&<&


推薦閱讀:

Language Model 在語音識別方面有哪些應用?
交通銀行機器人是如何做到如此智能的?
李開復在 CMU Sphinx 項目到底是什麼地位?
Siri 通過語音識別提供智能助手服務,這樣一個產品的技術挑戰在哪裡?
什麼是語音分離技術?它有哪些最新進展?

TAG:語音識別 |