语音识别系列5-语音活动端点检测(VAD)
语音识别系列7-语音活动端点检测(VAD)一、介绍语音活动端点检测(VAD)已经是一个古老的话题,用于分离信号中语音信号和非语音信号,首先我们讲述VAD的三种做法:1,通过分帧,判断一帧的能量,过零率等简单的方法来判断是否是语音段;2,通过检测一帧是否有基音周期来判断是否是语音段;3,通过DNN的方法训练模型来分类是否是语音帧。相对来说,通过DNN的方法来做VAD准确率会更好一些,本节我们...
语音识别系列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,从实验结果来看,效果还不错。
更多推荐
所有评论(0)