sid/nnet3/xvector/allocate_egs.py
调用者:sid/nnet3/xvector/get_egs.sh
eg:
$cmd $dir/log/allocate_examples_train.log \
sid/nnet3/xvector/allocate_egs.py \
--num-repeats=$num_repeats \
--min-frames-per-chunk=$min_frames_per_chunk \ 200
--max-frames-per-chunk=$max_frames_per_chunk \ 400
--frames-per-iter=$frames_per_iter \ 1000000000
--num-archives=$num_train_archives --num-jobs=$nj \
--utt2len-filename=$dir/temp/utt2num_frames.train \
--utt2int-filename=$dir/temp/utt2int.train --egs-dir=$dir || exit 1
参数含义:
frames-per-iter : 表示一个archive包含的总帧数,不是输出文件range包含的总帧数
num-archives : 输出的archive个数
num-jobs : 可以理解为多少个job工作于输出
输出文件: 该源码会在egs目录下面产生3中类型的文件,
temp/[prefix-]archive_chunk_lengths
temp/[prefix-]/range.[1-num-archives]
temp/[prefix-]/output.[1-num-jobs]
函数作用:
该函数的输出通过nnet3-xvector-get-egs产生egs,可以理解为产生egs前的准备工作。num-archives表示输出archive的个数,archive可以理解为egs文件,里面包含多个utt
num-job表示有多少个job来产生这些archive,如有2个job产生5个archive,则有一个job需要产生3个archive,另一个需要产生2个archive。
输出文件output的个数,就是job的个数,output文件里面的内容就表示该job需要产生的archive文件名,output文件里面有几个文件名就表示这个job需要产生多少个archive,这里面的文件名会用于nnet3-xvector-get-egs产生的输出。
archive_chunk_lengths里面存放的是每个archive对应的random-length,每个random-length都是位于min-frames-per-chunk 和max-frames-per-chunk之间的随机数,该随机数用于求每个utt的‘随机相对偏移量’,‘随机相对偏移量’是说一个utt帧长为utt-length,则‘随机相对偏移量’就是在(0, (utt-length - random-lenth) )之间的一个随机数。这个‘随机相对偏移量’会被写入输出文件range的第4列。
接下来说说range文件是如何产生的,每个archive产生一个random-length,该值用于确定archive里面的utt的个数的"上限" num-utt=(frames-per-iter / random-lenth + 1),
然后确定每个utt的信息,保证range中相邻的utt来自不同的说话人,具体做法为,首先获取所有的spk列表,然后重复num-repeats份,随机打乱,生成一个重复的说话人列表spk_list,这样在spk_list中相邻的spk几乎不是同一个。
从spk_list中弹出一个spk,从这个spk对应的utt中随机取一个utt,然后求这个utt的‘随机相对偏移量’构成<utt,s随机相对偏移量>对,重复min(num-utt, num_repeats*num_spk)次,这样一个archive的所有utt和对应的‘随机相对偏移量’已经确定,
接下来确定range中的剩余的4列,range文件中每一行形式(101-126861-0002 0 1 340 213 2),共6列,第一列是utt,第4列是‘随机相对偏移量’,第5列是‘random-length’,与archive_chunk中的值保持一致。第2列和第3列是有num-job和num-archives决定的。由调用该脚本之前的脚本(get_egs.sh)可知,num-job<=num-archives,比如2个job要产生5个archive,其中一个job要产生3个,另一个产生2个,range文件的第2列就表示这个job产生3个archive中的第几个archive(从0开始),第3列表示是num-archives中的索引。