語音識別(speech recognition)技術,也被稱爲自動語音識別(英語:Automatic Speech Recognition, ASR)、計算機語音識別(英語:Computer Speech Recognition)或是語音轉文本識別(英語:Speech To Text, STT),其目標是以計算機自動將人類的語音內容轉換爲相應的文字。html
按照不一樣緯度以下分類:python
The CMU Pronouncing Dictionary.linux
一個語音識別系統主要包括信號處理和特徵提取、聲學模型訓練、語言模型訓練以及識別引擎等幾個核心部分,下圖爲語音識別的原理框圖:c++
但隨着神經網絡技術的發展,後面又出現了基於DNN-HMMs的語音識別模型,一句話歸納就是用DNN代替以前的GMMs,有更好的建模能力。算法
主流的DNN模型,包括FFDNN、CDDNN、TDNN、RNN等,以及一些訓練中可使用的trick等。sql
http://www.javashuo.com/article/p-ufywjzhd-nd.htmlshell
本文檔模型訓練方式採用的是GNN-HMMvim
爲何調研kaldi工具網絡
Kaldi 的架構以下圖:架構
Gcc 4.8及以上
Patch
Make .
automake
Autoconf
zlib zlib-devel
gdbm
bzip2
sqlite
openssl-devel
Readline
python3
這裏我是編譯安裝,沒有替換以前的2.7; /usr/bin下直接創建的python3的軟連
解壓 kaldi-master.zip
[root@localhost mnt]# cd kaldi-master/tools/
查看環境要求
[root@localhost tools]# cat INSTALL
依賴環境知足的狀況下 運行檢查腳本 會 回執 OK 以下圖
查看 cup 內核數
確認內核數 開始編譯
[root@localhost tools]# make -j 8
[root@localhost tools]# ./extras/install_irstlm.sh
安裝語言模型
安裝編譯安裝,時間會有些長, 可能會出現一些編譯失敗的錯誤信息,能夠根據實際報錯內容進行逐個排查,
[root@localhost tools]# cd ../src/
[root@localhost src]# ./configure
[root@localhost src]# make depend
[root@localhost src]# make
檢查編譯成功後的執行文件
[root@localhost kaldi-master]# cd src/bin
[root@localhost bin]# ls
在kaldi中,目前針對深度神經網絡提供三種代碼庫。第一個是"nnet1"(位於nnet/和nnetbin/下),最初由Karel Vesely維護;第二個"nnet2"(位於nnet2/和nnet2bin/下)最初由Daniel Povey維護;第三個"nnet3"(位於nnet3/和nnet3bin/下)由Daniel的nnet2轉化而來
[root@localhost kaldi-master]# cd egs/yesno/s5/
[root@localhost s5]# ./run.sh
開始下載學習集並開始製做
輸出後的結果,運行到這裏,說明kaldi 已經正確安裝好。
WER(WordError Rate)是字錯誤率,是一個衡量語音識別系統的準確程度的度量。其計算公式是WER=(I+D+S)/N,其中I表明被插入的單詞個數,D表明被刪除的單詞個數,S表明被替換的單詞個數。也就是說把識別出來的結果中,多認的,少認的,認錯的全都加起來,除以總單詞數。這個數字固然是越低越好。
[root@localhost s5]# cd waves_yesno/
[root@localhost waves_yesno]# ll
生成的音頻
Kaldi中文語音識別公共數據集一共有4個(據我所知),分別是:
1.aishell: AI SHELL公司開源178小時中文語音語料及基本訓練腳本,見kaldi-master/egs/aishell
2.gale_mandarin: 中文新聞廣播數據集(LDC2013S08, LDC2013S08)
3.hkust: 中文電話數據集(LDC2005S15, LDC2005T32)
4.thchs30: 清華大學30小時的數據集,能夠在http://www.openslr.org/18/下載
這裏使用thchs30數據集進行訓練
已下載的數據包
數據集 |
音頻時長(h) |
句子數 |
詞數 |
train(訓練) |
25 |
10000 |
198252 |
dev(開發) |
2:14 |
893 |
17743 |
test(測試) |
6:15 |
2495 |
49085 |
還有訓練好的語言模型word.3gram.lm和phone.3gram.lm以及相應的詞典lexicon.txt。
其中dev的做用是在某些步驟與train進行交叉驗證的,如local/nnet/run_dnn.sh同時用到exp/tri4b_ali和exp/tri4b_ali_cv。訓練和測試的目標數據也分爲兩類:word(詞)和phone(音素)
1.local/thchs-30_data_prep.sh主要工做是從$thchs/data_thchs30(下載的數據)三部分分別生成word.txt(詞序列),phone.txt(音素序列),text(與word.txt相同),wav.scp(語音),utt2pk(句子與說話人的映射),spk2utt(說話人與句子的映射)
2.#produce MFCC features是提取MFCC特徵,分爲兩步,先經過steps/make_mfcc.sh提取MFCC特徵,再經過steps/compute_cmvn_stats.sh計算倒譜均值和方差歸一化。
3.#prepare language stuff是構建一個包含訓練和解碼用到的詞的詞典。而語言模型已經由王東老師處理好了,若是不打算改語言模型,這段代碼也不須要修改。
a)基於詞的語言模型包含48k基於三元詞的詞,從gigaword語料庫中隨機選擇文本信息進行訓練獲得,訓練文本包含772000個句子,總計1800萬詞,1.15億漢字
b)基於音素的語言模型包含218個基於三元音的中文聲調,從只有200萬字的樣本訓練獲得,之因此選擇這麼小的樣本是由於在模型中儘量少地保留語言信息,可使獲得的性能更直接地反映聲學模型的質量。
c)這兩個語言模型都是由SRILM工具訓練獲得。
[root@localhost ~]# mkdir -p /DATA/works/
上傳學習包並解壓
[root@localhost ~]# cd /mnt/kaldi-master/egs/thchs30/s5/
修改內容以下:
export train_cmd=run.pl
export decode_cmd="run.pl --mem 4G"
export mkgraph_cmd="run.pl --mem 8G"
export cuda_cmd="run.pl --gpu 1"
[root@localhost s5]# vim cmd.sh
[root@localhost s5]# vim run.sh
開始製做模型
[root@localhost s5]# ./run.sh
咱們沒有DNN(無GPU)來跑,因此運行起來會比較慢。//後續有資源的狀況嘗試大數據
模型生成後存放的路徑thchs30/s5/exp/tri1
final.mdl 就是訓練出來的可使用的模型,另外,在 graph_word 下面的 words.txt 和 HCLG.fst 分別爲字典以及有限狀態機。單獨介紹這三個文件,是由於咱們下面的示例主要基於這三個文件來識別的。
將製做好的模型 複製到如下路徑
/mnt/kaldi-master/egs/thchs30/online_demo/online-data/models/tri1
/mnt/kaldi-master/egs/thchs30/online_demo
[root@localhost online_demo]# vim run.sh
[root@localhost online_demo]# ./run.sh 模型識別的是
/mnt/kaldi-master/egs/thchs30/online_demo/online-data/audio路徑下全部的單音頻文件
識別的結果內容
大概有幾個過程:數據準備,monophone單音素訓練, tri1三因素訓練, trib2進行lda_mllt特徵變換,trib3進行sat天然語言適應,trib4作quick(這個我也不懂),後面就是dnn了
這個腳本的輸入參數有三個:1.data/mfcc/train 2.exp/make_mfcc/train 3.mfcc/train
1.data/mfcc/train中有數據預處理後的一些文件:phone.txt spk2utt text utt2spk wav.scp word.txt
2.exp/make_mfcc/train中應該是要保存程序運行的日誌文件的
3.mfcc/train中是提取出的特徵文件
用的虛擬機,沒有音頻入口
後續補充
後續補充
基於Kaldi+GStreamer搭建線上的實時語音識別器
https://www.jianshu.com/p/ef7326b27786
後續補充
https://blog.csdn.net/DuishengChen/article/details/50085707?locationNum=11&fps=1
後續補充
後續補充
https://blog.csdn.net/u011930705/article/details/85340905
https://blog.csdn.net/monsieurliaxiamen/article/details/79638227
後續補充
https://www.jianshu.com/p/d64e70faaf1d
https://blog.csdn.net/snowdroptulip/article/details/78952428
後續補充
https://blog.csdn.net/cj1989111/article/details/88017908
[root@localhost ~]# find / -name libstdc++.so.6 本地看看是否有此庫
這裏能夠看到,我本地是存在的,應該是調不到的緣由
[root@localhost ~]# vim /etc/ld.so.conf
/usr/lib64/
/usr/local/lib
/usr/local/lib64
/usr/lib
加入依賴庫路徑
從新加載
[root@localhost ~]# ldconfig
若是不行,就用編譯的gcc裏的庫作個軟鏈接
[root@localhost online_demo]# ln -s /mnt/gcc/gcc-5.4.0/gcc-build/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6 /usr/lib64/libstdc++.so.6
[root@localhost online_demo]# ll /usr/lib64/libstdc++.so.6
原文出處:https://www.cnblogs.com/relax-zw/p/11972617.html