研究生阶段入坑了说话人识别方向,最近在学习如何使用Kaldi提取i-vector进行说话人识别,在这里记录一下学习的笔记。
这次实验使用的是kaldi中的示例程序,位于egs/sitw/v1中,使用的数据集分别有SITW,VoxCeleb1,VoxCeleb2以及数据增强用的混音数据集RIR_NOISES、MUSAN。脚本使用Voxceleb1和VoxCeleb2训练UBM和T矩阵,使用经过混音后的数据训练PLDA,使用SITW来评估系统性能。需要注意的是,VoxCeleb1数据集和评估数据集SITW中有60个说话人是重复的,因此训练时需要将VoxCeleb1中重复的说话人移除。评估结果使用EER和minDCF指标。
在运行程序前,我们需要修改脚本中的一些参数以及路径。
数据路径
首先要把脚本中各个数据集的路径改成自己存放的路径。
voxceleb1_root=../../../data/Voxceleb1
voxceleb2_root=../../../data/Voxceleb2
sitw_root=../../../data/SITW
musan_root=../../../data/musan
sitw_dev_trials_core=../../../data/SITW/dev/keys/core-core.lst
sitw_eval_trials_core=../../../data/SITW/eval/keys/core-core.lst
最后两行是SITW的trial key文件,改成自己的文件位置就可以了。
根目录下还有一个RIRS_NOISES文件,也要将文件里的RIR_NOISES数据集路径修改成自己的路径。
参数配置
如果是在一台服务器或者主机上面跑的话,首先打开根目录下的cmd.sh,将里面的
export train_cmd="queue.pl --mem 4G"
改成
export train_cmd="run.pl"
然后打开path.sh将第一行改成自己的kaldi根目录路径
export KALDI_ROOT=`pwd`/../..
pwd是linux指令,会打印出运行指令时的目录
接下来我们来修改提取特征和训练时要用到的各项参数
1、MFCC:conf/mfcc.config文件设定了提取MFCC特征时的参数
--sample-frequency=16000 #语音文件采样率
--frame-length=25 # the default is 25 帧长25ms
--low-freq=20 # the default.
--high-freq=7600 # the default is zero meaning use the Nyquist (8k in this case).
--num-mel-bins=30 #梅尔滤波器数量
--num-ceps=24 #MFCC维度
--snip-edges=false
一般我们使用39维MFCC(13维MFCC系数+13维一阶差分系数+13维2阶差分系数),所以我将这里的–num-ceps修改成13,差分阶数将在后面修改。
2、UBM:在run.sh文件的stage 2部分(我将if [ $stage -le 2 ]; then 下的代码块称为stage 2 部分)的
sid/train_diag_ubm.sh --cmd "$train_cmd --mem 4G" \
--nj 40 --num-threads 8 \
data/train 2048 \
exp/diag_ubm
其中2048代表了你想要的UBM维数。
3、ivector:在run.sh件的stage 3部分
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
其中–ivector-dim 400是ivector的维度,–num-iters 5是EM训练T矩阵时迭代次数.
stage 0 数据准备
local/make_voxceleb1.pl $voxceleb1_root data
整理voxceleb1数据集,第一个参数是voxceleb1数据集路径,第二个参数是整理后输出各个清单文件的目标目录.
make_voxceleb1.pl程序有两个功能
第一是根据voxceleb1_sitw_overlap.txt文件,将voxceleb1与sitw中重复说话人的数据从list中移除
第二是根据vox1_meta.csv(其中保存了每个说话人在vox中的id,在数据集中文件夹名,性别,国籍和所在子集)生成各类清单文件.各类清单文件的格式将在后面介绍
local/make_voxceleb2.pl $voxceleb2_root dev data/voxceleb2_train
整理voxceleb2数据集,第一个参数是数据集路径,第二个参数是要用到的数据集,第三个参数是输出路径.
voxceleb2中有两个子集,dev和test,这里我们只使用dev集.程序功能与make_voxceleb1.pl的第二个功能相同.
utils/combine_data.sh data/train data/voxceleb2_train data/voxceleb1
整合训练用的数据集到一个文件夹下.第一个参数是整合后输出路径,后面的参数是要整合的各个文件路径.
具体来说,这行脚本将会把所有文件夹下的utt2spk utt2lang utt2dur feats.scp text cmvn.scp vad.scp reco2file_and_channel wav.scp spk2gender $extra_files文件分别整合到一个同名文件下并保存到输出路径.
local/make_sitw.sh $sitw_root data
整理sitw数据集,不说了,没意思
生成的文件格式
这里以voxceleb1数据集为例
我们先来看一下voxceleb1数据集的目录树
Voxceleb1
-voxceleb1_wav
-A.J._Buckley
-1zcIwhmdeo4_0000001.wav
-1zcIwhmdeo4_0000002.wav
-......
-A.R._Rahman
-0_laIeN-Q44_0000001.wav
-6WO410QOeuo_0000001.wav
-......
-......
spk2utt
A.J._Buckley A.J._Buckley-1zcIwhmdeo4-0000001 A.J._Buckley-1zcIwhmdeo4-0000002 A.J._Buckley-1zcIwhmdeo4-0000003 A.J._Buckley-7gWzIy6yIIk-0000001 A.J._Buckley-7gWzIy6yIIk-0000002 A.J._Buckley-7gWzIy6yIIk-0000003 A.J._Buckley-7gWzIy6yIIk-0000004 A.J._Buckley-7w0IBEWc9Qw-0000001 A.J._Buckley-7w0IBEWc9Qw-0000002 A.J._Buckley-7w0IBEWc9Qw-0000003 A.J._Buckley-7w0IBEWc9Qw-0000004 A.J._Buckley-7w0IBEWc9Qw-0000005 A.J._Buckley-7w0IBEWc9Qw-0000006 A.J._Buckley-7w0IBEWc9Qw-0000007 A.J._Buckley-7w0IBEWc9Qw-0000008 A.J._Buckley-7w0IBEWc9Qw-0000009 A.J._Buckley-7w0IBEWc9Qw-0000010 A.J._Buckley-9mQ11vBs1wc-0000001 A.J._Buckley-9mQ11vBs1wc-0000002 A.J._Buckley-9mQ11vBs1wc-0000003 A.J._Buckley-9mQ11vBs1wc-0000004 A.J._Buckley-DtdEYdViWdw-0000001 A.J._Buckley-DtdEYdViWdw-0000002 A.J._Buckley-DtdEYdViWdw-0000003 A.J._Buckley-J9lHsKG98U8-0000001 A.J._Buckley-J9lHsKG98U8-0000002 A.J._Buckley-J9lHsKG98U8-0000003 A.J._Buckley-J9lHsKG98U8-0000004 A.J._Buckley-J9lHsKG98U8-0000005 A.J._Buckley-J9lHsKG98U8-0000006 A.J._Buckley-J9lHsKG98U8-0000007 A.J._Buckley-J9lHsKG98U8-0000008 A.J._Buckley-J9lHsKG98U8-0000009 A.J._Buckley-J9lHsKG98U8-0000010 A.J._Buckley-J9lHsKG98U8-0000011 A.J._Buckley-J9lHsKG98U8-0000012 A.J._Buckley-J9lHsKG98U8-0000013 A.J._Buckley-J9lHsKG98U8-0000014 A.J._Buckley-J9lHsKG98U8-0000015 A.J._Buckley-J9lHsKG98U8-0000016 A.J._Buckley-J9lHsKG98U8-0000017 A.J._Buckley-J9lHsKG98U8-0000018 A.J._Buckley-J9lHsKG98U8-0000019 A.J._Buckley-J9lHsKG98U8-0000020 A.J._Buckley-J9lHsKG98U8-0000021 A.J._Buckley-J9lHsKG98U8-0000022 A.J._Buckley-J9lHsKG98U8-0000023 A.J._Buckley-J9lHsKG98U8-0000024 A.J._Buckley-J9lHsKG98U8-0000025 A.J._Buckley-J9lHsKG98U8-0000026 A.J._Buckley-Y8hIVOBuels-0000001 A.J._Buckley-Y8hIVOBuels-0000002 A.J._Buckley-Y8hIVOBuels-0000003 A.J._Buckley-Y8hIVOBuels-0000004 A.J._Buckley-Y8hIVOBuels-0000005 A.J._Buckley-Y8hIVOBuels-0000006 A.J._Buckley-Y8hIVOBuels-0000007 A.J._Buckley-Y8hIVOBuels-0000008 A.J._Buckley-Y8hIVOBuels-0000009 A.J._Buckley-Y8hIVOBuels-0000010 A.J._Buckley-eWIX7sfn-M0-0000001 A.J._Buckley-utrA-v8pPm4-0000001 A.J._Buckley-zELwAz2W6hM-0000001 A.J._Buckley-zELwAz2W6hM-0000002 A.J._Buckley-zELwAz2W6hM-0000003 A.J._Buckley-zELwAz2W6hM-0000004 A.J._Buckley-zELwAz2W6hM-0000005 A.J._Buckley-zELwAz2W6hM-0000006 A.J._Buckley-zELwAz2W6hM-0000007 A.J._Buckley-zELwAz2W6hM-0000008 A.J._Buckley-zELwAz2W6hM-0000009 A.J._Buckley-zELwAz2W6hM-0000010 A.J._Buckley-zELwAz2W6hM-0000011 A.J._Buckley-zELwAz2W6hM-0000012 A.J._Buckley-zELwAz2W6hM-0000013 A.J._Buckley-zELwAz2W6hM-0000014 A.J._Buckley-zELwAz2W6hM-0000015
A.R._Rahman A.R._Rahman-0_laIeN-Q44-0000001 A.R._Rahman-6WO410QOeuo-0000001 A.R._Rahman-6WO410QOeuo-0000002 A.R._Rahman-6WO410QOeuo-0000003 A.R._Rahman-6WO410QOeuo-0000004 A.R._Rahman-6WO410QOeuo-0000005 A.R._Rahman-6WO410QOeuo-0000006 A.R._Rahman-6WO410QOeuo-0000007 A.R._Rahman-6WO410QOeuo-0000008 A.R._Rahman-6WO410QOeuo-0000009 A.R._Rahman-6WO410QOeuo-0000010 A.R._Rahman-6WO410QOeuo-0000011 A.R._Rahman-C7k7C-PDvAA-0000001 A.R._Rahman-C7k7C-PDvAA-0000002 A.R._Rahman-Mpr9wqUuLQA-0000001 A.R._Rahman-Mpr9wqUuLQA-0000002 A.R._Rahman-Mpr9wqUuLQA-0000003 A.R._Rahman-QanuGhOhb9A-0000001 A.R._Rahman-QanuGhOhb9A-0000002 A.R._Rahman-QanuGhOhb9A-0000003 A.R._Rahman-QanuGhOhb9A-0000004 A.R._Rahman-QanuGhOhb9A-0000005 A.R._Rahman-QanuGhOhb9A-0000006 A.R._Rahman-QanuGhOhb9A-0000007 A.R._Rahman-QanuGhOhb9A-0000008 A.R._Rahman-QanuGhOhb9A-0000009 A.R._Rahman-QanuGhOhb9A-0000010 A.R._Rahman-QanuGhOhb9A-0000011 A.R._Rahman-QanuGhOhb9A-0000012 A.R._Rahman-QanuGhOhb9A-0000013 A.R._Rahman-QanuGhOhb9A-0000014 A.R._Rahman-QanuGhOhb9A-0000015 A.R._Rahman-QanuGhOhb9A-0000016 A.R._Rahman-QanuGhOhb9A-0000017 A.R._Rahman-QanuGhOhb9A-0000018 A.R._Rahman-QanuGhOhb9A-0000019 A.R._Rahman-QanuGhOhb9A-0000020 A.R._Rahman-QanuGhOhb9A-0000021 A.R._Rahman-QanuGhOhb9A-0000022 A.R._Rahman-QanuGhOhb9A-0000023 A.R._Rahman-QanuGhOhb9A-0000024 A.R._Rahman-QanuGhOhb9A-0000025 A.R._Rahman-QanuGhOhb9A-0000026 A.R._Rahman-QanuGhOhb9A-0000027 A.R._Rahman-QanuGhOhb9A-0000028 A.R._Rahman-QanuGhOhb9A-0000029 A.R._Rahman-QnnjJ9i5WFs-0000001 A.R._Rahman-QnnjJ9i5WFs-0000002 A.R._Rahman-RLKKsYiCMvc-0000001 A.R._Rahman-RLKKsYiCMvc-0000002 A.R._Rahman-RLKKsYiCMvc-0000003 A.R._Rahman-RLKKsYiCMvc-0000004 A.R._Rahman-RLKKsYiCMvc-0000005 A.R._Rahman-RLKKsYiCMvc-0000006 A.R._Rahman-RLKKsYiCMvc-0000007 A.R._Rahman-RLKKsYiCMvc-0000008 A.R._Rahman-RLKKsYiCMvc-0000009 A.R._Rahman-RLKKsYiCMvc-0000010 A.R._Rahman-RLKKsYiCMvc-0000011 A.R._Rahman-RLKKsYiCMvc-0000012 A.R._Rahman-RLKKsYiCMvc-0000013 A.R._Rahman-RLKKsYiCMvc-0000014 A.R._Rahman-RLKKsYiCMvc-0000015 A.R._Rahman-RLKKsYiCMvc-0000016 A.R._Rahman-RLKKsYiCMvc-0000017 A.R._Rahman-RLKKsYiCMvc-0000018 A.R._Rahman-RLKKsYiCMvc-0000019 A.R._Rahman-RLKKsYiCMvc-0000020 A.R._Rahman-RLKKsYiCMvc-0000021 A.R._Rahman-RLKKsYiCMvc-0000022 A.R._Rahman-RLKKsYiCMvc-0000023 A.R._Rahman-RLKKsYiCMvc-0000024 A.R._Rahman-RLKKsYiCMvc-0000025 A.R._Rahman-RLKKsYiCMvc-0000026 A.R._Rahman-RLKKsYiCMvc-0000027 A.R._Rahman-RLKKsYiCMvc-0000028 A.R._Rahman-RLKKsYiCMvc-0000029 A.R._Rahman-RLKKsYiCMvc-0000030 A.R._Rahman-RLKKsYiCMvc-0000031 A.R._Rahman-RLKKsYiCMvc-0000032 A.R._Rahman-RLKKsYiCMvc-0000033 A.R._Rahman-RLKKsYiCMvc-0000034 A.R._Rahman-RLKKsYiCMvc-0000035 A.R._Rahman-RLKKsYiCMvc-0000036 A.R._Rahman-SI4D2_YXvBE-0000001 A.R._Rahman-TqUbiOgEb0w-0000001 A.R._Rahman-TqUbiOgEb0w-0000002 A.R._Rahman-TqUbiOgEb0w-0000003 A.R._Rahman-TqUbiOgEb0w-0000004 A.R._Rahman-TqUbiOgEb0w-0000005 A.R._Rahman-TqUbiOgEb0w-0000006 A.R._Rahman-TqUbiOgEb0w-0000007 A.R._Rahman-TqUbiOgEb0w-0000008 A.R._Rahman-TqUbiOgEb0w-0000009 A.R._Rahman-TqUbiOgEb0w-0000010 A.R._Rahman-VMaXdHLz5Bk-0000001 A.R._Rahman-VMaXdHLz5Bk-0000002 A.R._Rahman-VMaXdHLz5Bk-0000003 A.R._Rahman-VMaXdHLz5Bk-0000004 A.R._Rahman-VMaXdHLz5Bk-0000005 A.R._Rahman-Y2Gr1I2DO7M-0000001 A.R._Rahman-cMGEuZ1zqXk-0000001 A.R._Rahman-cMGEuZ1zqXk-0000002 A.R._Rahman-cMGEuZ1zqXk-0000003 A.R._Rahman-cMGEuZ1zqXk-0000004 A.R._Rahman-eNc4LrrvV80-0000001 A.R._Rahman-eNc4LrrvV80-0000002 A.R._Rahman-eNc4LrrvV80-0000003 A.R._Rahman-eNc4LrrvV80-0000004 A.R._Rahman-eNc4LrrvV80-0000005 A.R._Rahman-eNc4LrrvV80-0000006 A.R._Rahman-eNc4LrrvV80-0000007 A.R._Rahman-eNc4LrrvV80-0000008 A.R._Rahman-eNc4LrrvV80-0000009 A.R._Rahman-eNc4LrrvV80-0000010 A.R._Rahman-eNc4LrrvV80-0000011 A.R._Rahman-eNc4LrrvV80-0000012 A.R._Rahman-eNc4LrrvV80-0000013 A.R._Rahman-gaQqIoV_aLY-0000001 A.R._Rahman-gaQqIoV_aLY-0000002 A.R._Rahman-gaQqIoV_aLY-0000003 A.R._Rahman-gaQqIoV_aLY-0000004 A.R._Rahman-gaQqIoV_aLY-0000005 A.R._Rahman-gaQqIoV_aLY-0000006 A.R._Rahman-gaQqIoV_aLY-0000007 A.R._Rahman-gaQqIoV_aLY-0000008 A.R._Rahman-w9H-ZMvdE9M-0000001 A.R._Rahman-wd_7oYV4dsU-0000001 A.R._Rahman-xTV-jFAUKcw-0000001 A.R._Rahman-xTV-jFAUKcw-0000002 A.R._Rahman-xTV-jFAUKcw-0000003
......
格式:
说话人id(文件夹名字) 语音数据1 语音数据2 语音数据3 ......语音数据n
utt2spk
A.J._Buckley-1zcIwhmdeo4-0000001 A.J._Buckley
A.J._Buckley-1zcIwhmdeo4-0000002 A.J._Buckley
A.J._Buckley-1zcIwhmdeo4-0000003 A.J._Buckley
A.J._Buckley-7gWzIy6yIIk-0000001 A.J._Buckley
A.J._Buckley-7gWzIy6yIIk-0000002 A.J._Buckley
......
格式:
语音数据1 说话人id
语音数据2 说话人id
wav.scp
A.J._Buckley-1zcIwhmdeo4-0000001 ../../../data/Voxceleb1/voxceleb1_wav/A.J._Buckley/1zcIwhmdeo4_0000001.wav
A.J._Buckley-1zcIwhmdeo4-0000002 ../../../data/Voxceleb1/voxceleb1_wav/A.J._Buckley/1zcIwhmdeo4_0000002.wav
A.J._Buckley-1zcIwhmdeo4-0000003 ../../../data/Voxceleb1/voxceleb1_wav/A.J._Buckley/1zcIwhmdeo4_0000003.wav
......
格式:
语音数据1 数据路径
语音数据2 数据路径
stage 1 计算MFCC特征
# Make MFCCs and compute the energy-based VAD for each dataset
for name in sitw_eval_enroll sitw_eval_test sitw_dev_enroll sitw_dev_test train; do
steps/make_mfcc.sh --write-utt2num-frames true --mfcc-config conf/mfcc.conf --nj 80 --cmd "$train_cmd" \
data/${name} exp/make_mfcc $mfccdir
utils/fix_data_dir.sh data/${name}
sid/compute_vad_decision.sh --nj 80 --cmd "$train_cmd" \
data/${name} exp/make_vad $vaddir
utils/fix_data_dir.sh data/${name}
done
1.计算MFCC特征
steps/make_mfcc.sh --write-utt2num-frames true --mfcc-config conf/mfcc.conf --nj 80 --cmd "$train_cmd" \
data/${name} exp/make_mfcc $mfccdir
utils/fix_data_dir.sh data/${name}
命令 | 功能 |
---|---|
write-utt2num-frames true | #生成utt2num-frames文件,文件内容格式为:语音文件 *(第二个参数可能是帧数) |
mfcc-config | conf/mfcc.conf #mfcc参数配置文件 |
nj 80 | 并行任务数 |
cmd “$train_cmd” | 如何运行任务,单机or集群 |
data/${name} | 数据路径 |
exp/make_mfcc | 日志输出路径 |
$mfccdir | mfcc文件目标路径 |
utils/fix_data_dir.sh data/${name} #修复数据路径(将list文件内容排序,去除重复数据,去除格式有问题的行)