run.sh
7.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#!/bin/bash
# Copyright Ondrej Platek Apache 2.0
renice 20 $$
# Load training parameters
. ./env_voip_en.sh
# Source optional config if exists
[ -f env_voip_en_CUSTOM.sh ] && . ./env_voip_en_CUSTOM.sh
. ./path.sh
# If you have cluster of machines running GridEngine you may want to
# change the train and decode commands in the file below
. ./cmd.sh
#######################################################################
# Preparing acoustic features, LMs and helper files #
#######################################################################
echo " Copy the configuration files to $EXP directory."
local/save_check.sh $EXP $WORK/* || exit 1;
local/download_en_data.sh $DATA_ROOT || exit 1;
local/data_split.sh --every_n $EVERY_N $DATA_ROOT $WORK/local "$LMs" "$TEST_SETS" || exit 1
local/create_LMs.sh $WORK/local $WORK/local/train/trans.txt \
$WORK/local/test/trans.txt $WORK/local/lm "$LMs" || exit 1
local/prepare_en_transcription.sh $WORK/local $WORK/local/dict || exit 1
local/create_phone_lists.sh $WORK/local/dict || exit 1
utils/prepare_lang.sh $WORK/local/dict '_SIL_' $WORK/local/lang $WORK/lang || exit 1
local/create_G.sh $WORK/lang "$LMs" $WORK/local/lm $WORK/local/dict/lexicon.txt || exit 1
echo "Create MFCC features and storing them (Could be large)."
for s in train $TEST_SETS ; do
steps/make_mfcc.sh --mfcc-config common/mfcc.conf --cmd \
"$train_cmd" --nj $njobs $WORK/local/$s $EXP/make_mfcc/$s $WORK/mfcc || exit 1;
# Note --fake -> NO CMVN
steps/compute_cmvn_stats.sh $fake $WORK/local/$s \
$EXP/make_mfcc/$s $WORK/mfcc || exit 1;
done
echo "Decoding is done for each pair (TEST_SET x LMs)"
echo "Distribute the links to MFCC feats to all LM variations."
cp $WORK/local/train/feats.scp $WORK/train/feats.scp
cp $WORK/local/train/cmvn.scp $WORK/train/cmvn.scp
for s in $TEST_SETS; do
for lm in $LMs; do
tgt_dir=${s}_`basename "$lm"`
echo "cp $WORK/local/$s/feats.scp $WORK/$tgt_dir/feats.scp"
cp $WORK/local/$s/feats.scp $WORK/$tgt_dir/feats.scp
echo "cp $WORK/local/$s/cmvn.scp $WORK/$tgt_dir/cmvn.scp"
cp $WORK/local/$s/cmvn.scp $WORK/$tgt_dir/cmvn.scp
done
done
#######################################################################
# Training Acoustic Models #
#######################################################################
echo "Train monophone models on full data -> may be wastefull (can be done on subset)"
steps/train_mono.sh --nj $njobs --cmd "$train_cmd" $WORK/train $WORK/lang $EXP/mono || exit 1;
echo "Get alignments from monophone system."
steps/align_si.sh --nj $njobs --cmd "$train_cmd" \
$WORK/train $WORK/lang $EXP/mono $EXP/mono_ali || exit 1;
echo "Train tri1 [first triphone pass]"
steps/train_deltas.sh --cmd "$train_cmd" \
$pdf $gauss $WORK/train $WORK/lang $EXP/mono_ali $EXP/tri1 || exit 1;
# draw-tree $WORK/lang/phones.txt $EXP/tri1/tree | dot -Tsvg -Gsize=8,10.5 > graph.svg
echo "Align tri1"
steps/align_si.sh --nj $njobs --cmd "$train_cmd" \
--use-graphs true $WORK/train $WORK/lang $EXP/tri1 $EXP/tri1_ali || exit 1;
echo "Train tri2a [delta+delta-deltas]"
steps/train_deltas.sh --cmd "$train_cmd" $pdf $gauss \
$WORK/train $WORK/lang $EXP/tri1_ali $EXP/tri2a || exit 1;
echo "Train tri2b [LDA+MLLT]"
steps/train_lda_mllt.sh --cmd "$train_cmd" $pdf $gauss \
$WORK/train $WORK/lang $EXP/tri1_ali $EXP/tri2b || exit 1;
echo "Align all data with LDA+MLLT system (tri2b)"
steps/align_si.sh --nj $njobs --cmd "$train_cmd" \
--use-graphs true $WORK/train $WORK/lang $EXP/tri2b $EXP/tri2b_ali || exit 1;
echo "Train MMI on top of LDA+MLLT."
steps/make_denlats.sh --nj $njobs --cmd "$train_cmd" \
--beam $mmi_beam --lattice-beam $mmi_lat_beam \
$WORK/train $WORK/lang $EXP/tri2b $EXP/tri2b_denlats || exit 1;
steps/train_mmi.sh $WORK/train $WORK/lang $EXP/tri2b_ali $EXP/tri2b_denlats $EXP/tri2b_mmi || exit 1;
echo "Train MMI on top of LDA+MLLT with boosting. train_mmi_boost is a e.g. 0.05"
steps/train_mmi.sh --boost ${train_mmi_boost} $WORK/train $WORK/lang \
$EXP/tri2b_ali $EXP/tri2b_denlats $EXP/tri2b_mmi_b${train_mmi_boost} || exit 1;
echo "Train MPE."
steps/train_mpe.sh $WORK/train $WORK/lang $EXP/tri2b_ali $EXP/tri2b_denlats $EXP/tri2b_mpe || exit 1;
#######################################################################
# Building decoding graph #
#######################################################################
for lm in $LMs ; do
lm=`basename "$lm"`
utils/mkgraph.sh $WORK/lang_${lm} $EXP/mono $EXP/mono/graph_${lm} || exit 1
utils/mkgraph.sh $WORK/lang_${lm} $EXP/tri1 $EXP/tri1/graph_${lm} || exit 1
utils/mkgraph.sh $WORK/lang_${lm} $EXP/tri2a $EXP/tri2a/graph_${lm} || exit 1
utils/mkgraph.sh $WORK/lang_${lm} $EXP/tri2b $EXP/tri2b/graph_${lm} || exit 1
done
#######################################################################
# Decoding #
#######################################################################
for s in $TEST_SETS ; do
for lm in $LMs ; do
lm=`basename "$lm"`
tgt_dir=${s}_`basename "$lm"`
echo "Monophone decoding"
# Note: steps/decode.sh --scoring-opts "--min-lmw $min_lmw --max-lmw $max_lmw" \
# calls the command line once for each test,
# and afterwards averages the WERs into (in this case $EXP/mono/decode/)
steps/decode.sh --scoring-opts "--min-lmw $min_lmw --max-lmw $max_lmw" \
--config common/decode.conf --nj $njobs --cmd "$decode_cmd" \
$EXP/mono/graph_${lm} $WORK/${tgt_dir} $EXP/mono/decode_${tgt_dir}
echo "Decode tri1"
steps/decode.sh --scoring-opts "--min-lmw $min_lmw --max-lmw $max_lmw" \
--config common/decode.conf --nj $njobs --cmd "$decode_cmd" \
$EXP/tri1/graph_${lm} $WORK/$tgt_dir $EXP/tri1/decode_${tgt_dir}
echo "Decode tri2a"
steps/decode.sh --scoring-opts "--min-lmw $min_lmw --max-lmw $max_lmw" \
--config common/decode.conf --nj $njobs --cmd "$decode_cmd" \
$EXP/tri2a/graph_${lm} $WORK/$tgt_dir $EXP/tri2a/decode_${tgt_dir}
echo "Decode tri2b [LDA+MLLT]"
steps/decode.sh --scoring-opts "--min-lmw $min_lmw --max-lmw $max_lmw" \
--config common/decode.conf --nj $njobs --cmd "$decode_cmd" \
$EXP/tri2b/graph_${lm} $WORK/$tgt_dir $EXP/tri2b/decode_${tgt_dir}
# Note: change --iter option to select the best model. 4.mdl == final.mdl
echo "Decode MMI on top of LDA+MLLT."
steps/decode.sh --scoring-opts "--min-lmw $min_lmw --max-lmw $max_lmw" \
--config common/decode.conf --iter 4 --nj $njobs --cmd "$decode_cmd" \
$EXP/tri2b/graph_${lm} $WORK/$tgt_dir $EXP/tri2b_mmi/decode_it4_${tgt_dir}
echo "Decode MMI on top of LDA+MLLT with boosting. train_mmi_boost is a number e.g. 0.05"
steps/decode.sh --scoring-opts "--min-lmw $min_lmw --max-lmw $max_lmw" \
--config common/decode.conf --iter 4 --nj $njobs --cmd "$decode_cmd" \
$EXP/tri2b/graph_${lm} $WORK/$tgt_dir $EXP/tri2b_mmi_b${train_mmi_boost}/decode_it4_${tgt_dir};
echo "Decode MPE."
steps/decode.sh --scoring-opts "--min-lmw $min_lmw --max-lmw $max_lmw" \
--config common/decode.conf --iter 4 --nj $njobs --cmd "$decode_cmd" \
$EXP/tri2b/graph_${lm} $WORK/$tgt_dir $EXP/tri2b_mpe/decode_it4_${tgt_dir} || exit 1;
done
done
echo "Successfully trained and evaluated all the experiments"
local/results.py $EXP | tee $EXP/results.log
local/export_models.sh $TGT_MODELS $EXP $WORK/lang