Kaldi环境配置与Aishell训练

news2025/3/4 13:52:47

一、项目来源

代码来源:kaldi-asr/kaldi: kaldi-asr/kaldi is the official location of the Kaldi project. (github.com)

官网文档:Kaldi: The build process (how Kaldi is compiled) (kaldi-asr.org)

    踩着我的同门@李思成-CSDN博客填上的坑kaldi环境配置与aishell实践_kaldi 编译-CSDN博客踏进新的坑里,Kaldi不是终端用户软件,也没有安装包,安装Kaldi包括编译其代码和准备必要的工具与运行环境。

二、环境配置

1、安装系统开发库的依赖

        编译Kaldi之前,需要检查和安装Kaldi依赖的系统开发库,可以通过在Kaldi的tools目录下执行extras/check_dependencies.sh脚本来检查。

~/project/kaldi/tools$ extras/check_dependencies.sh
extras/check_dependencies.sh: subversion is not installed
extras/check_dependencies.sh: python2.7 is not installed
extras/check_dependencies.sh: Some prerequisites are missing; install them using the command:
  sudo apt-get install subversion python2.7

        经过检查,我需要安装python2.7、python3和subversion

cd /home/chy524/kaldi/tools/
# 由于依赖库需要python2.7和python3,在tools目录下创建python文件夹,在文件夹中建立符号链接
mkdir -p python/

# 我还没有安装python2.7和python3,我在根目录下安装python2.7和python3
cd ~
mkdir -p ~/python

# 下载python2.7和python3.9
wget https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tgz
wget https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tgz

# 解压源码包
tar -xvzf Python-2.7.18.tgz
tar -xvzf Python-3.9.0.tgz

# 编译并安装,
cd Python-2.7.18
./configure --prefix=$HOME/python/python2.7
make
make install

cd ~/python_versions/Python-3.9.0
./configure --prefix=$HOME/python/python3
make
make install

# 安装完后,更新环境变量,打开.bashrc文件,在文件末尾添加以下内容
export PATH=$HOME/python/python2.7/bin:$PATH
export PATH=$HOME/python/python3/bin:$PATH

# 保存并关闭文件,然后执行
source ~/.bashrc

# 回到建立符号链接的python文件夹
cd /home/chy524/kaldi/tools/python/

# 建立符号链接
ln -s ~/python/python2.7/bin/python ~/python/python2.7/bin/python2
ln -s ~/python/python3/bin/python ~/python/python3/bin/python3

        安装subversion,且我没有sudo权限

# 下载subversion
wget https://archive.apache.org/dist/subversion/subversion-1.14.1.tar.gz

# 解压源代码包
tar -xvzf subversion-1.14.1.tar.gz
cd subversion-1.14.1

# 安装 Subversion,我这里失败了,因为error: no suitable APR found,所以后面这些都执行不了
#./configure --prefix=$HOME/software/subversion
# make
# make install

# 将 Subversion 添加到环境变量中
# export PATH=$HOME/software/subversion/bin:$PATH

# 更新环境变量
# source ~/.bashrc

        安装过程出现error: no suitable APR found报错,提示Subversion 在配置过程中没有找到所需的 Apache Portable Runtime (APR) 库。

configure: Apache Portable Runtime (APR) library configuration
checking for APR... no
configure: WARNING: APR not found
The Apache Portable Runtime (APR) library cannot be found.
Please install APR on this system and configure Subversion
with the appropriate --with-apr option.

You probably need to do something similar with the Apache
Portable Runtime Utility (APRUTIL) library and then configure
Subversion with both the --with-apr and --with-apr-util options.

configure: error: no suitable APR found

        因此需要安装 APR 库以及 APR Utility(APRUTIL)库,才能成功编译和安装 Subversion,可以从 Apache APR 官方网站 下载最新的源代码

# 下载APR与APRUTIL到~/software中
cd ~/software/
wget https://downloads.apache.org//apr/apr-1.7.0.tar.gz
wget https://downloads.apache.org//apr/apr-util-1.6.1.tar.gz

# 解压文件
tar -xvf apr-1.7.0.tar.gz
tar -xvf apr-util-1.6.1.tar.gz

# 编译并安装APR与APRUTIL
cd apr-1.7.0
./configure --prefix=$HOME/software/apr
make
make install

cd ../apr-util-1.6.1
./configure --prefix=$HOME/software/apr-util --with-apr=$HOME/software/apr

# 在apr-util中进行make时,出现问题:缺少了expat.h头文件,所以这后面执行不了
# make
# make install

        在apr-util中进行make时,出现问题:缺少了expat.h头文件

-I/home/chy524/software/apr-util-1.6.3/include/private  -I/home/chy524/software/apr/include/apr-1    -o xml/apr_xml.lo -c xml/apr_xml.c && touch xml/apr_xml.lo 
xml/apr_xml.c:35:10: fatal error: expat.h: No such file or directory
   35 | #include <expat.h>
      |          ^~~~~~~~~
compilation terminated.
make[1]: *** [/home/chy524/software/apr-util-1.6.3/build/rules.mk:207: xml/apr_xml.lo] Error 1
make[1]: Leaving directory '/s6home/chy524/software/apr-util-1.6.3'
make: *** [/home/chy524/software/apr-util-1.6.3/build/rules.mk:119: all-recursive] Error 1

        expat.h是Expat XML 解析库的头文件,而 APR-UTIL 在某些功能(比如 XML 处理)中依赖于它,所以需要安装Expat库

# 安装Expat到software中
cd ~/software/
wget https://github.com/libexpat/libexpat/releases/download/R_2_4_9/expat-2.4.9.tar.bz2

# 解压和编译Expat
tar -xvf expat-2.4.9.tar.bz2
cd expat-2.4.9

# 编译并安装到用户目录
./configure --prefix=$HOME/software/expat/
make
make install

# 配置APR-UTIL使用Expat
cd apr-util-1.6.3
./configure --prefix=$HOME/software/apr-util --with-apr=$HOME/software/apr --with-expat=$HOME/software/expat
make
make install

        随后又回到subversion进行安装,出现了缺失serf库和sqlite3库,就不贴报错了,跟前面差不多,我继续解决报错了。安装serf库,从官网下载Download Apache Serf Sources,serf 是一个库,而不是可执行程序,所以没有 bin/ 目录。

# 安装serf库
cd ~/software/
wget https://archive.apache.org/dist/serf/serf-1.3.10.tar.bz2
tar -xvf serf-1.3.10.tar.bz2
cd serf-1.3.10

# 编译serf库,源代码中没有configure文件,不能像上面那样很简单就编译,只能通过提供的的readme文档进行编译,serf 使用的是 SCons 构建系统,而不是传统的 configure 脚本,可以从文件名 SConstruct 看出来,SConstruct 是 SCons 用来定义构建规则的文件。

# 下载 scons-local
mkdir -p ~/software/scons-local
cd ~/software/scons-local
wget http://prdownloads.sourceforge.net/scons/scons-local-2.3.0.tar.gz
tar -xvzf scons-local-2.3.0.tar.gz

# 检查安装是否成功
scons --version

# 构建Apache Serf
# 我的OPENSSL通过openssl version -a进行路径查找,在/home/chy524/miniconda3/ssl中(如果没有就下载OPENSSL),修改OPENSSL的路径
cd ~/software/serf-1.3.10
scons APR=$HOME/software/apr \
      APU=$HOME/software/apr-util \
      OPENSSL=$HOME/miniconda3 \
      PREFIX=$HOME/software/serf

# 安装Serf
scons PREFIX=$HOME/software/serf install
echo 'export PATH=$HOME/software/serf/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

        安装sqlite3库

cd ~/software/
# 下载 SQLite 源码
wget https://www.sqlite.org/2015/sqlite-amalgamation-3081101.zip
# 解压
unzip sqlite-amalgamation-3081101.zip
# 重命名文件夹为 sqlite-amalgamation
mv sqlite-amalgamation-3081101 /home/chy524/software/subversion-1.14.1/sqlite-amalgamation
# sqlite3就下载好了

        再次回去编译subversion,发现找不到 LZ4 库,根据提示信息,直接修改参数就好,加一行--with-lz4=internal

cd ~/software/subversion-1.14.1
./configure --prefix=$HOME/software/subversion --with-apr=$HOME/software/apr --with-apr-util=$HOME/software/apr-util --with-serf=$HOME/software/serf --with-sqlite=$HOME/software/sqlite-amalgamation 
make
# make install

......
......
checking for inflate in -lz... yes
configure: lz4 configuration without pkg-config
checking for LZ4_compress_default in -llz4... no
configure: error: Subversion requires LZ4 >= r129, or use --with-lz4=internal

        后面还出现一个库也需要改为内部库,直接加上就好,然后没有错误之后,最终执行安装好所有的前置配置,最终安装命令为

cd ~/software/subversion-1.14.1
./configure --prefix=$HOME/software/subversion --with-apr=$HOME/software/apr --with-apr-util=$HOME/software/apr-util --with-serf=$HOME/software/serf --with-sqlite=$HOME/software/sqlite-amalgamation --with-lz4=internal --with-(这里还有一个什么忘记了)=internal
make
make install

        到此就完成了安装依赖的系统开发库

2、安装依赖的第三方工具库

        无法访问GitHub,需要下载第三方工具库压缩包到tools目录下,并在tools/Makefile中调整库的版本号,然后执行make命令进行编译。

压缩包链接:https://pan.baidu.com/s/1la0nmku2zBxa1lRKiUTWcw?pwd=flho

修改tools/Makefile中的版本号:

# SHELL += -x

CXX ?= g++
CC ?= gcc        # used for sph2pipe
# CXX = clang++  # Uncomment these lines...
# CC = clang     # ...to build with Clang.

WGET ?= wget

OPENFST_VERSION ?= 1.7.2
CUB_VERSION ?= 1.8.0
# No '?=', since there exists only one version of sph2pipe.
SPH2PIPE_VERSION = 2.5
# SCTK official repo does not have version tags. Here's the mapping:
# 2.4.9 = 659bc36; 2.4.10 = d914e1b; 2.4.11 = 20159b5.
SCTK_GITHASH = 2.4.12

        执行make进行编译

cd ~/project/kaldi/tools/
make

3. 安装语音模型工具IRSTLM / SRILM / Kaldi_lm

安装irstlm.sh

cd ~/project/kaldi/tools/
# 将install_irstlm.sh中https://github.com/irstlm-team/irstlm.git改为https://gitclone.con/github.com/irstlm-team/irstlm.git
extras/install_irstlm.sh
# 安装完成,加载环境变量
source ../tools/env.sh

安装kaldi_lm.sh

cd ~/project/kaldi/tools/
# 将install_kaldi_lm.sh中https://github.com/danpovey/kaldi_lm.git改为https://gitclone.com/github.com/danpovey/kaldi_lm.git
extras/install_irstlm.sh
# 安装完成,加载环境变量
source ../tools/env.sh

安装srilm.sh,使用手动安装

# 安装srilm之前先安装依赖lbfgs库
cd ~/project/kaldi/tools/
extras/install_liblbfgs.sh

# 在tools/目录下载压缩包
# https://pan.baidu.com/s/1la0nmku2zBxa1lRKiUTWcw?pwd=flho

# 解压并改名
tar -xvzf srilm-1.7.3.tar.gz
mv srilm-1.7.3/ srilm/

#将下方shell内容复制粘贴到install_srilm.sh中,随后运行
extras/install_srilm.sh

# 安装完成,加载环境变量
source ../tools/env.sh

修改install_srilm.sh中内容

#!/usr/bin/env bash

current_path=`pwd`
current_dir=`basename "$current_path"`

if [ "tools" != "$current_dir" ]; then
    echo "You should run this script in tools/ directory!!"
    exit 1
fi

if [ ! -d liblbfgs-1.10 ]; then
    echo Installing libLBFGS library to support MaxEnt LMs
    bash extras/install_liblbfgs.sh || exit 1
fi

! command -v gawk > /dev/null && \
   echo "GNU awk is not installed so SRILM will probably not work correctly: refusing to install" && exit 1;

# Skip SRILM download and extraction
# if [ ! -f srilm.tgz ] && [ ! -f srilm.tar.gz ] && [ ! -d srilm ]; then
#   if [ $# -ne 4 ]; then
#       echo "SRILM download requires some information about you"
#       echo
#       echo "Usage: $0 <name> <organization> <email> <address>"
#       exit 1
#   fi

#   srilm_url="http://www.speech.sri.com/projects/srilm/srilm_download2.php"
#   post_data="file=1.7.3&name=$1&org=$2&email=$3&address=$4&license=on"

#   if ! wget --post-data "$post_data" -O ./srilm.tar.gz "$srilm_url"; then
#       echo 'There was a problem downloading the file.'
#       echo 'Check your internet connection and try again.'
#       exit 1
#   fi

#   if [ ! -s srilm.tar.gz ]; then
#       echo 'The file is empty. There was a problem downloading the file.'
#       exit 1
#   fi
# fi

mkdir -p srilm
cd srilm

# Skip extraction of SRILM package
# if [ -f ../srilm.tgz ]; then
#     tar -xvzf ../srilm.tgz || exit 1 # Old SRILM format
# elif [ -f ../srilm.tar.gz ]; then
#     tar -xvzf ../srilm.tar.gz || exit 1 # Changed format type from tgz to tar.gz
# fi

# Ensure SRILM directory exists
# if [ ! -d srilm ]; then
#     echo 'The SRILM directory does not exist. There was a problem with the extraction.'
#     exit 1
# fi

# if [ ! -f RELEASE ]; then
#     echo 'The file RELEASE does not exist. There was a problem extracting.'
#     exit 1
# fi

major=`gawk -F. '{ print $1 }' RELEASE`
minor=`gawk -F. '{ print $2 }' RELEASE`
micro=`gawk -F. '{ print $3 }' RELEASE`

if [ $major -le 1 ] && [ $minor -le 7 ] && [ $micro -le 1 ]; then
  echo "Detected version 1.7.1 or earlier. Applying patch."
  patch -p0 < ../extras/srilm.patch
fi

# set the SRILM variable in the top-level Makefile to this directory.
cp Makefile tmpf

cat tmpf | gawk -v pwd=`pwd` '/SRILM =/{printf("SRILM = %s\n", pwd); next;} {print;}' \
  > Makefile || exit 1
rm tmpf

mtype=`sbin/machine-type`

echo HAVE_LIBLBFGS=1 >> common/Makefile.machine.$mtype
grep ADDITIONAL_INCLUDES common/Makefile.machine.$mtype | \
    sed 's|$| -I$(SRILM)/../liblbfgs-1.10/include|' \
    >> common/Makefile.machine.$mtype

grep ADDITIONAL_LDFLAGS common/Makefile.machine.$mtype | \
    sed 's|$| -L$(SRILM)/../liblbfgs-1.10/lib/ -Wl,-rpath -Wl,$(SRILM)/../liblbfgs-1.10/lib/|' \
    >> common/Makefile.machine.$mtype

make || exit

cd ..
(
  [ ! -z "${SRILM}" ] && \
    echo >&2 "SRILM variable is aleady defined. Undefining..." && \
    unset SRILM

  [ -f ./env.sh ] && . ./env.sh

  [ ! -z "${SRILM}" ] && \
    echo >&2 "SRILM config is already in env.sh" && exit

  wd=`pwd`
  wd=`readlink -f $wd || pwd`

  echo "export SRILM=$wd/srilm"
  dirs="\${PATH}"
  for directory in $(cd srilm && find bin -type d ) ; do
    dirs="$dirs:\${SRILM}/$directory"
  done
  echo "export PATH=$dirs"
) >> env.sh

echo >&2 "Installation of SRILM finished successfully"
echo >&2 "Please source the tools/env.sh in your path.sh to enable it"
4. 安装线性代数库OpenBLAS,不可访问github的情况
cd ~/project/kaldi/tools/

# 下载OPENBLAS_VERSION进行手动编译
git clone https://github.com/xianyi/OpenBLAS.git
cd OpenBLAS

# 适配 CPU 核心数并加速编译
make -j 8
make PREFIX=/home/chy524/project/kaldi/tools/OpenBLAS-0.3.13/install install

# 添加到环境变量
echo 'export LD_LIBRARY_PATH=/home/chy524/project/kaldi/tools/OpenBLAS-0.3.13/install/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
echo 'export LIBRARY_PATH=/home/chy524/project/kaldi/tools/OpenBLAS-0.3.13/install/lib:$LIBRARY_PATH' >> ~/.bashrc
echo 'export C_INCLUDE_PATH=/home/chy524/project/kaldi/tools/OpenBLAS-0.3.13/install/include:$C_INCLUDE_PATH' >> ~/.bashrc
source ~/.bashrc

5.安装CUDA11.6,代码实践——准备阶段-CSDN博客有安装CUDA12.1的步骤,感觉还是11.6用的比较多
nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Tue_Mar__8_18:18:20_PST_2022
Cuda compilation tools, release 11.6, V11.6.124
Build cuda_11.6.r11.6/compiler.31057947_0

创建运行所需的虚拟环境

# 创建conda虚拟环境
conda create -n kaldi python=3.8
conda activate kaldi
# 安装Pytorch
conda install cudatoolkit=11.6 -c pytorch -c conda-forge
6.编译Kaldi代码
cd ~/project/kaldi/src
# --cudatk-dir和--openblas-root需要为自己的地址,--cuda-arch=-arch需要自己的GPU版本
./configure --shared --use-cuda=yes --cudatk-dir=/home/chy524/cuda/cuda-11.6/ --cuda-arch=-arch=sm_86 --mathlib=OPENBLAS --openblas-root=/home/chy524/project/kaldi/tools/OpenBLAS-0.3.13/install/

# 处理 Kaldi 项目中所有的依赖关系,-j 8 参数可以让 make 使用 8 个并行线程加快这个过程。
make depend -j 8 

# 开始编译 Kaldi
make -j 8 

三、跑Aishell数据集

1、数据准备部分,这些在终端都可以直接运行

# s5是语音识别模块,s5中的run.sh包含了这一模块的所有流程和代码,这是数据准备部分

 data=/home/chy524/data/aishell # 改成自己存放数据的地址
 data_url=www.openslr.org/resources/33

 . ./cmd.sh

# 我之前下载好了数据,就没运行这个
local/download_and_untar.sh $data $data_url data_aishell || exit 1;
local/download_and_untar.sh $data $data_url resource_aishell || exit 1;

# 准备词典
local/aishell_prepare_dict.sh $data/resource_aishell || exit 1;

# 准备数据,
local/aishell_data_prep.sh $data/data_aishell/wav $data/data_aishell/transcript || exit 1;

# 创建一个包含语言模型和词典的语言目录
# --position-dependent-phones false:指定是否使用与位置相关的音素。
# data/local/dict:包含字典的目录,字典包含词到音素的映射。
# "<SPOKEN_NOISE>":用于表示未在字典中定义的噪声或其他非词汇性项。
# data/local/lang:中间输出目录。
# data/lang:最终的语言目录输出
utils/prepare_lang.sh --position-dependent-phones false data/local/dict \
    "<SPOKEN_NOISE>" data/local/lang data/lang || exit 1;

2、语言模型(LM)训练,这个在终端可以直接运行,很快

local/aishell_train_lms.sh

3、语言模型的格式化,这个在终端可以直接运行,很快

        使用 utils/format_lm.sh 将语言模型(LM)转换为所需的 FST 格式,并生成 data/lang_test

utils/format_lm.sh data/lang data/local/lm/3gram-mincount/lm_unpruned.gz \
    data/local/dict/lexicon.txt data/lang_test

4、生成 MFCC 和音高特征,这个开始需要在run.sh中注释掉其他部分代码,训练会生成文件及日志,建议进行提交训练,因为需要时间蛮久的

mfccdir=mfcc
for x in train dev test; do
  steps/make_mfcc_pitch.sh --cmd "$train_cmd" --nj 10 data/$x exp/make_mfcc/$x $mfccdir || exit 1;
  steps/compute_cmvn_stats.sh data/$x exp/make_mfcc/$x $mfccdir || exit 1;
  utils/fix_data_dir.sh data/$x || exit 1;
done

exp/make_mfcc/train:训练集日志

exp/make_mfcc/dev:验证集日志

exp/make_mfcc/test:测试集日志

后面我都没有跑了,CPU跑任务都太久了,不过有同门的博客可以学习kaldi环境配置与aishell实践_kaldi 编译-CSDN博客https://blog.csdn.net/weixin_46560570/article/details/141109113?spm=1001.2014.3001.5502

 5、单音素模型

# 注释run.sh其他内容,运行./run.sh
# Train a monophone model on delta features.
steps/train_mono.sh --cmd "$train_cmd" --nj 10 \
  data/train data/lang exp/mono || exit 1;

# Decode with the monophone model.
utils/mkgraph.sh data/lang_test exp/mono exp/mono/graph || exit 1;
steps/decode.sh --cmd "$decode_cmd" --config conf/decode.config --nj 10 \
  exp/mono/graph data/dev exp/mono/decode_dev
steps/decode.sh --cmd "$decode_cmd" --config conf/decode.config --nj 10 \
  exp/mono/graph data/test exp/mono/decode_test

# Get alignments from monophone system.
steps/align_si.sh --cmd "$train_cmd" --nj 10 \
  data/train data/lang exp/mono exp/mono_ali || exit 1;

6、三音素模型(Tri1)

# 注释run.sh其他内容,运行./run.sh
# Train the first triphone pass model tri1 on delta + delta-delta features.
steps/train_deltas.sh --cmd "$train_cmd" \
 2500 20000 data/train data/lang exp/mono_ali exp/tri1 || exit 1;

# decode tri1
utils/mkgraph.sh data/lang_test exp/tri1 exp/tri1/graph || exit 1;
steps/decode.sh --cmd "$decode_cmd" --config conf/decode.config --nj 10 \
  exp/tri1/graph data/dev exp/tri1/decode_dev
steps/decode.sh --cmd "$decode_cmd" --config conf/decode.config --nj 10 \
  exp/tri1/graph data/test exp/tri1/decode_test

# align tri1
steps/align_si.sh --cmd "$train_cmd" --nj 10 \
  data/train data/lang exp/tri1 exp/tri1_ali || exit 1;

7、更高级的三音素模型(Tri2)

# train tri2 [delta+delta-deltas]
steps/train_deltas.sh --cmd "$train_cmd" \
 2500 20000 data/train data/lang exp/tri1_ali exp/tri2 || exit 1;

# decode tri2
utils/mkgraph.sh data/lang_test exp/tri2 exp/tri2/graph
steps/decode.sh --cmd "$decode_cmd" --config conf/decode.config --nj 10 \
  exp/tri2/graph data/dev exp/tri2/decode_dev
steps/decode.sh --cmd "$decode_cmd" --config conf/decode.config --nj 10 \
  exp/tri2/graph data/test exp/tri2/decode_test

# Align training data with the tri2 model.
steps/align_si.sh --cmd "$train_cmd" --nj 10 \
  data/train data/lang exp/tri2 exp/tri2_ali || exit 1;

8、Tri3a 模型

# Train the second triphone pass model tri3a on LDA+MLLT features.
steps/train_lda_mllt.sh --cmd "$train_cmd" \
 2500 20000 data/train data/lang exp/tri2_ali exp/tri3a || exit 1;
 
# Run a test decode with the tri3a model.
utils/mkgraph.sh data/lang_test exp/tri3a exp/tri3a/graph || exit 1;
steps/decode.sh --cmd "$decode_cmd" --nj 10 --config conf/decode.config \
  exp/tri3a/graph data/dev exp/tri3a/decode_dev
steps/decode.sh --cmd "$decode_cmd" --nj 10 --config conf/decode.config \
  exp/tri3a/graph data/test exp/tri3a/decode_test

# align tri3a with fMLLR
steps/align_fmllr.sh --cmd "$train_cmd" --nj 10 \
  data/train data/lang exp/tri3a exp/tri3a_ali || exit 1;
  

9 、Tri4a模型

# Train the third triphone pass model tri4a on LDA+MLLT+SAT features.
# From now on, we start building a more serious system with Speaker
# Adaptive Training (SAT).
steps/train_sat.sh --cmd "$train_cmd" \
  2500 20000 data/train data/lang exp/tri3a_ali exp/tri4a || exit 1;

# decode tri4a
utils/mkgraph.sh data/lang_test exp/tri4a exp/tri4a/graph
steps/decode_fmllr.sh --cmd "$decode_cmd" --nj 10 --config conf/decode.config \
  exp/tri4a/graph data/dev exp/tri4a/decode_dev
steps/decode_fmllr.sh --cmd "$decode_cmd" --nj 10 --config conf/decode.config \
  exp/tri4a/graph data/test exp/tri4a/decode_test
  
# align tri4a with fMLLR
steps/align_fmllr.sh  --cmd "$train_cmd" --nj 10 \
  data/train data/lang exp/tri4a exp/tri4a_ali

10、Tri5a模型

# Train tri5a, which is LDA+MLLT+SAT
# Building a larger SAT system. You can see the num-leaves is 3500 and tot-gauss is 100000

steps/train_sat.sh --cmd "$train_cmd" \
  3500 100000 data/train data/lang exp/tri4a_ali exp/tri5a || exit 1;
  
# decode tri5a
utils/mkgraph.sh data/lang_test exp/tri5a exp/tri5a/graph || exit 1;
steps/decode_fmllr.sh --cmd "$decode_cmd" --nj 10 --config conf/decode.config \
   exp/tri5a/graph data/dev exp/tri5a/decode_dev || exit 1;
steps/decode_fmllr.sh --cmd "$decode_cmd" --nj 10 --config conf/decode.config \
   exp/tri5a/graph data/test exp/tri5a/decode_test || exit 1;
   
# align tri5a with fMLLR
steps/align_fmllr.sh --cmd "$train_cmd" --nj 10 \
  data/train data/lang exp/tri5a exp/tri5a_ali || exit 1;

11、nnet3模型

        修改配置文件

# 若提示
This script is intended to be used with GPUs but you have not compiled Kaldi with CUDA
If you want to use GPUs (and have them), go to src/, and configure and make on a machine
where "nvcc" is installed.
# 解决方法
cd kaldi/src/
修改configure文件
# 将你的/usr/local/cuda /home/chy524/cuda/cuda-11.6地址添加进去
function configure_cuda {
  # Check for CUDA toolkit in the system
  if [ ! -d "$CUDATKDIR" ]; then
    for base in /usr/local/share/cuda /usr/local/cuda /home/chy524/cuda/cuda-11.6 /usr/; do
      if [ -f $base/bin/nvcc ]; then
        CUDATKDIR=$base
      fi
    done
  fi
# 再次编译kaldi
./configure --shared --use-cuda=yes --cudatk-dir=/home/chy524/cuda/cuda-11.6/ --cuda-arch=-arch=sm_86 --mathlib=OPENBLAS --openblas-root=/home/chy524/project/kaldi/tools/OpenBLAS-0.3.13/install/

make -j clean depend
make -j 16

         正式开始前需要将s5/local/nnet3/run_tdnn.sh中  --use-gpu true 修改为  --use-gpu wait 

# nnet3
local/nnet3/run_tdnn.sh

12、chain模型

# chain
local/chain/run_tdnn.sh

13、得到结果

# getting results (see RESULTS file)
for x in exp/*/decode_test; do [ -d $x ] && grep WER $x/cer_* | utils/best_wer.sh; done 2>/dev/null
for x in exp/*/*/decode_test; do [ -d $x ] && grep WER $x/cer_* | utils/best_wer.sh; done 2>/dev/null

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2309522.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据集/API 笔记:新加坡PSI(空气污染指数)API

data.gov.sg 数据范围&#xff1a;2016年2月 - 2025年3月 1 获取API方式 curl --request GET \--url https://api-open.data.gov.sg/v2/real-time/api/psi 2 返回数据 API 的数据结构可以分为 3 大部分&#xff1a; 区域元数据&#xff08;regionMetadata&#xff09; →…

【GPU使用】如何在物理机和Docker中指定GPU进行推理和训练

我的机器上有4张H100卡&#xff0c;我现在只想用某一张卡跑程序&#xff0c;该如何设置。 代码里面设置 import os # 记住要写在impot torch前 os.environ[CUDA_VISIBLE_DEVICES] "0, 1"命令行设置 export CUDA_VISIBLE_DEVICES0,2 # Linux 环境 python test.py …

【Java项目】基于SpringBoot的CSGO赛事管理系统

【Java项目】基于SpringBoot的CSGO赛事管理系统 技术简介&#xff1a;采用SpringBoot框架、Java语言、MySQL数据库等技术实现。 系统简介&#xff1a;CSGO赛事管理系统是一个基于B/S架构的管理系统&#xff0c;主要功能包括前台和后台管理模块。前台系统功能模块分为&#xf…

MIPI接口:(4)MIPI CSI-2协议详解(上)

1. 什么是CSI&#xff1f; CSI&#xff08;Camera Serial Interface&#xff09;是MIPI联盟早期制定的摄像头接口标准&#xff0c;主要用于连接摄像头和处理器。 CSI-2是CSI的第二代版本&#xff0c;在原有基础上进行了全面优化&#xff1a; &#xff08;1&#xff09;分层架…

防火墙旁挂组网双机热备负载均衡

一&#xff0c;二层交换网络&#xff1a; 使用MSTPVRRP组网形式 VLAN 2--->SW3为主,SW4 作为备份 VLAN 3--->SW4为主,SW3 作为备份 MSTP 设计 --->SW3 、 4 、 5 运行 实例 1 &#xff1a; VLAN 2 实例 2 &#xff1a; VLAN 3 SW3 是实例 1 的主根&#xff0c;实…

视频教育网站开源系统的部署安装 (roncoo-education)服务器为ubuntu22.04.05

一、说明 前端技术体系&#xff1a;Vue3 Nuxt3 Vite5 Vue-Router Element-Plus Pinia Axios 后端技术体系&#xff1a;Spring Cloud Alibaba2021 MySQL8 Nacos Seata Mybatis Druid redis 后端系统&#xff1a;roncoo-education&#xff08;核心框架&#xff1a;S…

CF 886A.ACM ICPC(Java实现)

题目分析 输入6个值&#xff0c;判断某三个值的和能够等于另外三个值的和 思路分析 首先判断总和是不是一个偶数&#xff0c;如果不是就“NO”。由于小何同学算法不好&#xff0c;只能使用三层for循环强行判断某三个值是否能等于总和的一半&#xff0c;可以就“YES”。 代码 …

Spring Boot 自动装配深度解析与实践指南

目录 引言&#xff1a;自动装配如何重塑Java应用开发&#xff1f; 一、自动装配核心机制 1.1 自动装配三大要素 1.2 自动装配流程 二、自定义自动配置实现 2.1 创建自动配置类 2.2 配置属性绑定 2.3 注册自动配置 三、条件注解深度应用 3.1 常用条件注解对比 3.2 自定…

【windows driver】 开发环境简明安装教程

一、下载路径 https://learn.microsoft.com/en-us/windows-hardware/drivers/other-wdk-downloads 二、安装步骤&#xff1a; 1、安装Visual Studio IDE 笔者建议安装最新版本&#xff0c;可以向下兼容。发文截止到目前&#xff0c;VS2022是首选&#xff0c;当前笔者由于项…

探秘基带算法:从原理到5G时代的通信变革【八】QAM 调制 / 解调

文章目录 2.7 QAM 调制 / 解调2.7.1 概述2.7.2 星座图星座图的结构与性能发射端的信息编码与接收端的解码差分编码的分类与实现差分编码的模4格雷加法器公式16QAM星座图与映射关系 2.7.3 信号表达式正交振幅调制的基本原理与系统分析相位误差对QAM性能的影响多电平正交振幅调制…

Flink性能指标详解MetricsAnalysis

文章目录 Flink 组成1.JobManager2.TaskManager3.ResourceManager4.Dispatcher5.Client6. Env JobManager MetricsTaskManager Metrics Flink 组成 1.JobManager 管理任务 作业调度&#xff1a;负责接收和调度作业&#xff0c;分配任务到 TaskManager。资源管理&#xff1a;…

Halcon 车牌识别-超精细教程

车牌示例 流程: 读取图片转灰度图阈值分割,找车牌内容将车牌位置设置变换区域形状找到中心点和弧度利用仿射变换,斜切车牌旋转转正,把车牌抠出来利用形态学操作拼接车牌号数字训练ocr开始识别中文车牌 本文章用到的算子(解析) Halcon 算子-承接车牌识别-CSDN博客 rgb1_to_gray…

Redis实战篇《黑马点评》8 附近商铺

8.附近商户 8.1GEO数据结构的基本用法 GEO就是Geolocation的简写形式&#xff0c;代表地理坐标。Redis在3.2版本中加入了对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;帮助我们根据经纬度来检索数据&#xff0c;常见的命令有 GEOADD&#xff1a;添加一个地理空间…

【02】Cocos游戏开发引擎从0开发一款游戏-cocos项目目录结构熟悉-调试运行项目-最重要的assets资源文件认识-场景sense了解-优雅草卓伊凡

【02】Cocos游戏开发引擎从0开发一款游戏-cocos项目目录结构熟悉-调试运行项目-最重要的assets资源文件认识-场景sense了解-优雅草卓伊凡 开发背景 接下来我们直接打开我们的项目开始进一步操作&#xff0c; 实战开发 导入项目 我把得到的项目解压到本地&#xff0c;我们开…

kafka-web管理工具cmak

一. 背景&#xff1a; 日常运维工作中&#xff0c;采用cli的方式进行kafka集群的管理&#xff0c;还是比较繁琐的(指令复杂&#xff1f;)。为方便管理&#xff0c;可以选择一些开源的webui工具。 推荐使用cmak。 二. 关于cmak&#xff1a; cmak是 Yahoo 贡献的一款强大的 Apac…

Unity中动态切换光照贴图LightProbe的方法

关键代码&#xff1a;LightmapSettings.lightmaps lightmapDatas; LightmapData中操作三张图&#xff1a;lightmapColor,lightmapDir,以及一张ShadowMap 这里只操作前两张&#xff1a; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public cl…

C++基础知识(七)之STL算法、智能指针、文件操作、C++异常、断言

二十一、STL算法 STL提供了很多处理容器的函数模板&#xff0c;它们的设计是相同的&#xff0c;有以下特点&#xff1a; 1&#xff09;用迭代器表示需要处理数据的区间。 2&#xff09;返回迭代器放置处理数据的结果&#xff08;如果有结果&#xff09;。 3&#xff09;接受…

【Linux】线程概念与控制

线程概念与控制 一.Linux线程概念1.什么是线程&#xff1f;2.分页式存储管理1.虚拟地址和页表的由来2.物理内存管理3.页表4.页目录结构5.两级页表的地址转换6.缺页中断(异常) 3.线程的优点(面试题)4.线程的缺点5.线程异常6.线程用途 二.Linux进程VS线程1.进程和线程2.进程的多个…

电子电路中,正负双电源供电的需求原因

1. 允许信号双向摆动 - **交流信号的处理**&#xff1a;许多电路&#xff08;如音频放大器、运算放大器&#xff09;需要处理正负交替变化的交流信号&#xff08;例如声音信号、传感器输出&#xff09;。如果仅用单正电源&#xff08;如12V&#xff09;&#xff0c;信号的“负…

ROS环境搭建

ROS首次搭建环境 注&#xff1a;以下内容都是在已经安装好ros的情况下如何搭建workplace 一、创建工作空间二、创建ROS包三、注意 注&#xff1a;以下内容都是在已经安装好ros的情况下如何搭建workplace 如果没有安装好&#xff0c;建议鱼香ros一步到位:鱼香ROS 我也是装了好久…