当前位置:   article > 正文

kaldi中的声纹识别_kaldi的声纹识别

kaldi的声纹识别

kaldi中的声纹识别

      我的博客:https://yutouwd.github.io/
      前段时间一直到在使用kaldi来做声纹识别,算是可以把整个i-vector的例程可以跑下来,也可以根据例程来改写脚本,使用自己的数据来训练和测试。接下来可能要去做其他的项目了,所以要趁着还记得的时候赶紧写个总结,也算是对之前的工作也算是归纳一下。

kaldi的安装

      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安装成功啦✌️

运行aishell例程

      首先我们来看下kaldi下的目录:
在这里插入图片描述

  • egs:保存了各种例程,均使用脚本编写,以使用的数据库的名字命名。在下一级目录中以s开头的文件是语音识别,以v开头的是声纹识别,一般v1就是使用i-vector的方法来进行声纹识别。
  • src:保存了kaldi的C++代码。
  • tools:包括了kaldi依赖的库和一些实用的脚本。
  • windows:包括了在Windows下安装需要的一些工具和配置文件

      接下来我们就来跑一下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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

      首先是数据准备阶段,如果没有下载数据,脚本也可以自动下载和解压;如果下载好了就要把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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

      在准备好数据之后就要开始提取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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

      再接下来就是训练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。

    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/998037
    推荐阅读
    相关标签
      

    闽ICP备14008679号