Kaldi-aishell

Oct. 12, 2019, 3:33 p.m.

read: 1935

准备

linux 以UBUNTU16.01为例

下载

git clone https://github.com/kaldi-asr/kaldi.git

or

wget https://github.com/kaldi-asr/kaldi/archive/master.zip
unzip master.zip
mv kaldi-master  kaldi


检查依赖

cd kaldi/tools
./extras/check_dependencies.sh

直到输出

./extras/check_dependencies.sh: all OK.


编译tools目录

确认 当前工作目录还在 kaldi/tools下面

make

直到输出

All done OK.

但是输出了两个warn:

Warning: IRSTLM is not instlled by default anymore, If you need LRSTLM
Warning: use script extras/install_irstlm.sh

安装IRSTLM LM

extras/install_irstlm.sh
extras/install_kaldi_lm.sh # 可能会报错,解决方案:https://blog.csdn.net/u012798683/article/details/101174899


编译src目录

确认 当前工作目录切换到 kaldi/src下面
执行

./configure

报错下面信息:

***configure failed: CUDA 7_5 does not support g++ (g++-5.4.0).
                 You need g++ < 5.0. ***

理解一下找到的cuda版本为7.5,目前的g++版本太高,不兼容
实际上我们的服务器上面装的是cuda9.0,应该有历史遗留cuda

nvcc --version

输出:
nvcc: nvidia (r) cuda compiler driver
copyright (c) 2005-2015 nvidia corporation
built on tue_aug_11_14:27:32_cdt_2015
cuda compilation tools, release 7.5, v7.5.17
可以看到默认cuda是7.5版本

再去寻找nvcc在哪个目录

which nvcc

/usr/bin/nvcc

可以看到在nvcc在 /usr/bin里面有一个历史遗留版本,
寻找了一下我的cuda9.0装在了哪个目录
在我的服务器上面的
/usr/local/cuda

再看看kaldi/src/configure文件源码
在configure文件的308行开始有如下代码:

# CUDA is used only in selected directories including src/cudamatrix, src/nnet*
# and src/chain*. It is used to accelerate the neural network training.
# The rest of Kaldi runs on CPUs.

function configure_cuda {
  # Check for CUDA toolkit in the system
  if [ ! -d  "$CUDATKDIR" ]; then
    for base in /usr/local/share/cuda /usr/local/cuda /usr/; do
      if [ -f $base/bin/nvcc ]; then
        CUDATKDIR=$base
      fi
    done
  fi

  if [ -d "$CUDATKDIR" ]; then
    if [ ! -f $CUDATKDIR/bin/nvcc ]; then
      failure "Cannnot find nvcc in CUDATKDIR=$CUDATKDIR"
    fi

    if [[ "$TARGET_ARCH" != "`uname -m`" ]] ; then

粗略的看一下源码
发现以下代码段:

if [ ! -d  "$CUDATKDIR" ]; then
    for base in /usr/local/share/cuda /usr/local/cuda /usr/; do
      if [ -f $base/bin/nvcc ]; then
        CUDATKDIR=$base
      fi
    done
  fi

如果没有定义CUDATKDIR这个环境变量的话,默认去以下三个目录寻找

  • /usr/local/share/cuda
  • /usr/local/cuda
  • /usr/

bin/nvcc这个文件
实际上/usr/local/cuda/usr/local/cuda这两个目录都存在nvcc这个文件,其中/usr/bin/nvcc是老版本,会导致上述异常。
有下面两个解决方案:

方案1:

if [ ! -d  "$CUDATKDIR" ]; then
    for base in /usr/local/share/cuda /usr/local/cuda /usr/; do
      if [ -f $base/bin/nvcc ]; then
        CUDATKDIR=$base
        break # 添加这一行
      fi
    done
  fi

输出就没有报错信息了:

Using CUDA toolkit /usr/local/cuda (nvcc compiler and runtime libraries)
INFO: Configuring Kaldi not to link with Speex. Don't worry, it's only needed if
      you intend to use 'compress-uncompress-speex', which is very unlikely.
Kaldi has been successfully configured. To compile:

  make -j clean depend; make -j <NCPU>

where <NCPU> is the number of parallel builds you can afford to do. If unsure,
use the smaller of the number of CPUs or the amount of RAM in GB divided by 2,
to stay within safe limits. 'make -j' without the numeric value may not limit
the number of parallel jobs at all, and overwhelm even a powerful workstation,
since Kaldi build is highly parallelized.

方案2:
在控制台添加环境变量

export CUDATKDIR=/usr/local/cuda

同样也能消除错误。

正式开始编译工作:

./configure --shared
make depend -j 8
make -j 8

此外,如果你需要在线解码模块:
执行:

make ext

看到输出为

...
echo Done
Done

就算是编译好了


AISHELL1 训练

切换工作目录

cd steps/train_mono.sh

修改cmd.sh

# 修改之后的代码
export train_cmd="run.pl"         #"queue.pl --mem 2G"
export decode_cmd="run.pl --mem 4G"    #"queue.pl --mem 4G"
export mkgraph_cmd="run.pl --mem 8G"   #"queue.pl --mem 8G"
export cuda_cmd="run.pl --gpu 1" # 可能需要修改gpu号
./run.sh # 开始运行,大概需要很长时间


local/download_and_untar.sh

参数数量:3

  • data-base: 数据存放的目录
  • url-base: 下载url
  • corpus-part: 只能是两个参数 data_aishell resource_aishell

功能:


下载数据集到指定目录and解压相关数据


local/aishell_prepare_dict.sh

参数数量:1

  • resource-path: 资源文件路径

功能:

  • 读取汉字音素文件 lexicon.txt 导出 非静音音素nonslience_phones.txt
  • 写入静音音素文件 slience_phones.txt,optional_slience.txt
    这两个文件只有 sli一个音素
  • 写入sli,辅音,以及不同音调的元音 到 extra_question.txt, 用来构建决策树的问题集,可以是空的,包含多组相同的音素,每一组音素包含相同的重音或者声调;也有可能是一致表示非语音的静音/噪音音素。这可以用于增加自动生成问题的数量。

local/aishell_data_prep.sh

参数数量:2

  • audio-path:音频文件路径
  • text-path: 对应的文本文件路径

脚本说明


这个脚本主要生成几个映射文件
utt.list: 抽出wav.flist里面的文件名部分
utt2spk_all: 文件名和说话人编码的一个映射
wav.scp_all: 文件名 和 文件的完整路径之间的映射
transcripts.txt: 文件名和对应的中文文本之间的映射
utt2spk: 经过排序之后的文件名和说话人之间的映射
wav.scp: 经过排序之后的文件名话文件路径之间的映射
text: 排序之后的文件名和对应的中文文本之间的映射
spk2utt: 说话人以及这个说话人之间的一对多的映射

utils/prepare_lang.sh

传入参数数量:4


utils/prepare_lang.sh —position-dependent-phones false

功能:


把字典转换成kaldi可以接受的数据结构-FST(finit state transducer)
OOV存放的是词汇表以外的词,这里就是静音词(非语言学发声意义的词)
发音字典是二进制的OpenFst 格式,可以使用如下命令查看:
确认目前的工作目录在kaldi/egs/aishell/s5
../../../tools/openfst/bin/fstprint --isymbols=data/lang/phones.txt --osymbols=data/lang/words.txt data/lang/L.fst
../../../tools/openfst/bin/fstdraw --isymbols=data/lang/phones.txt --osymbols=data/lang/words.txt data/lang/L.fst


local/aishell_train_lms.sh

pass

utils/format_lm.s

pass

steps/make_mfcc_pitch.sh

pass

对kaldi有兴趣的同学可以加群

KALDI声纹识别交流群 群号:729152186




MacOS 安装 Kaldi 的 PortAudio

如果是基于kaldi的工程编译,则进入 kaldi/tools/运行 ./install_portaudio.sh 发生错误 ld: library not found for -lgcc_s.10…

PyTorch统计网络的参数数量

文章标题:PyTorch统计网络的参数数量文章内容:传入参数为已经实例化完成的网络,输出为所有需要求梯度的参数的数量 def count_parameters(model): return …

此站点由 ASP.NETIIS 驱动 | © 2018-2023 hupeng.me. All Rights Reserved.