
該存儲庫包含Pytorch-Kaldi工具包(Pytorch-Kaldi-v1.0)的最後版本。要查看以前的版本(Pytorch-Kaldi-v0.1),請單擊此處。
如果您使用此代碼或部分代碼,請引用以下論文:
M. Ravanelli,T。 Parcollet,Y。 Bengio,“ Pytorch-Kaldi語音識別工具包”,Arxiv
@inproceedings{pytorch-kaldi,
title = {The PyTorch-Kaldi Speech Recognition Toolkit},
author = {M. Ravanelli and T. Parcollet and Y. Bengio},
booktitle = {In Proc. of ICASSP},
year = {2019}
}
該工具包在創意共享歸因4.0國際許可下發布。您可以復制,分發,修改代碼,以進行研究,商業和非商業目的。我們只要求引用上面引用的論文。
為了提高語音識別結果的透明度和可複制性,我們為用戶提供了在此存儲庫中發布其Pytorch-Kaldi模型的可能性。為此隨時與我們聯繫(或提取請求)。此外,如果您的論文使用Pytorch-Kaldi,也可以在此存儲庫中進行宣傳。
在Pytorch-Kaldi工具包上查看一個簡短的介紹視頻
我們很高興地宣布,語音腦項目(https://speechbrain.github.io/)現在是公開的!我們強烈鼓勵用戶遷移到語音腦。這是一個更好的項目,已經支持多個語音處理任務,例如語音識別,揚聲器識別,SLU,語音增強,語音分離,多微米光音信號處理等。
目的是開發一個單一,靈活且用戶友好的工具包,可用於輕鬆開發語音識別的最新語音系統(端到端和HMM-DNN),揚聲器識別,語音分離,多微型微音信號處理(EG,束成績),自我監督的學習以及許多其他。
該項目將由Mila領導,並由三星,Nvidia,Dolby贊助。 SpeechBrain還將受益於其他公司的合作和專業知識,例如Facebook/Pytorch,IbMresearch,Fluentai。
我們正在積極尋找合作者。如果您有興趣合作,請隨時通過[email protected]與我們聯繫。
多虧了我們的讚助商,我們也能夠聘請在MILA工作的實習生,從事演講腦項目。理想的候選人是一名具有Pytorch和Speech Technologies經驗的博士生(將您的簡歷發送到[email protected])
言語腦的發展將需要幾個月才能擁有工作存儲庫。同時,我們將繼續為Pytorch-Kaldi項目提供支持。
敬請關注!
Pytorch-Kaldi項目旨在彌合Kaldi和Pytorch工具包之間的差距,試圖繼承Kaldi的效率和Pytorch的靈活性。 Pytorch-Kaldi不僅是這些工具包之間的簡單接口,而且還嵌入了開發現代語音識別器的幾個有用功能。例如,該代碼專門設計用於自然插入用戶定義的聲學模型。作為替代方案,用戶可以利用可以使用直觀配置文件自定義的幾個預知神經網絡。 Pytorch-Kaldi支持多個功能和標籤流以及神經網絡的組合,從而實現了複雜的神經體系結構的使用。該工具包與豐富的文檔一起公開發行,旨在在本地或HPC群集上正常工作。
新版本的Pytorch-Kaldi工具包的某些功能:
export KALDI_ROOT=/home/mirco/kaldi-trunk
PATH=$PATH:$KALDI_ROOT/tools/openfst
PATH=$PATH:$KALDI_ROOT/src/featbin
PATH=$PATH:$KALDI_ROOT/src/gmmbin
PATH=$PATH:$KALDI_ROOT/src/bin
PATH=$PATH:$KALDI_ROOT//src/nnetbin
export PATH
切記使用路徑更改Kaldi_root變量。作為檢查安裝的第一個測試,打開bash殼,鍵入“複製 - 特徵”或“ hmm-info”,並確保不出現錯誤。
如果尚未完成,請安裝Pytorch(http://pytorch.org/)。我們在Pytorch 1.0和Pytorch 0.4上測試了我們的代碼。 Pytorch的較舊版本可能會引起錯誤。要檢查您的安裝,請鍵入“ Python”,然後輸入控制台,鍵入“導入火炬”,並確保不出現錯誤。
我們建議在GPU機器上運行代碼。確保已安裝並正確工作的CUDA庫(https://developer.nvidia.com/cuda-downloads)。我們在CUDA 9.0、9.1和8.0上測試了系統。確保安裝Python(代碼使用Python 2.7和Python 3.7進行了測試)。即使不是強制性的,我們建議使用anaconda(https://anaconda.org/anaconda/python)。
2019年2月19日:更新:
batch_size_train = 128*12 | 64*10 | 32*2
上面的線意味著:做12個具有128個批次的時期,10個帶有64批批次的時代和2個帶有32批批次的時期。類似的形式主義可以用於學習率和輟學計劃。有關更多信息,請參見本節。
2019年2月5日:更新:
下一個版本的註釋:在下一個版本中,我們計劃進一步擴展工具包的功能,並支持更多的模型和功能格式。目的是使我們的工具包適用於其他與語音相關的任務,例如端到端的語音識別,揚聲器識別,關鍵字發現,語音分離,語音活動檢測,語音增強等。
要安裝Pytorch-Kaldi,請執行以下步驟:
git clone https://github.com/mravanelli/pytorch-kaldi
pip install -r requirements.txt
在下文中,我們根據流行的Timit數據集提供了Pytorch-Kaldi工具包的簡短教程。
確保您有timit數據集。如果沒有,可以從LDC網站(https://catalog.ldc.upenn.edu/ldc93s1)下載。
確保Kaldi和Pytorch裝置很好。還要確保您的卡爾迪路徑目前正在工作(您應該按照“先決條件”部分的報導,將kaldi路徑添加到.bashrc中)。例如,鍵入“複製功能”和“ hmm-info”,並確保不出現錯誤。
運行Timit的Kaldi S5基線。此步驟是計算功能和後來用於訓練Pytorch神經網絡的標籤所必需的。我們建議運行完整的Timit S5食譜(包括DNN培訓):
cd kaldi/egs/timit/s5
./run.sh
./local/nnet/run_dnn.sh
這樣可以創建所有必要的文件,並且用戶可以直接將Kaldi獲得的結果與我們的工具包進行比較。
steps/align_fmllr.sh --nj 4 data/dev data/lang exp/tri3 exp/tri3_ali_dev
steps/align_fmllr.sh --nj 4 data/test data/lang exp/tri3 exp/tri3_ali_test
如果您想使用DNN對齊(如建議),請類型:
steps/nnet/align.sh --nj 4 data-fmllr-tri3/train data/lang exp/dnn4_pretrain-dbn_dnn exp/dnn4_pretrain-dbn_dnn_ali
steps/nnet/align.sh --nj 4 data-fmllr-tri3/dev data/lang exp/dnn4_pretrain-dbn_dnn exp/dnn4_pretrain-dbn_dnn_ali_dev
steps/nnet/align.sh --nj 4 data-fmllr-tri3/test data/lang exp/dnn4_pretrain-dbn_dnn exp/dnn4_pretrain-dbn_dnn_ali_test
我們通過非常簡單的MLP網絡啟動本教程,該網絡訓練了MFCC功能。在啟動實驗之前,請查看配置文件CFG/TIMIT_BASELINES/TIMIT_MLP_MFCC_BASIC.CFG 。有關其所有字段的詳細說明,請參見配置文件的描述。
根據您的路徑更改配置文件。尤其:
為了避免錯誤,請確保存在CFG文件中的所有路徑。請避免使用包含bash變量的路徑,因為從字面上讀取路徑並且不會自動擴展(例如,use/home/home/home/kaldi-trunk/egs/timit/s5/exp/exp/dnn4_pretrain-dbn_dnn_ali,而不是$ kaldi_root/egs/egs/s5/s5/s5/pration_
python run_exp.py cfg/TIMIT_baselines/TIMIT_MLP_mfcc_basic.cfg
該腳本啟動了一個完整的ASR實驗,並執行培訓,驗證,前進和解碼步驟。進度條顯示了上述所有階段的演變。腳本run_exp.py逐漸在輸出目錄中創建以下文件:
請注意,您可以隨時停止實驗。如果再次運行腳本,它將自動從正確處理的最後一個塊開始。根據可用的GPU,培訓可能需要幾個小時。還要注意,如果您想更改配置文件的某些參數(例如,n_chunks =,fea_lst =,batch_size_train =,..),則必須指定其他輸出文件夾(output_folder =)。
調試:如果您遇到一些錯誤,我們建議進行以下檢查:
看看標準輸出。
如果沒有幫助,請查看log.log文件。
查看run_nn的函數。到core.py庫。在功能的各個部分中添加一些打印件,以隔離問題並找出問題。
在培訓結束時,將電話錯誤率(Per%)附加到Res.Res文件中。要查看有關解碼結果的更多詳細信息,您可以進入輸出文件夾中的“ decoding_test”,然後查看創建的各種文件。對於此特定示例,我們獲得了以下res.res文件:
ep=000 tr=['TIMIT_tr'] loss=3.398 err=0.721 valid=TIMIT_dev loss=2.268 err=0.591 lr_architecture1=0.080000 time(s)=86
ep=001 tr=['TIMIT_tr'] loss=2.137 err=0.570 valid=TIMIT_dev loss=1.990 err=0.541 lr_architecture1=0.080000 time(s)=87
ep=002 tr=['TIMIT_tr'] loss=1.896 err=0.524 valid=TIMIT_dev loss=1.874 err=0.516 lr_architecture1=0.080000 time(s)=87
ep=003 tr=['TIMIT_tr'] loss=1.751 err=0.494 valid=TIMIT_dev loss=1.819 err=0.504 lr_architecture1=0.080000 time(s)=88
ep=004 tr=['TIMIT_tr'] loss=1.645 err=0.472 valid=TIMIT_dev loss=1.775 err=0.494 lr_architecture1=0.080000 time(s)=89
ep=005 tr=['TIMIT_tr'] loss=1.560 err=0.453 valid=TIMIT_dev loss=1.773 err=0.493 lr_architecture1=0.080000 time(s)=88
.........
ep=020 tr=['TIMIT_tr'] loss=0.968 err=0.304 valid=TIMIT_dev loss=1.648 err=0.446 lr_architecture1=0.002500 time(s)=89
ep=021 tr=['TIMIT_tr'] loss=0.965 err=0.304 valid=TIMIT_dev loss=1.649 err=0.446 lr_architecture1=0.002500 time(s)=90
ep=022 tr=['TIMIT_tr'] loss=0.960 err=0.302 valid=TIMIT_dev loss=1.652 err=0.447 lr_architecture1=0.001250 time(s)=88
ep=023 tr=['TIMIT_tr'] loss=0.959 err=0.301 valid=TIMIT_dev loss=1.651 err=0.446 lr_architecture1=0.000625 time(s)=88
%WER 18.1 | 192 7215 | 84.0 11.9 4.2 2.1 18.1 99.5 | -0.583 | /home/mirco/pytorch-kaldi-new/exp/TIMIT_MLP_basic5/decode_TIMIT_test_out_dnn1/score_6/ctm_39phn.filt.sys
每(%)的成就為18.1%。請注意,由於不同機器上的初始化不同,結果可能會有一些可變性。我們認為,對於不同的初始化種子獲得的性能(即更改配置文件中的現場種子)對於TIMIT至關重要,因為自然性能的可變性可能會完全隱藏實驗證據,這對於TIMIT至關重要。我們注意到TIMIT實驗的標準偏差約為0.2%。
如果要更改功能,則必須首先使用Kaldi工具包計算它們。要計算Fbank功能,您必須打開$ kaldi_root/egs/egs/timit/s5/run.sh並使用以下行進行計算:
feadir=fbank
for x in train dev test; do
steps/make_fbank.sh --cmd "$train_cmd" --nj $feats_nj data/$x exp/make_fbank/$x $feadir
steps/compute_cmvn_stats.sh data/$x exp/make_fbank/$x $feadir
done
然後,使用新功能列表更改上述配置文件。如果您已經運行了完整的timit Kaldi食譜,則可以直接在$ kaldi_root/egs/egs/timit/s5/data-fmllr-tri3中找到FMLLR功能。如果您採用此類功能餵養神經網絡,則由於採用了揚聲器的適應性,因此您應該期望改善性能。
在timit_baseline文件夾中,我們提出了其他可能的timit基線的示例。與上一個示例類似,您可以簡單地輸入以下操作:
python run_exp.py $cfg_file
有一些示例(timit_rnn*,timit_lstm*,timit_gru*,timit_ligru*)和CNN架構(timit_cnn*)。我們還提出了一個更高級的模型(TIMIT_DNN_LIGRU_DNN_MFCC+FBANK+FMLLR.CFG),在該模型中,我們使用了通過MFCC,Fbank和FMLLR功能的串聯餵養的前饋和復發性神經網絡的組合。請注意,後一種配置文件對應於參考文件中描述的最佳體系結構。您可能會從上述配置文件中看到,我們通過包括一些技巧,例如單聲正則化(即,我們共同估算上下文依賴性和與上下文無關的目標)來改善ASR性能。下表報告通過運行後一個系統獲得的結果(平均每%):
| 模型 | MFCC | fbank | fmllr |
|---|---|---|---|
| Kaldi DNN基線 | ------- | ------- | 18.5 |
| MLP | 18.2 | 18.7 | 16.7 |
| RNN | 17.7 | 17.2 | 15.9 |
| Sru | ------- | 16.6 | ------- |
| LSTM | 15.1 | 14.3 | 14.5 |
| gru | 16.0 | 15.2 | 14.9 |
| 李格魯 | 15.5 | 14.9 | 14.2 |
結果表明,由於揚聲器的適應過程,FMLLR具有優於MFCC和FBANKS係數的表現。復發模型的表現大大優於標準MLP ONE,尤其是在使用LSTM,GRU和LI-GRU體系結構時,可以有效解決通過乘法門消失的梯度消失。使用Li-Gru模型[2,3]獲得的最佳結果每= $ 14.2 $% ,該模型基於單個門,因此將計算的33%保存在標準GRU上。
最好的結果是通過結合MFCC,FBANK和FMLLR功能的更複雜的體系結構獲得的(請參閱CFG/TIMI_BASELINES/TIMIT_MFCC_FBCC_FBANK_FMLLR_LIGRRR_LIGRU_BEST.CFG )。據我們所知,後一個系統實現的Per = 13.8%在TIMIT測試集中表現出了最佳的性能。
簡單的複發單元(SRU)是一個有效且高度可行的複發模型。它在ASR上的性能要比標準LSTM,GRU和LI-GRU模型差,但要快得多。 SRU在此處實施,並在以下論文中進行了描述:
T. Lei,Y. Zhang,Si Wang,H。 Dai,Y。 Artzi,“高度可行的複發的簡單複發單元,emnlp 2018。
要使用此模型進行實驗,請使用配置文件CFG/Timit_baselines/Timit_sru_fbank.cfg 。在使用pip install sru安裝模型之前,您應該在Neural_networks.py中刪除“導入SRU”。
您可以直接將您的結果與我們的結果進行比較。在此外部存儲庫中,您可以找到包含生成文件的所有文件夾。
在LibrisPeech數據集上運行Pytorch-Kaldi的步驟與上面報告的timit相似。以下教程基於100h子集,但可以輕鬆地將其擴展到完整的數據集(960h)。
mkdir exp/tri4b/decode_tgsmall_train_clean_100 && cp exp/tri4b/trans.* exp/tri4b/decode_tgsmall_train_clean_100/
. ./cmd.sh ## You'll want to change cmd.sh to something that will work on your system.
. ./path.sh ## Source the tools/utils (import the queue.pl)
gmmdir=exp/tri4b
for chunk in train_clean_100 dev_clean test_clean; do
dir=fmllr/$chunk
steps/nnet/make_fmllr_feats.sh --nj 10 --cmd "$train_cmd"
--transform-dir $gmmdir/decode_tgsmall_$chunk
$dir data/$chunk $gmmdir $dir/log $dir/data || exit 1
compute-cmvn-stats --spk2utt=ark:data/$chunk/spk2utt scp:fmllr/$chunk/feats.scp ark:$dir/data/cmvn_speaker.ark
done
# aligments on dev_clean and test_clean
steps/align_fmllr.sh --nj 30 data/train_clean_100 data/lang exp/tri4b exp/tri4b_ali_clean_100
steps/align_fmllr.sh --nj 10 data/dev_clean data/lang exp/tri4b exp/tri4b_ali_dev_clean_100
steps/align_fmllr.sh --nj 10 data/test_clean data/lang exp/tri4b exp/tri4b_ali_test_clean_100
python run_exp.py cfg/Librispeech_baselines/libri_MLP_fmllr.cfg
如果您想使用複發模型,則可以使用libri_rnn_fmllr.cfg , libri_lstm_fmllr.cfg , libri_gru_fmllr.cfg或libri_ligru_fmllr.cfg 。經常性模型的培訓可能需要幾天(取決於採用的GPU)。下表報告了使用TGSMALL圖獲得的性能:
| 模型 | 百分比 |
|---|---|
| MLP | 9.6 |
| LSTM | 8.6 |
| gru | 8.6 |
| 李格魯 | 8.6 |
這些結果是在不添加晶格回复的情況下獲得的(即僅使用TGSMALL圖)。您可以通過以這種方式添加晶格回复(從Pytorch-Kaldi的Kaldi_decoding_script文件夾中運行)來提高性能:
data_dir=/data/milatmp1/ravanelm/librispeech/s5/data/
dec_dir=/u/ravanelm/pytorch-Kaldi-new/exp/libri_fmllr/decode_test_clean_out_dnn1/
out_dir=/u/ravanelm/pytorch-kaldi-new/exp/libri_fmllr/
steps/lmrescore_const_arpa.sh $data_dir/lang_test_{tgsmall,fglarge}
$data_dir/test_clean $dec_dir $out_dir/decode_test_clean_fglarge || exit 1;
下表報導了使用Rescorking( FGLARGE )獲得的最終結果:
| 模型 | 百分比 |
|---|---|
| MLP | 6.5 |
| LSTM | 6.4 |
| gru | 6.3 |
| 李格魯 | 6.2 |
您可以查看此處獲得的結果。
運行ASR實驗的主要腳本是run_exp.py 。這個Python腳本執行培訓,驗證,向前和解碼步驟。訓練是在幾個時期進行的,這些時期逐漸通過所考慮的神經網絡處理所有訓練材料。每個訓練時期後,都會執行驗證步驟,以監視持有數據上的系統性能。在訓練結束時,前階段是通過計算指定測試數據集的後驗概率來執行的。後驗概率通過其先驗(使用計數文件)標準化並存儲到方舟文件中。然後執行一個解碼步驟,以檢索說話者在測試句子中說出的最後一系列單詞。
run_exp.py腳本將輸入輸入一個全局配置文件(例如, CFG/Timit_mlp_mfcc.cfg ),該文件指定運行完整實驗的所有必要選項。代碼run_exp.py調用另一個函數run_nn (請參閱core.py庫),該功能在每個數據塊上執行培訓,驗證和正向操作。函數run_nn輸入一個特定於塊的配置文件(例如,exp/exp/timit_mlp_mfcc/exp_files/triar_timit_tr+timit_dev_ep000_cfg*),指定所有需要運行單次chunk實驗的參數。 run_nn函數輸出一些信息填充(例如, exp/exp/timit_mlp_mfcc/exp_files/train_timit_tr+timit_dev_ep000_ck00.info ),總結了所處理塊的損失和錯誤。
結果匯總到res.res.res文件中,而錯誤和警告被重定向到log.log文件中。
配置文件有兩種類型(全局和特定於塊的CFG文件)。它們都是INI格式的,並通過Python的Configparser庫進行讀取,處理和修改。全局文件包含幾個部分,這些部分指定了語音識別實驗的所有主要步驟(培訓,驗證,向前和解碼)。配置文件的結構在原型文件中描述(請參閱實例/grounger.proto ),該文件不僅列出了所有必需的部分和字段,而且還指定了每個可能字段的類型。例如, n_ep = int(1,inf)表示字段N_EP (即訓練時期的數量)必須是一個從1到INF的整數。同樣, lr = float(0,inf)表示LR場(即學習率)必須是從0到INF的浮點。任何編寫不符合這些規格的配置文件的嘗試都會引起錯誤。
現在,讓我們嘗試打開一個配置文件(例如, CFG/TIMIT_BASELINES/TIMIT_MLP_MFCC_BASIC.CFG ),讓我們描述主要部分:
[cfg_proto]
cfg_proto = proto/global.proto
cfg_proto_chunk = proto/global_chunk.proto
配置文件的當前版本首先指定[CFG_PROTO]部分中全局和特定於塊的原型文件的路徑。
[exp]
cmd =
run_nn_script = run_nn
out_folder = exp/TIMIT_MLP_basic5
seed = 1234
use_cuda = True
multi_gpu = False
save_gpumem = False
n_epochs_tr = 24
[EXP]部分包含一些重要字段,例如輸出文件夾( OUT_FOLDER )和特定於塊的處理腳本Run_nn的路徑(默認情況下,應在core.py庫中實現此功能)。字段n_epochs_tr指定所選數量的訓練時期。用戶可以啟用有關使用_cuda,multi_gpu和save_gpumem的其他選項。字段CMD可用於附加命令以在HPC群集上運行腳本。
[dataset1]
data_name = TIMIT_tr
fea = fea_name=mfcc
fea_lst=quick_test/data/train/feats_mfcc.scp
fea_opts=apply-cmvn --utt2spk=ark:quick_test/data/train/utt2spk ark:quick_test/mfcc/train_cmvn_speaker.ark ark:- ark:- | add-deltas --delta-order=2 ark:- ark:- |
cw_left=5
cw_right=5
lab = lab_name=lab_cd
lab_folder=quick_test/dnn4_pretrain-dbn_dnn_ali
lab_opts=ali-to-pdf
lab_count_file=auto
lab_data_folder=quick_test/data/train/
lab_graph=quick_test/graph
n_chunks = 5
[dataset2]
data_name = TIMIT_dev
fea = fea_name=mfcc
fea_lst=quick_test/data/dev/feats_mfcc.scp
fea_opts=apply-cmvn --utt2spk=ark:quick_test/data/dev/utt2spk ark:quick_test/mfcc/dev_cmvn_speaker.ark ark:- ark:- | add-deltas --delta-order=2 ark:- ark:- |
cw_left=5
cw_right=5
lab = lab_name=lab_cd
lab_folder=quick_test/dnn4_pretrain-dbn_dnn_ali_dev
lab_opts=ali-to-pdf
lab_count_file=auto
lab_data_folder=quick_test/data/dev/
lab_graph=quick_test/graph
n_chunks = 1
[dataset3]
data_name = TIMIT_test
fea = fea_name=mfcc
fea_lst=quick_test/data/test/feats_mfcc.scp
fea_opts=apply-cmvn --utt2spk=ark:quick_test/data/test/utt2spk ark:quick_test/mfcc/test_cmvn_speaker.ark ark:- ark:- | add-deltas --delta-order=2 ark:- ark:- |
cw_left=5
cw_right=5
lab = lab_name=lab_cd
lab_folder=quick_test/dnn4_pretrain-dbn_dnn_ali_test
lab_opts=ali-to-pdf
lab_count_file=auto
lab_data_folder=quick_test/data/test/
lab_graph=quick_test/graph
n_chunks = 1
配置文件包含許多部分( [DataSet1] , [DataSet2] , [DataSet3] ,...),它們描述了用於ASR實驗的所有語料庫。 [數據集*]部分上的字段描述了實驗中考慮的所有特徵和標籤。 The features, for instance, are specified in the field fea: , where fea_name contains the name given to the feature, fea_lst is the list of features (in the scp Kaldi format), fea_opts allows users to specify how to process the features (eg, doing CMVN or adding the derivatives), while cw_left and cw_right set the characteristics of the context window (ie, number of left and right frames to附加)。請注意,Pytorch-Kaldi工具包的當前版本支持多個功能流的定義。確實,如CFG/Timit_baselines/Timit_mfcc_fbank_fmllr_ligru_best.cfg中所示,採用了多個特徵流(例如,MFCC,FBANK,FMLLR)。
同樣,實驗室部分包含一些子場。例如, lab_name是指標籤的名稱,而lab_folder包含存儲卡爾迪配方生成的對齊的文件夾。 lab_opts允許用戶在所考慮的對齊方式上指定一些選項。例如, lab_opts =“ ali-to-pdf”提取標准上下文依賴的電話狀態標籤,而lab_opts = ali-to-to-toone-per-frame = true可以用來提取單聲目標。 LAB_COUNT_FILE用於指定包含所考慮電話狀態計數的文件。這些計數在前階段很重要,在遠期,神經網絡計算的後驗概率被其先驗分配。 Pytorch-Kaldi允許用戶指定外部計數文件或自動檢索它(使用lab_count_file = auto )。用戶還可以指定LAB_COUNT_FILE =如果不嚴格需要計數文件,例如,當標籤對應於未用於生成前階段中使用的後驗概率的輸出時(請參閱CFG/TIMIT_BASELINES中的單聲目標/TIMIT_BASELINES/TIMIT_MLP_MLP_MFCC.CFG )。 lab_data_folder ,而是對應於Kaldi數據準備過程中創建的數據文件夾。它包含幾個文件,包括最終用於計算最終WER的文本文件。最後一個子場Lab_graph是用於生成標籤的Kaldi圖的路徑。
完整的數據集通常很大,不能適合GPU/RAM內存。因此,應該將其分成幾個部分。 Pytorch-Kaldi會自動將數據集拆分為N_Chunks中指定的塊數量。塊的數量可能取決於特定數據集。通常,我們建議處理大約1或2個小時的語音塊(取決於可用的內存)。
[data_use]
train_with = TIMIT_tr
valid_with = TIMIT_dev
forward_with = TIMIT_test
本節講述瞭如何在run_exp.py腳本中使用列出的部分[數據集*]的數據。第一行意味著我們使用稱為timit_tr的數據進行培訓。請注意,此數據集名稱必須出現在數據集部分之一中,否則Config Parser將引起錯誤。同樣,第二和第三行分別指定用於驗證和正向階段的數據。
[batches]
batch_size_train = 128
max_seq_length_train = 1000
increase_seq_length_train = False
start_seq_len_train = 100
multply_factor_seq_len_train = 2
batch_size_valid = 128
max_seq_length_valid = 1000
batch_size_train用於定義迷你批次中的訓練示例數。字段max_seq_length_train截斷句子的時間比指定值更長。當訓練很長的句子訓練經常性模型時,可能會出現過時的問題。使用此選項,我們允許用戶通過截斷長句子來減輕此類內存問題。此外,通過設置增加_seq_length_train = true ,可以在訓練期間逐步增加最大句子長度。如果啟用了訓練,則從start_seq_len_train中指定的最大句子長度開始(例如, start_seq_len_train = 100 )。每個時期之後,最大句子長度乘以Multply_factor_seq_len_train(例如Multply_factor_seq_len_train = 2 )。我們已經觀察到,這種簡單的策略通常會改善系統性能,因為它鼓勵該模型首先專注於短期依賴性並僅在以後學習長期依賴性。
同樣, batch_size_valid和max_seq_length_valid指定小批次中的示例數,而開發數據集則指定最大長度。
[architecture1]
arch_name = MLP_layers1
arch_proto = proto/MLP.proto
arch_library = neural_networks
arch_class = MLP
arch_pretrain_file = none
arch_freeze = False
arch_seq_model = False
dnn_lay = 1024,1024,1024,1024,N_out_lab_cd
dnn_drop = 0.15,0.15,0.15,0.15,0.0
dnn_use_laynorm_inp = False
dnn_use_batchnorm_inp = False
dnn_use_batchnorm = True,True,True,True,False
dnn_use_laynorm = False,False,False,False,False
dnn_act = relu,relu,relu,relu,softmax
arch_lr = 0.08
arch_halving_factor = 0.5
arch_improvement_threshold = 0.001
arch_opt = sgd
opt_momentum = 0.0
opt_weight_decay = 0.0
opt_dampening = 0.0
opt_nesterov = False
該部分[體系結構*]用於指定ASR實驗中涉及的神經網絡的體系結構。字段Arch_name指定架構的名稱。由於不同的神經網絡可以取決於不同的超參數集,因此用戶必須添加包含超參數列表的原始文件的路徑中的原始文件。例如,標準MLP模型的原型文件包含以下字段:
[proto]
library=path
class=MLP
dnn_lay=str_list
dnn_drop=float_list(0.0,1.0)
dnn_use_laynorm_inp=bool
dnn_use_batchnorm_inp=bool
dnn_use_batchnorm=bool_list
dnn_use_laynorm=bool_list
dnn_act=str_list
與其他原型文件類似,每行定義了具有相關值類型的超參數。原始文件中定義的所有超參數必須出現在相應的[架構*]部分下的全局配置文件中。字段Arch_library指定模型的編碼位置(例如Neural_nets.py ),而Arch_class表示實現體系結構的類名稱(例如,如果我們設置類= MLP,則我們將從Neal_nets.py import MLP進行操作)。
現場Arch_pretrain_file可用於預先培訓神經網絡,並具有先前訓練的體系結構,而如果您想在訓練過程中訓練體系結構的參數,則可以將Arch_freeze設置為false ,並應設置為真實,請在訓練過程中保持參數(即固定,冷凍)。 “ Arch_seq_model”部分指示該體系結構是順序的(例如RNN)還是非序列(例如,饋送前向MLP或CNN)。 Pytorch-Kaldi處理輸入批次的方式在兩種情況下是不同的。對於復發性神經網絡( Arch_seq_model = true ),特徵的序列不是隨機的(以保留序列的元素),而對於feedforward模型( Arch_seq_model = false ),我們隨機化了特徵(這通常有助於提高性能)。在多個體系結構的情況下,如果至少一種使用的架構標記為順序( Arch_seq_model = true ),則使用順序處理。
請注意,以“ Arch_”和“ Opt_”開頭的超參數是強制性的,必須在配置文件中指定的所有體系結構中存在。其他超參數(例如,DNN_*)是特定於所考慮的體系結構(它們取決於用戶實際實現類MLP的),並且可以定義隱藏層,批處理和圖層正常化以及其他參數的數字和類型。其他重要參數與所考慮的體系結構的優化有關。例如, Arch_lr是學習率,而Arch_halving_factor用於實現學習率退火。特別是,當兩個連續時期之間的DEV集的相對性能改進小於Arch_improvement_threshold (例如,Arch_improvement_threshold)中指定的時期時,我們將學習率乘以Arch_halving_factor (例如, Arch_halving_factor = 0.5 )。字段Arch_opt指定優化算法的類型。我們目前支持SGD,Adam和RMSProp。其他參數是特定於考慮的優化算法的(有關所有優化特定特定的超參數的確切含義,請參見Pytorch文檔)。請注意, [Archictecture*]中定義的不同架構可以具有不同的優化超參數,甚至可以使用不同的優化算法。
[model]
model_proto = proto/model.proto
model = out_dnn1=compute(MLP_layers1,mfcc)
loss_final=cost_nll(out_dnn1,lab_cd)
err_final=cost_err(out_dnn1,lab_cd)
本節中指定了所有各種特徵和架構的組合方式,並具有非常簡單和直觀的元語言。字段模型:描述如何將功能和體系結構連接到生成作為輸出一組後驗概率。行OUT_DNN1 = COMPUTE(MLP_LAYERS,MFCC)的意思是“饋送稱為MLP_LAYERS1的體系結構,具有稱為MFCC的功能,並將輸出存儲到可變的OUT_DNN1中”。從神經網絡輸出OUT_DNN1中,使用稱為lab_cd的標籤計算出誤差和損失函數,這些標籤必須先前定義為[數據集*]部分。 ERR_FINAL和LOSS_FINAL字段是定義模型最終輸出的強制性子字段。
在CFG/Timit_baselines/timit_mfcc_fbank_fmllr_ligru_ligru_best.cfg中,報告了一個更複雜的示例(在此處討論只是為了強調工具包的潛力):
[model]
model_proto=proto/model.proto
model:conc1=concatenate(mfcc,fbank)
conc2=concatenate(conc1,fmllr)
out_dnn1=compute(MLP_layers_first,conc2)
out_dnn2=compute(liGRU_layers,out_dnn1)
out_dnn3=compute(MLP_layers_second,out_dnn2)
out_dnn4=compute(MLP_layers_last,out_dnn3)
out_dnn5=compute(MLP_layers_last2,out_dnn3)
loss_mono=cost_nll(out_dnn5,lab_mono)
loss_mono_w=mult_constant(loss_mono,1.0)
loss_cd=cost_nll(out_dnn4,lab_cd)
loss_final=sum(loss_cd,loss_mono_w)
err_final=cost_err(out_dnn4,lab_cd)
在這種情況下,我們首先是連接MFCC,FBANK和FMLLR功能,然後進食MLP。 MLP的輸出被饋入A復發性神經網絡(特別是LI-GRU模型)。然後,我們還有另一個MLP層( MLP_LAYERS_SECOND ),然後有兩個SoftMax分類器(即MLP_LAYERS_LAST , MLP_LAYERS_LAST2 )。第一個估計了標准上下文依賴性狀態,而第二個估計單聲目標。最終成本函數是這兩個預測之間的加權總和。通過這種方式,我們實施了單聲正則化,事實證明這對於提高ASR性能很有用。
完整的模型可以被視為單個大型計算圖,其中[模型]部分中使用的所有基本體系結構均已共同訓練。對於每個迷你批次,輸入特徵將通過完整模型傳播,並且使用指定的標籤計算Cost_final。然後,計算相對於架構的所有可學習參數的成本函數的梯度。然後,將所有架構的所有參數與[Architecture*]部分中指定的算法一起更新。
[forward]
forward_out = out_dnn1
normalize_posteriors = True
normalize_with_counts_from = lab_cd
save_out_file = True
require_decoding = True
前向截面首先定義要向前的輸出(必須將其定義為模型部分)。如果歸一化_posteriors= true ,則這些後驗通過其先驗(使用計數文件)進行標準化。如果save_out_file = true ,則存儲後文件(通常是一個很大的ARK文件),而如果不再需要時刪除此文件,則該文件將被刪除。 require_decoding是一個布爾值,它指定是否需要解碼指定的輸出。字段歸一化_with_counts_from設置,該集合使用以標準化後驗概率。
[decoding]
decoding_script_folder = kaldi_decoding_scripts/
decoding_script = decode_dnn.sh
decoding_proto = proto/decoding.proto
min_active = 200
max_active = 7000
max_mem = 50000000
beam = 13.0
latbeam = 8.0
acwt = 0.2
max_arcs = -1
skip_scoring = false
scoring_script = local/score.sh
scoring_opts = "--min-lmwt 1 --max-lmwt 10"
norm_vars = False
解碼部分報告了有關解碼的參數,即允許一個步驟從DNN提供的上下文依賴性概率的順序傳遞為一系列單詞。字段decoding_script_folder指定存儲解碼腳本的文件夾。解碼腳本字段是用於解碼的腳本(例如Decode_dnn.sh ),該腳本應在以前指定的dexoding_script_folder中。字段解碼_proto報告了所考慮的解碼腳本所需的所有參數。
為了使代碼更靈活,還可以在命令行中指定配置參數。例如,您可以運行:
python run_exp.py quick_test/example_newcode.cfg --optimization,lr=0.01 --batches,batch_size=4
腳本將用指定的LR值替換指定的CFG文件中的學習率。然後將修改的配置文件存儲到out_folder/config.cfg中。
腳本run_exp.py自動創建了特定於塊的配置文件,該文件被Run_NN函數用於執行單個塊培訓。特定於塊的CFG文件的結構與全球文件的結構非常相似。主要區別是字段to_do = {train,有效,向前} ,該字段指定在字段FEA中指定的塊上的處理類型。
為什麼要原始文件?不同的神經網絡,優化算法和HMM解碼器可能取決於不同的超參數。為了解決此問題,我們當前的解決方案基於某些原型文件的定義(用於全局,塊,體系結構配置文件)。通常,這種方法允許對全局配置文件中指定的字段進行更透明的檢查。此外,它允許用戶輕鬆添加新參數,而無需更改Python代碼的任何行。例如,要添加一個用戶定義的模型,必須編寫指定超參數的新的原始文件(例如,用戶model.prot o)。然後,用戶應僅編寫一個實現架構的類(例如,在neural_networks.py中的用戶模型)。
該工具包旨在允許用戶輕鬆插入自己的聲學模型。要添加自定義的神經模型執行以下步驟:
[proto]
dnn_lay=str_list
dnn_drop=float_list(0.0,1.0)
dnn_use_laynorm_inp=bool
dnn_use_batchnorm_inp=bool
dnn_use_batchnorm=bool_list
dnn_use_laynorm=bool_list
dnn_act=str_list
參數dnn_lay必須是字符串, dnn_drop的列表(即,每一層的輟學因子)是0.0和1.0的浮點列表, dnn_use_laynorm_inp和dnn_use_use_use_batchnorm_inp是啟用或disable或disable formation noble formation noble或batch norput或bate normation norput的布爾。 DNN_USE_BATCHNORM和DNN_USE_LAYNORM是一個布爾值列表,如果必須使用批處理/圖層的歸一化,則逐層決定。參數DNN_ACT再次是設置每一層激活函數的字符串列表。由於每個模型都基於其自己的一組超參數,因此不同的模型具有不同的原型文件。例如,您可以查看gru.proto ,並查看超參數列表與標準MLP不同。與以前的示例類似,您應該在此處添加超參數列表並保存文件。
編寫一個實現模型的Pytorch類。打開庫neural_networks.py ,查看一些已經實現的模型。為簡單起見,您可以開始研究MLP類。這些課程有兩種強制性方法:初始化和前進。第一個用於初始化體系結構,第二個指定要執行的計算列表。方法INIT將輸入輸入兩個變量,這些變量自動在RUN_NN函數中自動計算。 INP_DIM只是神經網絡輸入的維度,而選項是一個字典,其中包含配置文件的“部分體系結構”中指定的所有參數。
例如,您可以以這種方式訪問各個層的DNN激活: options['dnn_lay'].split(',') 。從MLP類中可以看到,初始化方法定義並初始化神經網絡的所有參數。正向方法將輸入輸入張量X (即輸入數據),並輸出另一個包含X的向量。如果您的模型是一個序列模型(即,如果在CFG文件中至少有一個具有Arch_seq_model = true的體系結構),則X是帶有(time_steps,batches,n_in)的張量,否則是(批次,n_in)matrix。類向前定義了計算列表,以將輸入張量轉換為相應的輸出張量。該輸出必須具有重複模型的順序格式(time_steps,批次,N_OUT)和用於前饋模型的非序列格式(批處理,N_OUT)。與已經實現的模型類似,用戶應編寫一個新的類(例如MyDNN),該類別實現了自定義模型:
class myDNN(nn.Module):
def __init__(self, options,inp_dim):
super(myDNN, self).__init__()
// initialize the parameters
def forward(self, x):
// do some computations out=f(x)
return out
[architecture1]
arch_name= mynetwork (this is a name you would like to use to refer to this architecture within the following model section)
arch_proto=proto/myDNN.proto (here is the name of the proto file defined before)
arch_library=neural_networks (this is the name of the library where myDNN is implemented)
arch_class=myDNN (This must be the name of the class you have implemented)
arch_pretrain_file=none (With this you can specify if you want to pre-train your model)
arch_freeze=False (set False if you want to update the parameters of your model)
arch_seq_model=False (set False for feed-forward models, True for recurrent models)
然後,您必須為Proto/mydnn.proto中指定的所有超參數指定正確的值。對於MLP.Proto ,我們有:
dnn_lay=1024,1024,1024,1024,1024,N_out_lab_cd
dnn_drop=0.15,0.15,0.15,0.15,0.15,0.0
dnn_use_laynorm_inp=False
dnn_use_batchnorm_inp=False
dnn_use_batchnorm=True,True,True,True,True,False
dnn_use_laynorm=False,False,False,False,False,False
dnn_act=relu,relu,relu,relu,relu,softmax
然後,添加與您自己架構的優化有關的以下參數。您可以在此處使用Standard SDG,ADAM或RMSPROP(請參閱CFG/TIMIT_BASELINES/TIMIT_LSTM_MFCC.CFG有關RMSPROP的示例):
arch_lr=0.08
arch_halving_factor=0.5
arch_improvement_threshold=0.001
arch_opt=sgd
opt_momentum=0.0
opt_weight_decay=0.0
opt_dampening=0.0
opt_nesterov=False
將配置文件保存到CFG文件夾(例如CFG/MyDnn_exp.cfg )中。
運行實驗:
python run_exp.py cfg/myDNN_exp.cfg
在實施新模型時,重要的調試測試包括進行過度擬合實驗(以確保該模型能夠過度擬合微型數據集)。如果該模型無法過度擬合,則意味著要解決一個主要的錯誤。
在深度學習中,通常需要進行超參數調整以尋找適當的神經體系結構。為了幫助調整Pytorch-Kaldi中的超參數,我們實施了一個簡單的實用程序來實現隨機搜索。特別是,腳本tune_hyparameters.py生成一組隨機配置文件,可以以這種方式運行:
python tune_hyperparameters.py cfg/TIMIT_MLP_mfcc.cfg exp/TIMIT_MLP_mfcc_tuning 10 arch_lr=randfloat(0.001,0.01) batch_size_train=randint(32,256) dnn_act=choose_str{relu,relu,relu,relu,softmax|tanh,tanh,tanh,tanh,softmax}
第一個參數是我們要修改的參考CFG文件,而第二個參數是保存隨機配置文件的文件夾。第三個參數是我們要生成的隨機配置文件的編號。然後有我們要更改的所有超參數的列表。例如, Arch_lr = Randfloat(0.001,0.01)將用隨機浮點數替換字段Arch_lr ,範圍從0.001到0.01。 batch_size_train = randint(32,256)將用32和256之間的隨機整數替換batch_size_train等。一旦創建了配置文件,它們就可以順序運行或與:
python run_exp.py $cfg_file
Pytorch-Kaldi可以與任何語音數據集一起使用。要使用自己的數據集,要採取的步驟類似於Timit/Librispeech教程中討論的步驟。通常,您要做的就是以下內容:
python run_exp.py $cfg_file運行配置文件。 當前版本的Pytorch-Kaldi支持Kaldi ARK格式存儲的輸入功能。如果用戶想執行具有自定義功能的實驗,則必須將後者轉換為方舟格式。查看kaldi-io-for-python git存儲庫(https://github.com/vesis84/kaldi-io-for-python),以詳細說明將numpy陣列轉換為ARK文件。此外,您可以查看我們稱為save_raw_fea.py的實用程序。該腳本生成包含原始功能的Kaldi ARK文件,後來用於訓練由原始波形餵養的神經網絡(請參閱有關使用SINCNET處理音頻的部分)。
當前版本的Pytorch-Kaldi支持使用Pytorch-Kaldi預訓練的聲學模型來轉錄本或Multiples .WAV文件的標準生產過程。重要的是要了解您必須擁有訓練有素的Pytorch-Kaldi模型。雖然您不再需要標籤或對齊方式,但Pytorch-Kaldi仍然需要許多文件來轉錄本新的音頻文件:
擁有所有這些文件後,您可以開始將數據集部分添加到全局配置文件中。最簡單的方法是複制用於訓練您的聲學模型的CFG文件,並通過添加新的[數據集]來修改:
[dataset4]
data_name = myWavFile
fea = fea_name=fbank
fea_lst=myWavFilePath/data/feats.scp
fea_opts=apply-cmvn --utt2spk=ark:myWavFilePath/data//utt2spk ark:myWavFilePath/cmvn_test.ark ark:- ark:- | add-deltas --delta-order=0 ark:- ark:- |
cw_left=5
cw_right=5
lab = lab_name=none
lab_data_folder=myWavFilePath/data/
lab_graph=myWavFilePath/exp/tri3/graph
n_chunks=1
[data_use]
train_with = TIMIT_tr
valid_with = TIMIT_dev
forward_with = myWavFile
音頻文件轉錄的鍵字符串是lab_name =無。無標籤要求Pytorch-Kaldi進入生產模式,該模式只能在沒有任何標籤的情況下進行正向傳播和解碼。您不需要timit_tr和timit_dev進入生產服務器,因為Pytorch-Kaldi會跳過此信息,直接轉到forward_with字段中給出的數據集的遠期階段。如您所見,與標準培訓或測試數據集相比,全局FEA字段需要完全相同的參數,而實驗室字段僅需要兩個參數。請注意, lab_data_folder與fea_lst相同。最後,您仍然需要指定要創建的塊數量來處理此文件(1小時= 1個塊)。
警告
在您的標準.cfg中,您可能已經使用了不再使用的關鍵字,例如N_OUT_LAB_CD 。確實,在生產方案中,您不想在計算機上使用培訓數據。因此,您的.cfg文件上的所有變量都必須由其真實值代替。要替換所有n_out_ {mono,lab_cd},您可以查看以下輸出
hmm-info /path/to/the/final.mdl/used/to/generate/the/training/ali
然後,如果您將後者標準化為(在您的.cfg部分中檢查):
normalize_posteriors = True
normalize_with_counts_from = lab_cd
您必須由以下方式替換lab_cd
normalize_posteriors = True
normalize_with_counts_from = /path/to/ali_train_pdf.counts
這個歸一化步驟對於HMM-DNN語音識別至關重要。實際上,DNN提供了後驗概率,而HMM是與可能性合作的生成模型。為了得出所需的可能性,可以簡單地將後代除以先前的概率。要創建此ali_train_pdf.counts文件,您可以以下內容:
alidir=/path/to/the/exp/tri_ali (change it with your path to the exp with the ali)
num_pdf=$(hmm-info $alidir/final.mdl | awk '/pdfs/{print $4}')
labels_tr_pdf="ark:ali-to-pdf $alidir/final.mdl "ark:gunzip -c $alidir/ali.*.gz |" ark:- |"
analyze-counts --verbose=1 --binary=false --counts-dim=$num_pdf "$labels_tr_pdf" ali_train_pdf.counts
etvoilà!在生產方案中,您可能需要轉錄大量音頻文件,並且不想根據需要創建最多的.cfg文件。在此程度上,創建此初始生產.cfg文件(您可以將路徑空白留下)後,您可以調用run_exp.py腳本,其中包含參考您的不同的特定參數。 WAV功能:
python run_exp.py cfg/TIMIT_baselines/TIMIT_MLP_fbank_prod.cfg --dataset4,fea,0,fea_lst="myWavFilePath/data/feats.scp" --dataset4,lab,0,lab_data_folder="myWavFilePath/data/" --dataset4,lab,0,lab_graph="myWavFilePath/exp/tri3/graph/"
此命令將在內部使用您指定的路徑更改配置文件,並運行和定義的功能!請注意,將長參數傳遞到run_exp.py腳本需要特定的符號。 -dataset4指定創建部分的名稱, FEA是高級字段的名稱, FEA_LST或LAB_GRAPH是您要更改最低級別字段的名稱。 0在這裡指示您要更改哪個最低級別字段,實際上某些配置文件可能包含每個數據集的多個LAB_GRAPH !因此, 0表示第一次出現, 1第二個路徑必須被“”封裝為“”,以解釋為完整的字符串!請注意,如果您不需要不同的.wav文件轉錄以相互刪除(解碼文件相應存儲到fielt data_name ),則需要更改data_name和forward_with字段。 --dataset4,data_name=MyNewName --data_use,forward_with=MyNewName 。
為了使用戶更具靈活性,最新版本的Pytorch-Kaldi支持批處理大小,max_seq_length_train,學習率和輟學因子的調度。這意味著現在可以在培訓期間更改這些價值。為了支持此功能,我們在配置文件中實現了以下形式主義:
batch_size_train = 128*12 | 64*10 | 32*2
在這種情況下,對於前12個時期,我們的批次大小為128,在以下10個時期為64,最後兩個時期為32。默認情況下,“*”表示“對於n次”,而“ |”表示。用於指示批處理大小的更改。請注意,如果用戶簡單地設置batch_size_train = 128 ,則默認情況下,在所有訓練時期內,批處理大小都在固定。
類似的形式主義可用於執行學習率調度:
arch_lr = 0.08*10|0.04*5|0.02*3|0.01*2|0.005*2|0.0025*2
在這種情況下,如果用戶簡單地設置arch_lr = 0.08則使用該工具包的上一個版本中使用的新BOB過程將學習率退火。在實踐中,我們從指定的學習率開始,每當驗證數據集上的改進小於字段Arch_improvement_threshold中指定的閾值時,我們將其乘以減半。
同樣,在培訓期間,輟學因子現在可以通過以下形式主義更改:
dnn_drop = 0.15*12|0.20*12,0.15,0.15*10|0.20*14,0.15,0.0
在線路之前,我們可以為不同的層和不同時期設置不同的輟學率。例如,第一個隱藏層在前12個時期的輟學率為0.15,而其他12個時期的輟學率為0.20。第二層的輟學因子在所有訓練中將保持恆定至0.15。所有層都使用相同的形式主義。請注意,“ |”指示同一層中輟學因子的變化,而“”表示不同的層。
您可以在此處查看一個配置文件,其中批處理大小,學習率和輟學因素在此處更改:
cfg/TIMIT_baselines/TIMIT_mfcc_basic_flex.cfg
或這裡:
cfg/TIMIT_baselines/TIMIT_liGRU_fmllr_lr_schedule.cfg
該項目仍處於初始階段,我們邀請所有潛在的貢獻者參加。我們希望建立一個足夠大的開發人員社區,以逐步維護,改善和擴大當前工具包的功能。例如,報告任何錯誤或任何建議以改善當前版本的代碼可能會有所幫助。人們還可以通過添加其他神經模型來做出貢獻,這些神經模型最終可以使當前插入的建築集合變得更加豐富。
看看我們的視頻介紹Sincnet
SINCNET是最近提議處理原始音頻波形的捲積神經網絡。特別是,Sincnet鼓勵第一層通過利用參數化的SINC函數來發現更有意義的過濾器。與學習每個過濾器的所有元素的標準CNN相比,只有從數據中直接學習了帶通濾波器的低截止頻率。這種感應偏置提供了一種非常緊湊的方法來推導定制的濾波器前端,這僅取決於具有明確物理含義的某些參數。
有關SINCNET模型的更詳細說明,請參閱以下論文:
M. Ravanelli,Y。 Bengio,“來自Sincnet的Raw Woveform的說話者識別”,載於Proc。 SLT 2018 ARXIV
M. Ravanelli,Y.Bengio,“與Sincnet的可解釋的捲積過濾器”, nips@irasl 2018 arxiv
使用此模型在TIMIT上進行語音識別,以下步驟:
python ./run_exp.py cfg/TIMIT_baselines/TIMIT_SincNet_raw.cfg
在下表中,我們將SINCNET的結果與其他饋送前傳神經網絡進行了比較:
| 模型 | wer(%) |
|---|---|
| MLP -Fbank | 18.7 |
| MLP -MFCC | 18.2 |
| CNN -RAW | 18.1 |
| sincnet -raw | 17.2 |
在本節中,我們將展示如何使用Pytorch-Kaldi在語音增強和語音識別神經網絡之間共同訓練級聯。語音增強的目的是通過最大程度地減少干淨和嘈雜功能之間的MSE來提高語音信號的質量。然後增強功能為另一個預測與上下文相關的電話狀態的神經網絡提供。
在下文中,我們報告了一個基於回复版的Timit版本的玩具任務示例,僅旨在顯示用戶應如何將配置文件設置為訓練這種神經網絡的組合。即使某些實施詳細信息(以及所採用的數據集)不同,本教程也受到本文的啟發:
運行系統執行以下步驟:
1-確保您擁有標準的干淨版本。
2-運行Timit的Kaldi S5基線。此步驟對於計算乾淨的功能(這將是語音增強系統的標籤)和對齊(這將是語音識別系統的標籤)是必要的。我們建議運行完整的Timit S5食譜(包括DNN培訓)。
3-標準TIMIT食譜使用MFCCS功能。相反,在本教程中,我們使用Fbank功能。計算Fbank功能在$ kaldi_root/egs/timit/s5中運行以下腳本:
feadir=fbank
for x in train dev test; do
steps/make_fbank.sh --cmd "$train_cmd" --nj $feats_nj data/$x exp/make_fbank/$x $feadir
steps/compute_cmvn_stats.sh data/$x exp/make_fbank/$x $feadir
done
請注意,我們在這裡使用40個Fbanks,而Kaldi默認使用23 Fbanks。要計算40維功能,請進入“ $ kaldi_root/egs/timit/conf/fbank.conf”,然後更改所考慮的輸出過濾器的數量。
4-轉到此外部存儲庫,然後按照以下步驟從乾淨的步驟生成圓錐的迴響版本。請注意,這只是一項玩具任務,僅有助於展示如何建立聯合培訓系統。
5-計算TIMIT_REV數據集的FBANK功能。為此,您可以將腳本複制在$ kaldi_root/egs/timit/中,以$ kaldi_root/egs/egs/timit_rev/ 。請,還要復制數據文件夾。請注意,Timit_rev文件夾中的音頻文件使用標準WAV格式保存,而TIMIT則使用Sphere Format釋放。要繞過此問題,請打開文件數據/train/wav.scp,data/dev/wav.scp,data/test/wav.scp並刪除有關球體閱讀的零件(eg,/home/ mirco/kaldi-trunk/tools/sph2pipe_v2.5/sph2pipe -fipe -f wav )。您還必須將路徑從標準圓柱更改為回复的路徑(例如,替換 /timit /with /timit_rev /)。提醒刪除最終管道符號“ |”。保存更改並以這種方式運行Fbank功能的計算:
feadir=fbank
for x in train dev test; do
steps/make_fbank.sh --cmd "$train_cmd" --nj $feats_nj data/$x exp/make_fbank/$x $feadir
steps/compute_cmvn_stats.sh data/$x exp/make_fbank/$x $feadir
done
請記住要更改$ kaldi_root/egs/timit_rev/conf/fbank.conf文件,以計算40個功能,而不是默認配置的23個fbanks。
6-計算功能後,打開以下配置文件:
cfg/TIMIT_baselines/TIMIT_rev/TIMIT_joint_training_liGRU_fbank.cfg
請記住,根據計算機中存儲數據的位置更改路徑。如您所見,我們考慮了兩種類型的功能。 Fbank_Rev功能是從Timit_rev數據集計算的,而Fbank_Clean功能是從標準TIMIT數據集派生的,並用作語音增強神經網絡的目標。正如您在配置文件的[模型]部分中看到的那樣,我們在進行語音增強和語音識別的網絡之間具有級聯。語音識別體系結構共同估計上下文依賴性和單聲靶標(因此使用所謂的單聲正則化)。運行實驗類型以下命令:
python run_exp.py cfg/TIMIT_baselines/TIMIT_rev/TIMIT_joint_training_liGRU_fbank.cfg
7-使用此配置文件的結果,您應該獲得電話錯誤率(PER)= 28.1% 。請注意,圍繞此性能的某些振盪不僅僅是自然,這是由於神經參數的不同初始化。
您可以在這裡仔細研究我們的結果
在本教程中,我們使用Dirha-English數據集執行遙遠的語音識別實驗。 Dirha English數據集是在EC Project Dirha下開發的多微粒語音語料庫。該語料庫由在家庭環境中用32個樣品同步麥克風記錄的真實和模擬序列組成。該數據庫包含不同特徵的信號,在噪聲和混響方面,它適用於各種多微粒信號處理和遙遠的語音識別任務。當前發布的數據集的一部分由6名美國母語者(3名男性,3位女性)發表409個壁街日記句。培訓數據是使用現實的數據污染方法創建的,這是基於污染清潔的語音WSJ-5K句子,該句子具有在目標環境中測得的高質量多微晶脈衝響應。有關此數據集的更多詳細信息,請參閱以下論文:
M. Ravanelli,L。 Cristoforetti,R。 Gretter,M。 Pellin,A。 Sosi,M。 M。 Omologo,“ Dirha-English語料庫和家庭環境中遙遠語音識別的相關任務”
M. Ravanelli,P。 Svaizer,M。 Omologo,“遙遠語音識別的現實多微粒數據模擬”,在Interspeech 2016年會議論文集。
在本教程中,我們使用上述模擬數據進行訓練(使用LA6麥克風),而使用真實記錄(LA6)進行測試。這項任務非常現實,但也非常具有挑戰性。語音信號的特徵是迴響時間約為0.7秒。實際錄音中還存在非平穩的國內噪音(例如真空吸塵器,台階,電話戒指等)。
讓我們從實用教程開始。
1-如果沒有,請從LDC網站下載Dirha數據集。 LDC以少量費用發布了完整數據集。
2-轉到此外部存儲量。如該存儲庫中所述,您必須使用提供的MATLAB腳本生成受污染的WSJ數據集。然後,您可以運行提議的Kaldi基線,以便為我們的Pytorch-Kaldi工具包提供功能和標籤。
3-打開以下配置文件:
cfg/DIRHA_baselines/DIRHA_liGRU_fmllr.cfg
後一種配置文件實現了基於光門的複發單元(LI-GRU)的簡單RNN模型。我們使用FMLLR作為輸入功能。更改路徑並運行以下命令:
python run_exp.py cfg/DIRHA_baselines/DIRHA_liGRU_fmllr.cfg
4-結果:上述系統應提供單詞錯誤率(wer%)= 23.2% 。您可以在這裡找到我們獲得的結果。
使用CFG/DIRHA_BASELINES文件夾中的其他配置文件,您可以使用不同的設置執行實驗。使用提供的配置文件,您可以獲得以下結果:
| 模型 | wer(%) |
|---|---|
| MLP | 26.1 |
| gru | 25.3 |
| 李格魯 | 23.8 |
當前版本的存儲庫主要是為語音識別實驗設計的。我們正在積極地工作新版本,該版本更加靈活,並且可以管理與Kaldi功能/標籤不同的輸入/輸出。但是,即使使用當前版本,也可以實現其他系統,例如自動編碼器。
自動編碼器是一個神經網絡,其輸入和輸出相同。中層通常包含瓶頸,迫使我們的表示可以壓縮輸入信息。在本教程中,我們提供了一個基於Timit數據集的玩具示例。例如,請參閱以下配置文件:
cfg/TIMIT_baselines/TIMIT_MLP_fbank_autoencoder.cfg
我們的輸入是使用11幀的上下文窗口收集的標準40維Fbank係數(即,輸入的總維度為440)。饋送前向神經網絡(稱為MLP_ENCODER)將我們的功能編碼為100維表示。解碼器(稱為MLP_DECODER)由學習的表示形式餵食,並試圖重建輸出。該系統經過平均誤差(MSE)度量訓練。請注意,在[模型]部分中,我們在最後添加了此行“ err_final = cost_err(dec_out,lab_cd)”。實際上,默認情況下,該模型的當前版本至少需要指定一個標籤(我們將在下一個版本中刪除此限制)。
您可以訓練運行以下命令的系統:
python run_exp.py cfg/TIMIT_baselines/TIMIT_MLP_fbank_autoencoder.cfg
結果應該看起來像這樣:
ep=000 tr=['TIMIT_tr'] loss=0.139 err=0.999 valid=TIMIT_dev loss=0.076 err=1.000 lr_architecture1=0.080000 lr_architecture2=0.080000 time(s)=41
ep=001 tr=['TIMIT_tr'] loss=0.098 err=0.999 valid=TIMIT_dev loss=0.062 err=1.000 lr_architecture1=0.080000 lr_architecture2=0.080000 time(s)=39
ep=002 tr=['TIMIT_tr'] loss=0.091 err=0.999 valid=TIMIT_dev loss=0.058 err=1.000 lr_architecture1=0.040000 lr_architecture2=0.040000 time(s)=39
ep=003 tr=['TIMIT_tr'] loss=0.088 err=0.999 valid=TIMIT_dev loss=0.056 err=1.000 lr_architecture1=0.020000 lr_architecture2=0.020000 time(s)=38
ep=004 tr=['TIMIT_tr'] loss=0.087 err=0.999 valid=TIMIT_dev loss=0.055 err=0.999 lr_architecture1=0.010000 lr_architecture2=0.010000 time(s)=39
ep=005 tr=['TIMIT_tr'] loss=0.086 err=0.999 valid=TIMIT_dev loss=0.054 err=1.000 lr_architecture1=0.005000 lr_architecture2=0.005000 time(s)=39
ep=006 tr=['TIMIT_tr'] loss=0.086 err=0.999 valid=TIMIT_dev loss=0.054 err=1.000 lr_architecture1=0.002500 lr_architecture2=0.002500 time(s)=39
ep=007 tr=['TIMIT_tr'] loss=0.086 err=0.999 valid=TIMIT_dev loss=0.054 err=1.000 lr_architecture1=0.001250 lr_architecture2=0.001250 time(s)=39
ep=008 tr=['TIMIT_tr'] loss=0.086 err=0.999 valid=TIMIT_dev loss=0.054 err=0.999 lr_architecture1=0.000625 lr_architecture2=0.000625 time(s)=41
ep=009 tr=['TIMIT_tr'] loss=0.086 err=0.999 valid=TIMIT_dev loss=0.054 err=0.999 lr_architecture1=0.000313 lr_architecture2=0.000313 time(s)=38
您應該只考慮“損失=”字段。在這種情況下,提交的“ err =”僅包含不使用信息(出於上述原因)。您可以查看鍵入以下命令的生成功能:
copy-feats ark:exp/TIMIT_MLP_fbank_autoencoder/exp_files/forward_TIMIT_test_ep009_ck00_enc_out.ark ark,t:- | more
[1] M. Ravanelli,T。 Parcollet,Y。 Bengio,“ Pytorch-Kaldi語音識別工具包”,Arxiv
[2] M. Ravanelli,P。 Brakel,M。 Omologo,Y。 Bengio,“通過修訂封閉式複發單元改善語音識別”,在Interspeech 2017年會議論文集。 ARXIV
[3] M. Ravanelli,P。 Brakel,M。 Omologo,Y。 Bengio,“言語識別的光門復發單位”,在IEEE關於計算智能中新興主題的交易中。 arxiv
[4] M. Ravanelli,“深入學習遙遠的語音識別”,博士學位論文,Unitn2017。 Arxiv
[5] T. Parcollet,M。 Ravanelli,M。 Morchid,G。 Linarès,C。 Trabelsi,R。 DeMori,Y。 Bengio,“ Quaternion Recurrent Neural Networks”,在ICLR 2019 ARXIV會議上
[6] T. Parcollet,M。 Morchid,G。 Linarès,R。 DeMori,“雙向四個季度長期記憶記憶復發語音識別的神經網絡”