赞
踩
我的博客:https://yutouwd.github.io/
前段时间一直到在使用kaldi来做声纹识别,算是可以把整个i-vector的例程可以跑下来,也可以根据例程来改写脚本,使用自己的数据来训练和测试。接下来可能要去做其他的项目了,所以要趁着还记得的时候赶紧写个总结,也算是对之前的工作也算是归纳一下。
kaldi在Linux下的安装总的来说还是比较简单的,首先是先进入tools中运行extras/check_dependenices.sh看下还有哪些依赖项没有安装,然后就可以按照他的提示来安装依赖项目。安装完依赖项之后就分别进入tools目录和src目录下执行命令make -j8,其中8时cpu可以同时运行的线程数量。这个过程还是需要一定时间的。在make完之后就可以运行一个小的例程来看下有没有成功地安装kaldi,我们进入到egs/yesno/s5目录下然后运行run.sh脚本,这是一个判断语音中说的是yes还是no的程序,他会自动下载数据并训练和测试,最终可以有0.0%的WER,这就代表kaldi安装成功啦✌️
首先我们来看下kaldi下的目录:
接下来我们就来跑一下aishell的声纹识别例程,在egs/aishell/v1中的run.sh就包括了整个声纹识别的流程,最好将run.sh中的命令复制到另外一个脚本中,一句一句地执行,这样就能及时发现错误然后修改。
data=/export/a05/xna/data
data_url=www.openslr.org/resources/33
. ./cmd.sh
. ./path.sh
set -e # exit on error
local/download_and_untar.sh $data $data_url data_aishell
local/download_and_untar.sh $data $data_url resource_aishell
# Data Preparation
local/aishell_data_prep.sh $data/data_aishell/wav $data/data_aishell/transcript
首先是数据准备阶段,如果没有下载数据,脚本也可以自动下载和解压;如果下载好了就要把data的路径改成自己存放数据的路径。之后的cmd.sh和path.sh分别是设置执行命令的方式和kaldi的路径。如果我们是在自己的电脑上运行,就需要进入到cmd.sh中,把queue.pl修改成run.pl。path.sh就是设置和kaldi相关的路径,如果是例程的话就不用修改了。配置好之后就开始下载和解压数据。
之后就是最关键的部分了,准备一些下面环节需要的文档,使用aishell_data_prep.sh这个脚本来生成。声纹识别需要用到的分别是utt2spk spk2utt wav.scp这三个文件。其中utt指的是utterance代表一个音频文件的文件名,spk代表speaker是说话人的ID,这里在下一节做详细的介绍。如果是做语音识别,还需要text文件,这里就不做介绍了。
# Now make MFCC features.
# mfccdir should be some place with a largish disk where you
# want to store MFCC features.
mfccdir=mfcc
for x in train test; do
steps/make_mfcc.sh --cmd "$train_cmd" --nj 10 data/$x exp/make_mfcc/$x $mfccdir
sid/compute_vad_decision.sh --nj 10 --cmd "$train_cmd" data/$x exp/make_mfcc/$x $mfccdir
utils/fix_data_dir.sh data/$x
done
在准备好数据之后就要开始提取mfcc特征了,进行端点检测(VAD),以及检查文件符不符合要求对文件进行排序(其实我也没有仔细看fix_data_dir.sh这个脚本到底做了什么?)
# train diag ubm
sid/train_diag_ubm.sh --nj 10 --cmd "$train_cmd" --num-threads 16 \
data/train 1024 exp/diag_ubm_1024
#train full ubm
sid/train_full_ubm.sh --nj 10 --cmd "$train_cmd" data/train \
exp/diag_ubm_1024 exp/full_ubm_1024
#train ivector
sid/train_ivector_extractor.sh --cmd "$train_cmd --mem 10G" \
--num-iters 5 exp/full_ubm_1024/final.ubm data/train \
exp/extractor_1024
再接下来就是训练UBM和ivector extractor了,这里需要注意的是训练ivector extractor的脚本会默认同时执行程序非常多,会占用很高的内存导致内存溢出。我们需要进入train_ivector_extractor.sh中修改一下。它默认同时执行的程序数量为nj*num_thread*num_processes,在16G内存下我把这三个参数都改为2才能跑通。这里也还有两个超参数可以修改,分别是UBM的维数和ivector的维数,UBM的维数就直接在run.sh中修改就行,train_diag_ubm.sh中data/train后面那个参数就是UBM的维数,默认为1024。要修改ivector的维数就同样需要进到train_ivector_extractor.sh中修改ivector_dim,默认为400。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。