7773b38918c74c179980b99988ea4e12da761631
[processor-sdk/kaldi.git] / egs / wsj / s5 / steps / nnet3 / make_bottleneck_features.sh
1 #!/bin/bash
3 # Copyright 2016 Pegah Ghahremani
5 # This script dumps bottleneck feature for model trained using nnet3.
7 # Begin configuration section.
8 stage=1
9 nj=4
10 cmd=queue.pl
11 use_gpu=false
12 ivector_dir=
13 compress=true
14 # End configuration options.
16 echo "$0 $@"  # Print the command line for logging
18 [ -f path.sh ] && . ./path.sh # source the path.
19 . parse_options.sh || exit 1;
21 if [[ ( $# -lt 4 ) || ( $# -gt 6 ) ]]; then
22    echo "usage: steps/nnet3/make_bottleneck_features.sh <bnf-node-name> <input-data-dir> <bnf-data-dir> <nnet-dir> [<log-dir> [<bnfdir>] ]"
23    echo "e.g.:  steps/nnet3/make_bottleneck_features.sh tdnn_bn.renorm data/train data/train_bnf exp/nnet3/tdnn_bnf exp_bnf/dump_bnf bnf"
24    echo "Note: <log-dir> dafaults to <bnf-data-dir>/log and <bnfdir> defaults to"
25    echo " <bnf-data-dir>/data"
26    echo "main options (for others, see top of script file)"
27    echo "  --config <config-file>                           # config containing options"
28    echo "  --nj <nj>                                        # number of parallel jobs"
29    echo "  --cmd (utils/run.pl|utils/queue.pl <queue opts>) # how to run jobs."
30    echo "  --ivector-dir                                    # directory for ivectors"
31    exit 1;
32 fi
33 bnf_name=$1 # the component-node name in nnet3 model used for bottleneck feature extraction
34 data=$2
35 bnf_data=$3
36 nnetdir=$4
37 if [ $# -gt 4 ]; then
38   logdir=$5
39 else
40   logdir=$bnf_data/log
41 fi
42 if [ $# -gt 5]; then
43   bnfdir=$6
44 else
45   bnfdir=$bnf_data/data
46 fi
48 # Assume that final.nnet is in nnetdir
49 cmvn_opts=`cat $nnetdir/cmvn_opts`;
50 bnf_nnet=$nnetdir/final.raw
51 if [ ! -f $bnf_nnet ] ; then
52   echo "$0: No such file $bnf_nnet";
53   exit 1;
54 fi
56 if $use_gpu; then
57   compute_queue_opt="--gpu 1"
58   compute_gpu_opt="--use-gpu=yes"
59   if ! cuda-compiled; then
60     echo "$0: WARNING: you are running with one thread but you have not compiled"
61     echo "   for CUDA.  You may be running a setup optimized for GPUs.  If you have"
62     echo "   GPUs and have nvcc installed, go to src/ and do ./configure; make"
63     exit 1
64   fi
65 else
66   echo "$0: without using a GPU this will be very slow.  nnet3 does not yet support multiple threads."
67   compute_gpu_opt="--use-gpu=no"
68 fi
71 ## Set up input features of nnet
72 name=`basename $data`
73 sdata=$data/split$nj
75 mkdir -p $logdir
76 mkdir -p $bnf_data
77 mkdir -p $bnfdir
78 echo $nj > $nnetdir/num_jobs
79 splice_opts=`cat $nnetdir/splice_opts 2>/dev/null`
80 [[ -d $sdata && $data/feats.scp -ot $sdata ]] || split_data.sh $data $nj || exit 1;
82 use_ivector=false
83 if [ ! -z "$ivector_dir" ];then
84   use_ivector=true
85   steps/nnet2/check_ivectors_compatible.sh $nnetdir $ivector_dir || exit 1;
86 fi
88 feats="ark,s,cs:apply-cmvn $cmvn_opts --utt2spk=ark:$sdata/JOB/utt2spk scp:$sdata/JOB/cmvn.scp scp:$sdata/JOB/feats.scp ark:- |"
89 ivector_feats="scp:utils/filter_scp.pl $sdata/JOB/utt2spk $ivector_dir/ivector_online.scp |"
91 if [ $stage -le 1 ]; then
92   echo "$0: Generating bottleneck features using $bnf_nnet model as output of "
93   echo "    component-node with name $bnf_name."
94   echo "output-node name=output input=$bnf_name" > $bnf_data/output.config
95   modified_bnf_nnet="nnet3-copy --edits='remove-output-nodes name=output' $bnf_nnet - | nnet3-copy --nnet-config=$bnf_data/output.config - - |"
96   ivector_opts=
97   if $use_ivector; then
98     ivector_period=$(cat $ivector_dir/ivector_period) || exit 1;
99     ivector_opts="--online-ivector-period=$ivector_period --online-ivectors='$ivector_feats'"
100   fi
101   $cmd $compute_queue_opt JOB=1:$nj $logdir/make_bnf_$name.JOB.log \
102     nnet3-compute $compute_gpu_opt $ivector_opts "$modified_bnf_nnet" "$feats" ark:- \| \
103     copy-feats --compress=$compress ark:- ark,scp:$bnfdir/raw_bnfeat_$name.JOB.ark,$bnfdir/raw_bnfeat_$name.JOB.scp || exit 1;
104 fi
107 N0=$(cat $data/feats.scp | wc -l)
108 N1=$(cat $bnfdir/raw_bnfeat_$name.*.scp | wc -l)
109 if [[ "$N0" != "$N1" ]]; then
110   echo "$0: Error happens when generating BNF for $name (Original:$N0  BNF:$N1)"
111   exit 1;
112 fi
114 # Concatenate feats.scp into bnf_data
115 for n in $(seq $nj); do  cat $bnfdir/raw_bnfeat_$name.$n.scp; done > $bnf_data/feats.scp
117 for f in segments spk2utt text utt2spk wav.scp char.stm glm kws reco2file_and_channel stm; do
118   [ -e $data/$f ] && cp -r $data/$f $bnf_data/$f
119 done
121 echo "$0: computing CMVN stats."
122 steps/compute_cmvn_stats.sh $bnf_data
124 echo "$0: done making BNF feats.scp."
126 exit 0;