diff --git a/egs/babel_multilang/s5/local/nnet3/run_tdnn_multilingual.sh b/egs/babel_multilang/s5/local/nnet3/run_tdnn_multilingual.sh
index 75f2c9e6fbf0f69e011f13a604a1179ac8338fd7..65808822db39d2b0c6daea7355a2ae775824fa2a 100755 (executable)
[ ! -f local.conf ] && echo 'the file local.conf does not exist! Read README.txt for more details.' && exit 1;
. local.conf || exit 1;
-
num_langs=${#lang_list[@]}
feat_suffix=_hires # The feature suffix describing features used in
# multilingual training
if $use_pitch && ! $use_pitch_ivector; then
echo "$0: select MFCC features for ivector extraction."
featdir=data/${lang_list[$lang_index]}/train${suffix}${feat_suffix}
- ivec_featdir=data/${lang_list[$lang_index]}/train${suffix}_hires
+ ivec_featdir=data/${lang_list[$lang_index]}/train${suffix}${ivec_feat_suffix}
mfcc_only_dim=`feat-to-dim scp:$featdir/feats.scp - | awk '{print $1-3}'`
if [ ! -f $ivec_featdir/.done ]; then
steps/select_feats.sh --cmd "$train_cmd" --nj 70 0-$[$mfcc_only_dim-1] \
$featdir ${ivec_featdir} || exit 1;
+ steps/compute_cmvn_stats.sh ${ivec_featdir} || exit 1;
touch ${ivec_featdir}/.done || exit 1;
fi
fi
ivector_suffix=""
if [ -z "$ivector_extractor" ]; then
mkdir -p data/multi
- mkdir -p exp/multi/nnet3
global_extractor=exp/multi/nnet3${nnet3_affix}
+ mkdir -p $global_extractor
ivector_extractor=$global_extractor/extractor
multi_data_dir_for_ivec=data/multi/train${suffix}${ivec_feat_suffix}
ivector_suffix=_gb
mkdir -p $multi_data_dir_for_ivec
combine_lang_list=""
for lang_index in `seq 0 $[$num_langs-1]`;do
- combine_lang_list="$combine_lang_list data/${lang_list[$lang_index]}/train${suffix}${feat_suffix}"
+ combine_lang_list="$combine_lang_list data/${lang_list[$lang_index]}/train${suffix}${ivec_feat_suffix}"
done
- utils/combine_data.sh data/multi/train${suffix}${feat_suffix} $combine_lang_list
- utils/validate_data_dir.sh --no-feats data/multi/train${suffix}${feat_suffix}
- touch data/multi/train${suffix}${feat_suffix}/.done
+ utils/combine_data.sh $multi_data_dir_for_ivec $combine_lang_list
+ utils/validate_data_dir.sh --no-feats $multi_data_dir_for_ivec
+ touch $multi_data_dir_for_ivec/.done
fi
fi
if [ ! -f $global_extractor/extractor/.done ]; then
done
fi
+
for lang_index in `seq 0 $[$num_langs-1]`; do
multi_data_dirs[$lang_index]=data/${lang_list[$lang_index]}/train${suffix}${feat_suffix}
multi_egs_dirs[$lang_index]=exp/${lang_list[$lang_index]}/nnet3${nnet3_affix}/egs${feat_suffix}${ivector_suffix}
multi_ivector_dirs[$lang_index]=exp/${lang_list[$lang_index]}/nnet3${nnet3_affix}/ivectors_train${suffix}${ivec_feat_suffix}${ivector_suffix}
done
+
if $use_ivector; then
ivector_dim=$(feat-to-dim scp:${multi_ivector_dirs[0]}/ivector_online.scp -) || exit 1;
else
bnf_dim=1024
fi
mkdir -p $dir/configs
+ ivector_node_xconfig=""
+ ivector_to_append=""
+ if $use_ivector; then
+ ivector_node_xconfig="input dim=$ivector_dim name=ivector"
+ ivector_to_append=", ReplaceIndex(ivector, t, 0)"
+ fi
cat <<EOF > $dir/configs/network.xconfig
- input dim=$ivector_dim name=ivector
+ $ivector_node_xconfig
input dim=$feat_dim name=input
# please note that it is important to have input layer with the name=input
# as the layer immediately preceding the fixed-affine-layer to enable
# the use of short notation for the descriptor
# the first splicing is moved before the lda layer, so no splicing here
- relu-renorm-layer name=tdnn1 input=Append(input@-2,input@-1,input,input@1,input@2,ReplaceIndex(ivector, t, 0)) dim=1024
+ relu-renorm-layer name=tdnn1 input=Append(input@-2,input@-1,input,input@1,input@2$ivector_to_append) dim=1024
relu-renorm-layer name=tdnn2 dim=1024
relu-renorm-layer name=tdnn3 input=Append(-1,2) dim=1024
relu-renorm-layer name=tdnn4 input=Append(-3,3) dim=1024
steps/nnet3/xconfig_to_configs.py --xconfig-file $dir/configs/network.xconfig \
--config-dir $dir/configs/ \
--nnet-edits="rename-node old-name=output-0 new-name=output"
-
+fi
if [ $stage -le 9 ]; then
echo "$0: Generates separate egs dir per language for multilingual training."
--cmvn-opts "--norm-means=false --norm-vars=false" \
--left-context $model_left_context --right-context $model_right_context \
$num_langs ${multi_data_dirs[@]} ${multi_ali_dirs[@]} ${multi_egs_dirs[@]} || exit 1;
-
fi
if [ -z $megs_dir ];then
fi
if [ $stage -le 11 ]; then
+ common_ivec_dir=
+ if $use_ivector;then
+ common_ivec_dir=${multi_ivector_dirs[0]}
+ fi
steps/nnet3/train_raw_dnn.py --stage=$train_stage \
--cmd="$decode_cmd" \
--feat.cmvn-opts="--norm-means=false --norm-vars=false" \
--trainer.max-param-change=2.0 \
--trainer.srand=$srand \
--feat-dir ${multi_data_dirs[0]} \
- --feat.online-ivector-dir ${multi_ivector_dirs[0]} \
+ --feat.online-ivector-dir "$common_ivec_dir" \
--egs.dir $megs_dir \
--use-dense-targets false \
--targets-scp ${multi_ali_dirs[0]} \
for lang_index in `seq 0 $[$num_decode_lang-1]`; do
if [ ! -f $dir/${decode_lang_list[$lang_index]}/decode_dev10h.pem/.done ]; then
echo "Decoding lang ${decode_lang_list[$lang_index]} using multilingual hybrid model $dir"
- run-4-anydecode-langs.sh --use-ivector $use_ivector \
- --use-pitch-ivector $use_pitch_ivector \
- --nnet3-dir $dir --iter final_adj \
+ local/nnet3/run_decode_lang.sh --use-ivector $use_ivector \
+ --use-pitch-ivector $use_pitch_ivector --iter final_adj \
--nnet3-affix "$nnet3_affix" \
- ${decode_lang_list[$lang_index]} || exit 1;
+ ${decode_lang_list[$lang_index]} $dir || exit 1;
touch $dir/${decode_lang_list[$lang_index]}/decode_dev10h.pem/.done
fi
done