Kaldi中的plda的训练以及computer-socre

本文探讨了Kaldi中PLDA(Probabilistic Linear Discriminant Analysis)模型的训练过程,从i-vector提取到计算得分,解释了如何通过PLDA进行说话人识别。介绍了ivector-mean.cc中的均值计算,以及ivector-compute-plda.cc和ivector-plda-scoring.cc中的关键步骤,包括LLR(Log-Likelihood Ratio)计算。同时,分享了一个使用Python实现的PLDA得分计算示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近一直有个疑惑,plda是怎么训练的?就是plda是怎么计算得分的? 又是怎么根据得分进行判断说话人的? EER跟准确率之间又是什么关系?
时间很紧,论文还没写,需要静一静,好好弄明白这个来清醒一下。
提取完i-vector之后,计算出每一句话的ivector特征,然后计算了sre

ivector-mean scp:exp/ivectors_sre/ivector.scp exp/ivectors_sre/mean.vec

下面看ivector-mean.cc里边进行了什么操作:
就是把sre中所有的i-vector全都加起来并且总的utt number. 然后得到一个sre集合的均值向量,训练PLDA模型公式中中u.

// If 2 arguments are given, computes the mean of all input files and writes out the mean vector.
if (po.NumArgs() == 2) {
      // Compute the mean of the input vectors and write it out.
      std::string ivector_rspecifier = po.GetArg(1),
          mean_wxfilename = po.GetArg(2);
      int32 num_done = 0;
      SequentialBaseFloatVectorReader ivector_reader(ivector_rspecifier);
      Vector<double> sum;
      for (; !ivector_reader.Done(); ivector_reader.Next()) {
        if (sum.Dim() == 0) sum.Resize(ivector_reader.Value().Dim());
        sum.AddVec(1.0, ivector_reader.Value());
        num_done++;
      }
      if (num_done == 0) {
        KALDI_ERR << "No iVectors read";
      } else {
        sum.Scale(1.0 / num_done);
        WriteKaldiObject(sum, mean_wxfilename, binary_write);
        return 0;
      }
    } 

下面就是plda-scoring.sh的脚本,输入了8个参数,最后得到的得分文件 plda_scores.

local/plda_scoring.sh $tandem_feats_dir/sre $tandem_feats_dir/train $tandem_feats_dir/test \
     exp/ivectors_sre exp/ivectors_train exp/ivectors_test $trials exp/scores_gmm_512_ind_pooled

vim local/plda_scoring.sh

#各个参数看上面的脚本,8个参数
plda_data_dir=$1  
enroll_data_dir=$2
test_data_dir=$3
plda_ivec_dir=$4
enroll_ivec_dir=$5
test_ivec_dir=$6
trials=$7
scores_dir=$8
#由i-vector特征来训练一个plda模型,plda模型也是由sre集合训练的,所以这里传的参数都是sre的。
ivector-compute-plda ark:$plda_data_dir/spk2utt \
    "ark:ivector-normalize-length scp:${plda_ivec_dir}/ivector.scp  ark:- |" \
      $plda_ivec_dir/plda 2>$plda_ivec_dir/log/plda.log

mkdir -p $scores_dir

ivector-plda-scoring --num-utts=ark:${enroll_ivec_dir}/num_utts.ark \
   "ivector-copy-plda --smoothing=0.0 ${plda_ivec_dir}/plda - |"  
   "ark:ivector-subtract-global-mean ${plda_ivec_dir}/mean.vec \ 
        scp:${enroll_ivec_dir}/spk_ivector.scp ark:- |" \
   "ark:ivector-subtract-global-mean ${plda_ivec_dir}/mean.vec \
        scp:${test_ivec_dir}/ivector.scp ark:- |" \
   "cat '$trials' | awk '{print \$1, \$2}' |" $scores_dir/plda_scores

先看一下训练PLDA的源码:ivector-compute-plda.cc 只把关键代码拿出来,否则看起来很乱

int main(int argc, char *argv[]) {
  try {
    const char *usage =
        "Computes a Plda object (
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值