本文根据kaldi中的vad的算法 kaldi/src/ivector/voice-activity-detection.cc以及网上的一些资源来总结一下这个知识点。
首先VAD的全称是:Voice Activity Detection (语音激活检测), 能够区分传输语音信号中的语音信号和背景噪音, 当然还能在通信中区分语音和静默段能够区分传输语音信号中的语音信号和背景噪音,
避免带宽资源的浪费,这里我们只讨论在说话人识别中需要区分背景噪音来构建UBM模型。
下面直接看kaldi的源码,注意看注释
run.sh中调用下面computer_vad_decision.sh
Usage: $0 [options] <data-dir> <log-dir> <path-to-vad-dir>
- sid/compute_vad_decision.sh --nj 40 --cmd "$train_cmd" \
- data/train exp/make_vad $vaddir
Usage: compute-vad [options] <feats-rspecifier> <vad-wspecifier>
输入的是每一个feats文件,由于上边的nj是40,所以这JOB: 1~40, 输入mfcc.ark 输出vad.ark
compute-vad --config=$vad_config scp:$sdata/JOB/feats.scp ark,scp:$vaddir/vad_${name}.JOB.ark,$vaddir/vad_${name}.JOB.scp
computer-vad是 kaldi/src/ivectorbin/compute-vad.cc
下面是 computer-vad.cc中的逻辑:
- for (;!feat_reader.Done(); feat_reader.Next()) {
- #读取每一句话
- std::string utt = feat_reader.Key();
- Matrix<BaseFloat> feat(feat_reader.Value());
- if (feat.NumRows() == 0) {
- KALDI_WARN << "Empty feature matrix for utterance " << utt;
- num_err++;
- continue;
- }