从说话人识别demo开始学习kaldi--(8)小结

完整步骤在这里:
https://github.com/kaldi-asr/kaldi/blob/master/egs/aishell/v1/run.sh

现在来小小的总结一下:

# 下面这步就是下载并解压文件,一般数据集最好提前准备好
local/download_and_untar.sh $data $data_url data_aishell
local/download_and_untar.sh $data $data_url resource_aishell

#下面这步主要在当前目录下新建了data文件夹,下面有local,train,test三个子文件夹,
#local下面又有train,dev,test三个子文件夹
#data/train, data/test下面分别都有自己的spk2utt utt2spk wav.scp text
#有些数据集的翻译并不是100%,也就是说,不是所有的wav文件都有对应的text文件,
#对于语音识别任务,就要先做一些筛选
#但是对于文本独立的声纹识别,text文件可以完全不要
local/aishell_data_prep.sh $data/data_aishell/wav $data/data_aishell/transcript

#下面这步就是提取MFCC,之后再进行vad
#主要用的是data/train, data/test下面的wav.scp文件
#保存在exp/make_mfcc文件夹下面的都是log文件,没啥用
# mfcc文件夹下面的才是每个wav文件的mfcc数据和vad数据
#data/train下面生成的feats.scp和vad.scp就是告诉你train集中
#每个音频的mfcc特征和vad特征都保存在mfcc文件夹下面的哪个文件的哪一部分
#同理,data/test下面的feats.scp和vad.scp也是同样的作用
#为啥train集和test集提取的mfcc和vad要保存在一起,分开保存不省事么?
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

# 下面 train diag ubm(这步要得到一个对角的混合高斯模型,Mixed Gaussian model)
#最后生成的是exp/diag_ubm_1024/final.dubm
sid/train_diag_ubm.sh --nj 10 --cmd "$train_cmd" --num-threads 16 \
  data/train 1024 exp/diag_ubm_1024

#下面 train full ubm(这步要得到一个得到一个full-ubm)
#最后生成的是exp/full_ubm_1024/final.ubm
sid/train_full_ubm.sh --nj 10 --cmd "$train_cmd" data/train \
  exp/diag_ubm_1024 exp/full_ubm_1024

#下面train ivector extractor(M = m + T*w),就是训练得到T矩阵
#生成的文件是exp/extractor_1024/final.ie,也就是T矩阵
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(这步得到train集中每句话的ivector,
#再得到代表每个人的ivector,M是在这一步得到的吧?)
#生成的文件主要是:ivector.scp,num_utts.ark,spk_ivector.scp,还有log文件
#train集中每句话的ivector和每个spk的ivector应该是给下面训练plda model用的吧?
sid/extract_ivectors.sh --cmd "$train_cmd" --nj 10 \
  exp/extractor_1024 data/train exp/ivector_train_1024

#下面 train plda(X = miu + F*h + epsilong,这步得到PLDA model)
# 这步生成的文件plda中存放着上面公式中的三部分,miu,F矩阵,和epsilong
# 对于每一条测试语音X,都能生成一个h
# 对于每一个spk的X,都能生成一个spk的h,
# 代表测试语音的X和代表spk的X应该都是用ivector表示吧
# 打分阶段,应该是先计算上面两个h的似然度,然后相减,就得到得分了
# 是这样的么?
$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

#下面 split the test to enroll and eval(这一步主要是整合文件生成真实值,
#生成的文件是aishell_speaker_ver.lst)
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


#下面这一步,对注册语句和测试语句分别提取ivector
#生成的文件主要是:ivector.scp,num_utts.ark,spk_ivector.scp
#对于注册语音的每个spk,这里重新生成了spk的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(这步计算plda的得分,生成的文件是trials_out)
$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

#下面这步需要整合两个文件aishell_speaker_ver.lst和trials_out才能计算eer
#compute eer
awk '{print $3}' exp/trials_out | paste - $trials | awk '{print $1, $4}' | compute-eer -

# Result
# Scoring against data/test/aishell_speaker_ver.lst
# Equal error rate is 0.140528%, at threshold -12.018

exit 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值