语音识别系列7-语音活动端点检测(VAD)

一、介绍

语音活动端点检测(VAD)已经是一个古老的话题,用于分离信号中语音信号和非语音信号,首先我们讲述VAD的三种做法:1,通过分帧,判断一帧的能量,过零率等简单的方法来判断是否是语音段;2,通过检测一帧是否有基音周期来判断是否是语音段;3,通过DNN的方法训练模型来分类是否是语音帧。相对来说,通过DNN的方法来做VAD准确率会更好一些,本节我们讲述通过DNN来做语音分类,进而分离语音段和非语音段。

 

二、方法及原理

我们采用的训练数据为:语音识别做音素对齐后的数据,也就是说每一帧都有对应的音素,我们这里把对应为SIL的帧作为非语音帧,把对应为非SIL的帧作为语音帧。这样我们就有了训练DNN模型的数据和标签。接着我们使用KALDI中NNET3来训练DNN网络,为了减小网络规模,我们使用TDNN,每层结点数逐层递减,代码如下:

 

  echo "$0: creating neural net configs";
  num_targets=`feat-to-dim scp:$targets_scp - 2>/dev/null` || exit 1
  feat_dim=`feat-to-dim scp:$data_dir/feats.scp - 2>/dev/null` || exit 1

  mkdir -p $dir/configs
  cat <<EOF > $dir/configs/network.xconfig
  input dim=$feat_dim name=input

  relu-renorm-layer name=tdnn1 dim=200 input=Append(-2,-1,0,1,2)
  relu-renorm-layer name=tdnn2 dim=100 input=Append(-2,0,2)
  relu-renorm-layer name=tdnn3 dim=50 input=Append(-3,0,3)
  relu-renorm-layer name=tdnn4 dim=25 input=Append(-3,0,3)
  output-layer name=output dim=$num_targets max-change=1.5
EOF
  steps/nnet3/xconfig_to_configs.py --xconfig-file $dir/configs/network.xconfig --config-dir $dir/configs/

  steps/nnet3/train_raw_dnn.py --stage=$train_stage \
    --cmd="$decode_cmd" \
    --feat.cmvn-opts "--norm-means=false --norm-vars=false" \
    --trainer.num-epochs 2 \ 
    --trainer.optimization.num-jobs-initial 2 \ 
    --trainer.optimization.num-jobs-final 4 \ 
    --trainer.optimization.initial-effective-lrate 0.001 \
    --trainer.optimization.final-effective-lrate 0.0001 \
    --trainer.optimization.minibatch-size 512 \
    --egs.dir "$common_egs_dir" --egs.opts "$egs_opts" \
    --cleanup.remove-egs $remove_egs \
    --cleanup.preserve-model-interval 10 \
    --nj 20 \
    --use-dense-targets=true \
    --feat-dir=${data_dir} \
    --targets-scp=$targets_scp \
    --dir=$dir || exit 1;

训练完成后,我们就得到了一个二分类的DNN模型,接下来就是一些策略的问题了,在这里,我们把状态分为8个状态:1,未知状态;2,语音开始状态;3,语音状态;4,语音结束状态;5,非语音开始状态;6,非语音状态;7,非语音结束状态;8,结束状态。

策略是:语音开始时是未知状态,如果窗口中非语音帧的个数大于语音帧的个数,我们是非语音开始状态,如果连续10帧都判断为语音帧,那么返回非语音结束状态和语音开始状态,反之亦然。

但是这样一个结果就是语音过渡时间过短,我们会在语音开始状态之前和语音结束状态之后补一段非语音帧,这样可以防止误判。

 

三、结论

以上就是我们使用DNN模型来做VAD,从实验结果来看,效果还不错。

 

 

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐