音頻工具kaldi部署及模型製做調研學習

 

語音識別簡介

語音識別(speech recognition)技術,也被稱爲自動語音識別(英語:Automatic Speech Recognition, ASR)、計算機語音識別(英語:Computer Speech Recognition)或是語音轉文本識別(英語:Speech To Text, STT),其目標是以計算機自動將人類的語音內容轉換爲相應的文字。html

按照不一樣緯度以下分類:python

  • 按詞彙量(vocabulary)大小分類:
  • 小詞彙量:幾十個詞;
  • 中等詞彙量:幾百個到上千個詞
  • 大詞彙量:幾千到幾萬個
  • 按說話的方式(style)分類:
  • 孤立詞(isolated words)
  • 連續(continously)
  • 按聲學(Acoustic)環境分類:
  • 錄音室
  • 不一樣程度的噪音環境
  • 按說話人(Speaker)分類:
  • 說話人相關(Speaker depender)
  • 說話音素(Phoneme):單詞的發音都是由音素構成,對於英語,經常使用的音素集是 CMU 的 39 個音素構成的音素集。而對於漢語,通常直接用所有聲母和韻母做爲音素集,另外漢語識別還要考慮音調。

The CMU Pronouncing Dictionary.linux

  • 聲學模型 :是將聲學和發音學(phonetics)的知識進行整合,以特徵提取部分生成的特徵做爲輸入,併爲可變長特徵序列生成聲學模型分數。
  • 語言模型 :經過從訓練語料(一般是文本形式)學習詞之間的相互關係,來估計假設詞序列的可能性,又叫語言模型分數。
  • GMM :Gaussian Mixture Model, 高斯混合模型,描述基於傅里葉頻譜語音特徵的統計模型,用於傳統聲學模型的建模中。
  • HMM :Hidden Markov Model, 隱馬爾科夫模型,是一種用來描述含有隱含未知參數的馬爾科夫過程,其難點是從可觀察的參數中肯定該過程的隱含參數。而後利用這些參數來做進一步的分析,例如模式識別。
  • MFCC :Mel-Frequency Cepstral Coefficients, 梅爾頻率倒譜系數,是組成梅爾頻率倒譜的係數。衍生自音訊片斷的倒頻譜(cepstrum)。倒譜與梅爾頻率倒譜的區別在於,梅爾頻率倒譜的頻帶劃分是在梅爾刻度上等距劃分的,它比用於正常的對數倒頻譜中的線性間隔的頻帶更接近人類的聽覺系統。普遍應用於語音識別中。
  • Fbank :Mel Frequency Filter Bank, 梅爾頻率濾波器組。
  • WER :Word Error Rate, 詞錯誤率,是最多見的衡量語音識別系統性能的指標。

GNN-HMM基本原理

 

 

 

一個語音識別系統主要包括信號處理和特徵提取、聲學模型訓練、語言模型訓練以及識別引擎等幾個核心部分,下圖爲語音識別的原理框圖:c++

  • 特徵提取 :語音識別第一步就是特徵提取,去除掉語音信號中對於語音識別無用的冗餘信息(如背景噪音),保留可以反映語音本質特徵的信息(爲後面的聲學模型提取合適的特徵向量),並用必定的形式表示出來;較經常使用的特徵提取算法有 MFCC。
  • 聲學模型訓練 :根據語音庫的特徵參數訓練出聲學模型參數,在識別的時候能夠將待識別的語音的特徵參數同聲學模型進行匹配,從而獲得識別結果。目前主流的語音識別系統多采用 HMM 進行聲學模型建模。
  • 語言模型訓練 :就是用來計算一個句子出現的機率模型,主要用於決定哪一個詞序列的可能性更大。語言模型分爲三個層次:字典知識、語法知識、句法知識。對訓練文本庫進行語法、語義分析,通過基於統計模型訓練獲得語言模型。
  • 語音解碼與搜索算法 :其中解碼器就是針對輸入的語音信號,根據已經訓練好的聲學模型、語言模型以及字典創建一個識別網絡,再根據搜索算法在該網絡中尋找一條最佳路徑,使得可以以最大機率輸出該語音信號的詞串,這樣就肯定這個語音樣本的文字。

DNN-HMM(基於神經網絡)

但隨着神經網絡技術的發展,後面又出現了基於DNN-HMMs的語音識別模型,一句話歸納就是用DNN代替以前的GMMs,有更好的建模能力。算法

主流的DNN模型,包括FFDNN、CDDNN、TDNN、RNN等,以及一些訓練中可使用的trick等。sql

http://www.javashuo.com/article/p-ufywjzhd-nd.htmlshell

本文檔模型訓練方式採用的是GNN-HMMvim

爲何調研kaldi工具網絡

 

 

 

 

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安裝

解壓 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目錄說明

 

 

 

 

  • ./tools目錄下是kaldi依賴的包
  • ./src目錄存放kaldi的源代碼
  • ./egs目錄保存着一些kaldi在公共語音數據集上的訓練步驟(shell腳本)以及測試的結果
    • s5/run.sh包含了在這個數據集上全部的訓練步驟,包括數據預處理、訓練以及測試gmm/dnn/lstm/tdnn等模型、實驗結果統計在內的各類腳本。理論上來講只要相關環境配置正確,運行run.sh就能完成整個訓練步驟。
    • s5/RESULTS裏面保存着最近的實驗結果
    • s5/conf就是一些訓練所要用到的配置文件
    • s5/{local, steps, utils}裏面則是run.sh所要用到的一些腳本文件

在kaldi中,目前針對深度神經網絡提供三種代碼庫。第一個是"nnet1"(位於nnet/和nnetbin/下),最初由Karel Vesely維護;第二個"nnet2"(位於nnet2/和nnet2bin/下)最初由Daniel Povey維護;第三個"nnet3"(位於nnet3/和nnet3bin/下)由Daniel的nnet2轉化而來


 

 

 


驗證基礎demo

[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

生成的音頻

 

 

 

 

製做第一個訓練模型thchs30

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了

 

Run 腳本說明

 

 

 

 

這個腳本的輸入參數有三個: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在線識別方法

用的虛擬機,沒有音頻入口

後續補充

Kaldi封裝實時語音翻譯

後續補充

基於Kaldi+GStreamer搭建線上的實時語音識別器

https://www.jianshu.com/p/ef7326b27786

 

Kaldi結合GPU的模型訓練

後續補充

 

Kaldi結合CNN的模型訓練

https://blog.csdn.net/DuishengChen/article/details/50085707?locationNum=11&fps=1

後續補充

 

Kaldi 聲紋識別ivector模型

後續補充

https://blog.csdn.net/u011930705/article/details/85340905

https://blog.csdn.net/monsieurliaxiamen/article/details/79638227

 

Kaldi中文識別開源模型CVTE

後續補充

https://www.jianshu.com/p/d64e70faaf1d

https://blog.csdn.net/snowdroptulip/article/details/78952428

 

 

Kaldi 訓練喚醒詞模型

後續補充

https://blog.csdn.net/cj1989111/article/details/88017908

FAQ

模型製做報錯:/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found

 

[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

相關文章
相關標籤/搜索