美文网首页
【kaldi学习.4】Aishell V1(说话人识别、声纹识别

【kaldi学习.4】Aishell V1(说话人识别、声纹识别

作者: Colleen_oh | 来源:发表于2019-05-24 11:39 被阅读0次

    下面打算用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%。

    流程图

    有位大神yutouwd绘画了一个流程图,原文:https://yutouwd.github.io/posts/364e185b/

    流程图

    参考:
    https://blog.csdn.net/eqiang8848/article/details/81543599
    https://yutouwd.github.io/posts/364e185b/

    相关文章

      网友评论

          本文标题:【kaldi学习.4】Aishell V1(说话人识别、声纹识别

          本文链接:https://www.haomeiwen.com/subject/xmnwzqtx.html