run.sh
5.52 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
#!/bin/bash
# Copyright 2017 Johns Hopkins University (Author: Daniel Garcia-Romero)
# 2017 Johns Hopkins University (Author: Daniel Povey)
# 2017-2018 David Snyder
# 2018 Ewald Enzinger
# Apache 2.0.
#
# See ../README.txt for more info on data required.
# Results (mostly equal error-rates) are inline in comments below.
. ./cmd.sh
. ./path.sh
set -e
mfccdir=`pwd`/mfcc
vaddir=`pwd`/mfcc
# The trials file is downloaded by local/make_voxceleb1_v2.pl.
voxceleb1_trials=data/voxceleb1_test/trials
voxceleb1_root=/export/corpora/VoxCeleb1
voxceleb2_root=/export/corpora/VoxCeleb2
stage=0
if [ $stage -le 0 ]; then
local/make_voxceleb2.pl $voxceleb2_root dev data/voxceleb2_train
local/make_voxceleb2.pl $voxceleb2_root test data/voxceleb2_test
# This script creates data/voxceleb1_test and data/voxceleb1_train for latest version of VoxCeleb1.
# Our evaluation set is the test portion of VoxCeleb1.
local/make_voxceleb1_v2.pl $voxceleb1_root dev data/voxceleb1_train
local/make_voxceleb1_v2.pl $voxceleb1_root test data/voxceleb1_test
# if you downloaded the dataset soon after it was released, you will want to use the make_voxceleb1.pl script instead.
# local/make_voxceleb1.pl $voxceleb1_root data
# We'll train on all of VoxCeleb2, plus the training portion of VoxCeleb1.
# This should give 7,323 speakers and 1,276,888 utterances.
utils/combine_data.sh data/train data/voxceleb2_train data/voxceleb2_test data/voxceleb1_train
fi
if [ $stage -le 1 ]; then
# Make MFCCs and compute the energy-based VAD for each dataset
for name in train voxceleb1_test; do
steps/make_mfcc.sh --write-utt2num-frames true \
--mfcc-config conf/mfcc.conf --nj 40 --cmd "$train_cmd" \
data/${name} exp/make_mfcc $mfccdir
utils/fix_data_dir.sh data/${name}
sid/compute_vad_decision.sh --nj 40 --cmd "$train_cmd" \
data/${name} exp/make_vad $vaddir
utils/fix_data_dir.sh data/${name}
done
fi
if [ $stage -le 2 ]; then
# Train the UBM.
sid/train_diag_ubm.sh --cmd "$train_cmd --mem 4G" \
--nj 40 --num-threads 8 \
data/train 2048 \
exp/diag_ubm
sid/train_full_ubm.sh --cmd "$train_cmd --mem 25G" \
--nj 40 --remove-low-count-gaussians false \
data/train \
exp/diag_ubm exp/full_ubm
fi
if [ $stage -le 3 ]; then
# In this stage, we train the i-vector extractor.
#
# Note that there are well over 1 million utterances in our training set,
# and it takes an extremely long time to train the extractor on all of this.
# Also, most of those utterances are very short. Short utterances are
# harmful for training the i-vector extractor. Therefore, to reduce the
# training time and improve performance, we will only train on the 100k
# longest utterances.
utils/subset_data_dir.sh \
--utt-list <(sort -n -k 2 data/train/utt2num_frames | tail -n 100000) \
data/train data/train_100k
# Train the i-vector extractor.
sid/train_ivector_extractor.sh --cmd "$train_cmd --mem 16G" \
--ivector-dim 400 --num-iters 5 \
exp/full_ubm/final.ubm data/train_100k \
exp/extractor
fi
if [ $stage -le 4 ]; then
sid/extract_ivectors.sh --cmd "$train_cmd --mem 4G" --nj 80 \
exp/extractor data/train \
exp/ivectors_train
sid/extract_ivectors.sh --cmd "$train_cmd --mem 4G" --nj 40 \
exp/extractor data/voxceleb1_test \
exp/ivectors_voxceleb1_test
fi
if [ $stage -le 5 ]; then
# Compute the mean vector for centering the evaluation i-vectors.
$train_cmd exp/ivectors_train/log/compute_mean.log \
ivector-mean scp:exp/ivectors_train/ivector.scp \
exp/ivectors_train/mean.vec || exit 1;
# This script uses LDA to decrease the dimensionality prior to PLDA.
lda_dim=200
$train_cmd exp/ivectors_train/log/lda.log \
ivector-compute-lda --total-covariance-factor=0.0 --dim=$lda_dim \
"ark:ivector-subtract-global-mean scp:exp/ivectors_train/ivector.scp ark:- |" \
ark:data/train/utt2spk exp/ivectors_train/transform.mat || exit 1;
# Train the PLDA model.
$train_cmd exp/ivectors_train/log/plda.log \
ivector-compute-plda ark:data/train/spk2utt \
"ark:ivector-subtract-global-mean scp:exp/ivectors_train/ivector.scp ark:- | transform-vec exp/ivectors_train/transform.mat ark:- ark:- | ivector-normalize-length ark:- ark:- |" \
exp/ivectors_train/plda || exit 1;
fi
if [ $stage -le 6 ]; then
$train_cmd exp/scores/log/voxceleb1_test_scoring.log \
ivector-plda-scoring --normalize-length=true \
"ivector-copy-plda --smoothing=0.0 exp/ivectors_train/plda - |" \
"ark:ivector-subtract-global-mean exp/ivectors_train/mean.vec scp:exp/ivectors_voxceleb1_test/ivector.scp ark:- | transform-vec exp/ivectors_train/transform.mat ark:- ark:- | ivector-normalize-length ark:- ark:- |" \
"ark:ivector-subtract-global-mean exp/ivectors_train/mean.vec scp:exp/ivectors_voxceleb1_test/ivector.scp ark:- | transform-vec exp/ivectors_train/transform.mat ark:- ark:- | ivector-normalize-length ark:- ark:- |" \
"cat '$voxceleb1_trials' | cut -d\ --fields=1,2 |" exp/scores_voxceleb1_test || exit 1;
fi
if [ $stage -le 7 ]; then
eer=`compute-eer <(local/prepare_for_eer.py $voxceleb1_trials exp/scores_voxceleb1_test) 2> /dev/null`
mindcf1=`sid/compute_min_dcf.py --p-target 0.01 exp/scores_voxceleb1_test $voxceleb1_trials 2> /dev/null`
mindcf2=`sid/compute_min_dcf.py --p-target 0.001 exp/scores_voxceleb1_test $voxceleb1_trials 2> /dev/null`
echo "EER: $eer%"
echo "minDCF(p-target=0.01): $mindcf1"
echo "minDCF(p-target=0.001): $mindcf2"
# EER: 5.329%
# minDCF(p-target=0.01): 0.4933
# minDCF(p-target=0.001): 0.6168
fi