Kaldi入門教程 aishell腳本

Kaldi入門教程 aishell腳本

準備詞典

用aishell爲例子,首先運行aishell_prepare_dict.sh對lexicon.txt進行處理準備詞典,會輸出extra_questions.txt,nonsilence_phoes.txt,optional_silence.txt,silence_phones.txt。
這裏用到了awk,什麼是awk呢?awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤爲強大。簡單來說awk就是把文件逐行的讀入,以空格爲默認分隔符將每行切片,切開的部分再進行各種分析處理。
使用方法:

awk '{pattern+action}' {filenames}

pattern表示awk在數據中查找的內容,而action是在找到匹配內容

awk '{for(n=2;n<=NF;n++){phone[$n]=1;}} END{for (p in phones) print p}'

這裏是將lexicon除第一行之外的字符串提取出來

準備數據,分爲test、dev、train集

local/aishell_data_prep.sh $data/data_aishell/wav $data/data_aishell/transcript || exit 1;

使用aishell_data_prep.sh將數據分成test、dev、train集

詞典、語言文件準備,生成對應的數據關係

Phone Sets, questions, L compilation
utils/prepare_lang.sh --position-dependent-phones false data/local/dict \
    "<SPOKEN_NOISE>" data/local/lang data/lang || exit 1;

其中,數據關係保存在/data/dev裏,文件解釋如下:
spk2gender包含說話人的性別信息
spk2utt包含說話人編號和說話人編號的語音信息
text包含語音編號和語音文本之間的關係
utt2spk語音編號和說話人編號之間的關係
wav.scp包含了原始語音的路徑信息
wav.scp中第一列爲錄音編號,第二列爲音頻文件路徑

BAC009S0002W0122 /home/train/S0002/BAC009S0002W0122.wav

utt2spk中第一列爲錄音編號,第二列爲講話者id

BAC009S0002W0122 S0002

spk2utt中第一列爲講話着,後面跟着他所說的話 …

S0002 BAC009S0002W0122 BAC009S0002W0123 BAC009S0002W0124 BAC009S0002W0125 BAC009S0002W0126

txt中第一列爲錄音編號,第二列爲講話內容,後面我們在研究這些是怎麼生成的。

BAC009S0002W0122 而 對 樓市 成交 抑制 作用 最 大 的 限 購

訓練語言模型

使用text和lexicon.txt作爲輸入,語言模型參數3gram-mincount/lm_unpruned.gz,得到語言模型
語言模型的目的就是根據聲學模型輸出的結果,給出概率最大的文字序列!
https://blog.csdn.net/nsh119/article/details/80193925

使用語言模型生成有限狀態機

使用format_lm.sh將語言模型轉化爲狀態機,並進行一定的format

MFCC特徵提取

# Now make MFCC plus pitch features.
# mfccdir should be some place with a largish disk where you
# want to store MFCC features.
mfccdir=mfcc
for x in train dev test; do
  steps/make_mfcc_pitch.sh --cmd "$train_cmd" --nj 10 data/$x exp/make_mfcc/$x $mfccdir || exit 1;
  steps/compute_cmvn_stats.sh data/$x exp/make_mfcc/$x $mfccdir || exit 1;
  utils/fix_data_dir.sh data/$x || exit 1;
done

make_mfcc_pitch.sh將語音信號轉化爲mfcc域後提取特徵,輸入爲train dev test中的語音文件,輸出爲raw_mfcc_pitch_XXX.X.ark和raw_mfcc_pitch_XXX.X.scp,以及
文件feats.scp:第一列爲錄音編號,第二列爲ark文件路徑

BAC009S0002W0122 /aishell/s5/mfcc/raw_mfcc_pitch_train.1.ark:17
BAC009S0002W0123 /aishell/s5/mfcc/raw_mfcc_pitch_train.1.ark:9751

文件wav.scp:第一列爲錄音編號,第二列爲音頻文件路徑

BAC009S0002W0122 aishell1/wav/train/S0002/BAC009S0002W0122.wav
BAC009S0002W0123 aishell1/wav/train/S0002/BAC009S0002W0123.wav

腳本中可以選擇是否使用VTLN(特徵級聲道長度標準化):
特徵級聲道長度標準化(歸一化):計算-mfcc-feat和計算-plp-feat程序接受VTLN 扭曲因子選項
由於我們沒有放spk2warp,utt2warp文件,所以這僅用於初始化線性版本的VTLN的線性變換。VTLN的作用是移動三角形頻率箱的中心頻率的位置。VTLN通過移動三角頻率區的中心頻率的位置來起作用。 移動頻率區間的翹曲函數是頻率空間中的分段線性函數。

在make_mfcc_pitch.sh中最重要的兩個命令是cumpute-mfcc-feats 和copy-feats,其在src中編譯好的,前者的作用是提取特徵併產生log日誌文件。後者的作用是生成特徵的存儲文件,raw_mfcc_pitch_XXX.X.ark和raw_mfcc_pitch_XXX.X.scp。
MFCC特徵的計算是在對象MFCC中的compute方法完成的,計算過程如下:
1.遍歷每一幀(通常25ms一幀,10ms滑動)
2.對每一幀
a.提取數據,添加可選擾動,預加重和去直流,加窗
b.計算該點的能量(使用對數能量,而非C0)
c.做FFT並計算功率譜
d.計算每個梅爾頻點的能量,共計23個重疊的三角頻點,中心頻率根據梅爾頻域均勻分佈。
e.計算對數能量,做離散餘弦變換,保留指定的係數個數
f.倒譜系數加權,確保係數處於合理的範圍。

compute_cmvn_stats.sh計算倒譜均值和方差歸一化,輸入仍然爲train dev test,輸出爲cmvn_XXX.ark和cmvn_XXX.scp,scp文件中是語音段和特徵對應,ark中保存特徵
倒譜均值和方差歸一化通常是爲了獲得基於說話人或者基於說話語句的零均值,單位方差歸一化特徵倒譜。但是並不推薦使用這個方法,而是使用基於模型的均值和方差歸一化,如Linear VTLN(LVTLN)。可以使用基於音素的小語言模型進行快速歸一化。
均值方差可以以一段語音爲單位計算,但更好的是在一個較大的數據及上進行計算,這樣識別效果會更加robustness。Kaldi中計算均值和方差的代碼在compute-cmvn-stats.cc, 歸一化在apply-cmvn.cc。

單音素訓練

steps/train_mono.sh --cmd "$train_cmd" --nj 10 \
    data/train data/lang exp/mono || exit 1;    

使用train_mono.sh腳本,輸入爲train的data和字典lang,
輸出爲exp/mono,裏面以.mdl結尾的文件保存了模型的參數。使用下面的命令可以查看模型的內容。

$ gmm-copy --binary=false exp/mono/0.mdl - | less

初始化單音素模型。調用gmm-init-mono,生成0.mdl、tree。
編譯訓練時的圖。調用compile-train-graph生成text中每句抄本對應的fst,存放在fsts.JOB.gz中。
第一次對齊數據。調用align-equal-stats-ali生成對齊狀態序列,通過管道傳遞給gmm-acc-stats-ali,得到更新參數時用到的統計量。
第一次更新模型參數。調用gmm-est更新模型參數。
進入訓練模型的主循環:在指定的對齊輪數,使用gmm-align-compiled對齊特徵數據,得到新的對齊狀態序列;每一輪都調用gmm-acc-stats-ali計算更新模型參數所用到的統計量,然後調用gmm-est更新模型參數,並且在每一輪中增加GMM的分量個數。

參考鏈接:
fengzhou_.
開拓
單音素

構建單音素解碼圖:

# Monophone decoding
utils/mkgraph.sh data/lang_test exp/mono exp/mono/graph || exit 1;

mkgraph.sh主要生成了HCLG.fst和words.txt這兩個重要的文件,後續識別主要利用了三個文件,分別是final.mdl、HCLG.fst、words.txt。
words.tx:第一列是詞,第二列是從1開始的編號,類似於一個字典

<eps> 0
21三體綜合症 1
<SPOKEN_NOISE> 2
B 3
SIL 4
○ 5

解碼:分別針對開發集和測試集解碼

steps/decode.sh --cmd "$decode_cmd" --config conf/decode.config --nj 10 \
  exp/mono/graph data/dev exp/mono/decode_dev
steps/decode.sh --cmd "$decode_cmd" --config conf/decode.config --nj 10 \
  exp/mono/graph data/test exp/mono/decode_test

解碼的日誌會保存在 exp/mono/decode_dev/log 和 exp/mono/decode_test/log 裏。

Veterbi 對齊

# Get alignments from monophone system.
steps/align_si.sh --cmd "$train_cmd" --nj 10 \
  data/train data/lang exp/mono exp/mono_ali || exit 1;

其他模型的訓練解碼

之後就是和訓練單音素一樣,進行其他模型的訓練解碼,生成聲學模型和語言模型,保存在/exp中。
1.train_mono.sh 用來訓練單音子隱馬爾科夫模型,一共進行40次迭代,每兩次迭代進行一次對齊操作
2.train_deltas.sh 用來訓練與上下文相關的三音子模型
3.train_lda_mllt.sh 用來進行線性判別分析和最大似然線性轉換
4.train_sat.sh 用來訓練發音人自適應,基於特徵空間最大似然線性迴歸
5.nnet3/run_dnn.sh 用nnet3來訓練DNN,包括xent和MPE
6.用chain訓練DNN

查看結果:

輸入下面的命令來查看結果

# getting results (see RESULTS file)
for x in exp/*/decode_test; do [ -d $x ] && grep WER $x/cer_* | utils/best_wer.sh; done 2>/dev/null

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章