天天看點

python聲紋識别_【kaldi學習.4】Aishell V1(說話人識别、聲紋識别)中的run.sh詳解...

下面打算用aishell來做聲紋識别,在做聲紋識别之前,肯定是要對run.sh這個檔案做個深入的了解,才可以繼續往下走,接下來會記錄如何修改run.sh去運作自己的資料,而不是手動輸入自己的資料。。。。因為自己的資料很多,手動是肯定沒辦法實作的了。

小白一枚,望指正。

做聲紋識别 就要選擇aishell/V1,這裡是kaldi的github位址:https://github.com/kaldi-asr/kaldi

下載下傳壓縮資料

data=/export/a05/xna/data

data_url=www.openslr.org/resources/33

. ./cmd.sh

. ./path.sh

set -e # exit on error

local/download_and_untar.sh $data $data_url data_aishell

local/download_and_untar.sh $data $data_url resource_aishell

資料準備

local/aishell_data_prep.sh $data/data_aishell/wav $data/data_aishell/transcript

這裡主要用到data_aishell資料,resource_aishell那裡沒有怎麼用到,代碼在local/aishell_data_prep.sh,其中資料集有train(340人)、dev(40人)(好像沒用到)、test(20人)三個檔案夾,在aishell_data_prep.sh代碼中,也替我們準備了必要的資料(utt2spk、wav.scp、text),這樣就不需要我們自己手動輸入了。

提取MFCC特征

# Now make MFCC features.

# mfccdir should be some place with a largish disk where you

# want to store MFCC features.

mfccdir=mfcc

for x in train test; do

steps/make_mfcc.sh --cmd "$train_cmd" --nj 10 data/$x exp/make_mfcc/$x $mfccdir

sid/compute_vad_decision.sh --nj 10 --cmd "$train_cmd" data/$x exp/make_mfcc/$x $mfccdir

utils/fix_data_dir.sh data/$x

done

提取MFCC這一步主要有兩小個步驟,第一個是用steps/make_mfcc.sh來提取MFCC特征,第二步是通過sid/compute_vad_decision.sh來計算基于energy的VAD output,就是計算倒譜均值和方差歸一化。

然後回生成兩個檔案夾,mfcc 和 exp/make_mfcc,其中 mfcc 裡主要儲存了提取的特征,而 exp/make_mfcc 裡儲存了日志,即log 檔案。

訓練UBM

# train diag ubm

sid/train_diag_ubm.sh --nj 10 --cmd "$train_cmd" --num-threads 16 \

data/train 1024 exp/diag_ubm_1024

#train full ubm

sid/train_full_ubm.sh --nj 10 --cmd "$train_cmd" data/train \

exp/diag_ubm_1024 exp/full_ubm_1024

在sid/train_diag_ubm.sh中,有一段小講解:這是steps / train_diag_ubm.sh的修改版本,專門用于說話人識别,不需要從訓練有素的模型開始,适用滑動視窗CMVN,它需要資料目錄中的語音活動檢測(vad.scp)。我們使用gmm-global-init-from-feats初始化GMM,它設定随機資料點的均值,然後在記憶體中進行一些EM疊代。在記憶體初始化之後,我們并行訓練幾次疊代。

在sid/train_full_ubm.sh,也有一段小講解:這将從現有(對角線或完整)UBM訓練完全協方差UBM,持續指定的疊代次數。這是針對speaker-id系統的(我們使用專門針對它的功能和vad)。

看完這兩段話後,基本可以了解其用意,用先訓練的diag_ubm來訓練完整的UBM。

訓練和提取ivector

#train ivector

sid/train_ivector_extractor.sh --cmd "$train_cmd --mem 10G" \

--num-iters 5 exp/full_ubm_1024/final.ubm data/train \

exp/extractor_1024

#extract ivector

sid/extract_ivectors.sh --cmd "$train_cmd" --nj 10 \

exp/extractor_1024 data/train exp/ivector_train_102

在exp/extractor_1024可以看到提取的ivector。

訓練plda模型

#train plda

$train_cmd exp/ivector_train_1024/log/plda.log \

ivector-compute-plda ark:data/train/spk2utt \

'ark:ivector-normalize-length scp:exp/ivector_train_1024/ivector.scp ark:- |' \

exp/ivector_train_1024/plda

用訓練集的 ivector 來訓練 plda 模型用于打分,可以從exp/ivector_train_1024/plda中檢視plda的分數。

劃分訓練集(test)為enroll和eval

#split the test to enroll and eval

mkdir -p data/test/enroll data/test/eval

cp data/test/{spk2utt,feats.scp,vad.scp} data/test/enroll

cp data/test/{spk2utt,feats.scp,vad.scp} data/test/eval

local/split_data_enroll_eval.py data/test/utt2spk data/test/enroll/utt2spk data/test/eval/utt2spk

trials=data/test/aishell_speaker_ver.lst

local/produce_trials.py data/test/eval/utt2spk $trials

utils/fix_data_dir.sh data/test/enroll

utils/fix_data_dir.sh data/test/eval

通過local/split_data_enroll_eval.py腳本來完成劃分,劃分後,就會通過local/produce_trials.py來計算trials,trials 是指需要進行打分的注冊說話人和不同的語音的一個清單,格式如下:

提取enroll和eval的ivector并計算結果

#extract enroll ivector

sid/extract_ivectors.sh --cmd "$train_cmd" --nj 10 \

exp/extractor_1024 data/test/enroll exp/ivector_enroll_1024

#extract eval ivector

sid/extract_ivectors.sh --cmd "$train_cmd" --nj 10 \

exp/extractor_1024 data/test/eval exp/ivector_eval_1024

#compute plda score

$train_cmd exp/ivector_eval_1024/log/plda_score.log \

ivector-plda-scoring --num-utts=ark:exp/ivector_enroll_1024/num_utts.ark \

exp/ivector_train_1024/plda \

ark:exp/ivector_enroll_1024/spk_ivector.ark \

"ark:ivector-normalize-length scp:exp/ivector_eval_1024/ivector.scp ark:- |" \

"cat '$trials' | awk '{print \\\$2, \\\$1}' |" exp/trials_out

#compute eer

awk '{print $3}' exp/trials_out | paste - $trials | awk '{print $1, $4}' | compute-eer -

在将測試集分成注冊集和評估集之後,就開始分别提取注冊集和評估集的 ivector,然後按照生成的 trials 打分,最終打分結果輸出在exp/trials_outt 中, 最終跑出來的結果為 eer 為 0.183%。

流程圖

流程圖