当前位置: 首页 >  技术分享 >  ASR项目实战-构建Kaldi

ASR项目实战-构建Kaldi

导读:准备工作.安装构建时依赖的基础软件.软件清单如下:.bzip2.python3.automake.libtool.cmake.gcc.g++.gfortran.git.subversion.不同平台安装软件的方式不同,比如可以使用yum或者apt-get等。.下载开源软件.软件清

准备工作

安装构建时依赖的基础软件

软件清单如下:

  • bzip2
  • python3
  • automake
  • libtool
  • cmake
  • gcc
  • g++
  • gfortran
  • git
  • subversion

不同平台安装软件的方式不同,比如可以使用yum或者apt-get等。

下载开源软件

软件清单如下:

  • Libunwind
  • glog
  • OpenFST
  • OpenBLAS
  • Kaldi

按照一定的规则,将下载后的文件放在指定目录,如下是样例

opensrc
    glog
        glog-0.4.0.zip
    Libunwind
        libunwind-1.3.1-src.zip
    Kaldi
        kaldi-master.zip
    OpenFST
        openfst-1.6.7.tar.gz
    OpenBLAS
        OpenBLAS-0.3.6.tar.gz
install
    usr
        local
            bin
            sbin
            include
            lib
            lib64
script
    build.sh

构建脚本

build.sh的内容,如下为样例:

BUILD_CORE_NUM=8
SCRIPT_FILE=`readlink -f $0`
SCRIPT_ROOT=`dir ${SCRIPT_FILE}`
BUILD_ROOT=`dir ${SCRIPT_ROOT}`
SOURCE_ROOT=${BUILD_ROOT}/opensrc

INSTALL_ROOT=${BUILD_ROOT}/install/usr/local
export INSTALL_ROOT
PATH=${INSTALL_ROOT}/bin:${INSTALL_ROOT}/sbin:${PATH}
export PATH
LD_LIBRARY_PATH=${INSTALL_ROOT}/lib:${INSTALL_ROOT}/lib64:${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH

# Libunwind
VERSION=1.3.1
BUILD_LOG=${SCRIPT_ROOT}/Libunwind.out

rm -f ${BUILD_LOG}
touch ${BUILD_LOG}
cd ${SOURCE_ROOT}/Libunwind
rm -rf libunwind-${VERSION}
unzip -o libunwind-${VERSION}-src.zip
tar vxfz libunwind-${VERSION}.tar.gz
cd libunwind-${VERSION}
./autogen.sh
CFLAGS="-fPIC -I${INSTALL_ROOT}/include" \
    ./configure \
      >> ${BUILD_LOG} 2>&1
make -j${BUILD_CORE_NUM} >> ${BUILD_LOG} 2>&1
make install prefix=${INSTALL_ROOT} >> ${BUILD_LOG} 2>&1

# glog
VERSION=0.4.0
BUILD_LOG=${SCRIPT_ROOT}/glog.out

rm -f ${BUILD_LOG}
touch ${BUILD_LOG}
cd ${SOURCE_ROOT}/glog
rm -rf glog-${VERSION}
tar vxfz glog-${VERSION}.tar.gz
cd glog-${VERSION}
./autogen.sh
CXXFLAGS="-fPIC -I${INSTALL_ROOT}/include" \
    LDFLAGS="-L${INSTALL_ROOT}/lib -L${INSTALL_ROOT}/lib64" \
    ./configure \
    --prefix=${INSTALL_ROOT} \
    >> ${BUILD_LOG} 2>&1
make -j${BUILD_CORE_NUM} >> ${BUILD_LOG} 2>&1
make install >> ${BUILD_LOG} 2>&1

# OpenBLAS
VERSION=0.3.6
BUILD_LOG=${SCRIPT_ROOT}/OpenBLAS.out

rm -f ${BUILD_LOG}
touch ${BUILD_LOG}
cd ${SOURCE_ROOT}/OpenBLAS
rm -rf OpenBLAS-${VERSION}
rm -f OpenBLAS
tar vxfz OpenBLAS-${VERSION}.tar.gz
ln -s OpenBLAS-${VERSION} OpenBLAS
cd OpenBLAS-${VERSION}
make -j${BUILD_CORE_NUM} >> ${BUILD_LOG} 2>&1
make PREFIX=${INSTALL_ROOT} install >> ${BUILD_LOG} 2>&1

# OpenFST
VERSION=1.6.7
BUILD_LOG=${SCRIPT_ROOT}/OpenFST.out

rm -f ${BUILD_LOG}
touch ${BUILD_LOG}
cd ${SOURCE_ROOT}/OpenFST
rm -rf openfst-${VERSION}
tar vxzf openfst-${VERSION}.tar.gz
cd openfst-${VERSION}
CXXFLAGS="-fPIC -I${INSTALL_ROOT}/include" \
    CFLAGS="-fPIC -I${INSTALL_ROOT}/include" \
    LDFLAGS="-L${INSTALL_ROOT}/lib -L${INSTALL_ROOT}/lib64" \
    LIBS="${INSTALL_ROOT}/lib/libglog.a -pthread -lunwind" \
    ./configure \
    --enable-static \
    --enable-shared \
    --enable-far \
    --enable-ngram-fsts \
    --prefix=${INSTALL_ROOT} \
    >> ${BUILD_LOG} 2>&1
make -j${BUILD_CORE_NUM} >> ${BUILD_LOG} 2>&1
make install >> ${BUILD_LOG} 2>&1

# Kaldi
VERSION=master
BUILD_LOG=${SCRIPT_ROOT}/Kaldi.out

rm -f ${BUILD_LOG}
touch ${BUILD_LOG}
cd ${SOURCE_ROOT}/Kaldi
rm -rf kaldi-${VERSION}.zip
rm -f kaldi
unzip kaldi-${VERSION}.zip
cd kaldi-${VERSION}/src
CXXFLAGS="-fPIC -I${INSTALL_ROOT}/include" \
    ./configure \
    --static \
    --openblas-root=${INSTALL_ROOT} \
    --static-math=yes \
    --threaded-math=yes \
    --static-fst=yes \
    --fst-version=1.6.7 \
    --fst-root=${INSTALL_ROOT} \
    --use-cuda=no \
    >> ${BUILD_LOG} 2>&1
make clean -j${BUILD_CORE_NUM} >> ${BUILD_LOG} 2>&1
make depend -j${BUILD_CORE_NUM} >> ${BUILD_LOG} 2>&1
make -j${BUILD_CORE_NUM} >> ${BUILD_LOG} 2>&1

注意事项

OpenFST自身实现一套日志系统,与glog集成时会报符号冲突。当前有用户在官网上提出类似的问题,但没有官方的答复。为了完整利用glog的能力,需要对OpenFST的实现做一定的修改。
修改点主要涉及如下几个文件:

  • src/include/log.h,删除代码中相关的类和变量的定义。

    #include <fst/types.h>
    

    #include

    using std::string; // 删除中间出现的代码 #define ATTRIBUTE_DEPRECATED attribute((deprecated))

    #endif

  • src/include/flags.h,在头部引入glog的头文件,增加如下代码:

    #include <fst/types.h>
    

    #include #include “glog/logging.h” // 引入glog的头文件 using std::string;

  • src/lib/flags.cc,删除同名的变量。

    // DEFINE_int32(v, 0, "verbosity level");
    
内容
  • [Lua][Love] "图块集与地图" 加载显示功能 TileMap
    [Lua][Love] "图块集
    2023-12-05
    效果.安装库.安装两个库,分别用来读xml和csv,如果有luarocks,执行下列命令.luarocks instal
  • UE构建基础和实践:一、概述
    UE构建基础和实践:一、概述
    2023-12-04
    序言.构建这个概念是和应用程序包及资源等相关的,它的特点是使用脚本控制一系列的任务的处理,以减少人力操作带来的成本和操作
  • 带你了解基于Ploto构建自动驾驶平台
    带你了解基于Ploto构建自动驾
    2023-12-04
    摘要: 华为云Solution as Code推出基于Ploto构建自动驾驶平台解决方案。.本文分享自华为云社区《基于P
  • 时尚个性针织毛衣
    时尚个性针织毛衣
    2023-12-11
    时尚个性针织毛衣.时尚个性针织毛衣一直是秋冬季节的必备单品,不仅可以很好地保暖,还能展现出个性与时尚。无论是女性还是男性
  • 休闲简约短袖衬衫
    休闲简约短袖衬衫
    2023-12-21
    休闲简约短袖衬衫.现代人生活节奏快,休闲简约的穿着成为时尚潮流。短袖衬衫作为经典的休闲单品,一直备受时尚人士的青睐。它舒
  • 经典款皮鞋
    经典款皮鞋
    2023-12-06
    经典款皮鞋.经典款皮鞋一直是时尚界的永恒之选,不论是商务场合、休闲聚会还是正式场合,都能展现出绅士淑女的气质和优雅。今天
  • 修身弹力牛仔裤
    修身弹力牛仔裤
    2023-12-26
    修身弹力牛仔裤:展现你的魅力.一、时尚的必备单品.修身弹力牛仔裤一直都是时尚界的必备单品,它不仅可以展现出个人的魅力,还
  • 可爱儿童内衣套装,优质棉质,柔软透气,呵护宝宝肌肤
    可爱儿童内衣套装,优质棉质,柔软
    2024-01-05
    可爱儿童内衣套装,优质棉质,柔软透气,呵护宝宝肌肤.宝宝的皮肤是非常娇嫩的,所以选择合适的内衣套装对于宝宝的健康和舒适至
  • 优雅复古半身裙,散发优雅复古气息
    优雅复古半身裙,散发优雅复古气息
    2024-01-15
    优雅复古半身裙,散发优雅复古气息.复古是一种永不过时的时尚趋势,它总能让人们联想到过去的美好时光。而半身裙则是女性衣橱里
  • 时尚修身连衣裙,展现优雅女性魅力
    时尚修身连衣裙,展现优雅女性魅力
    2023-12-06
    时尚修身连衣裙,展现优雅女性魅力.时尚修身连衣裙一直是女性衣橱里的必备单品,不仅款式多样,而且能够展现出女性的优雅魅力。
  • 潮流风衣大衣,彰显都市时尚风采
    潮流风衣大衣,彰显都市时尚风采
    2023-12-16
    潮流风衣大衣,彰显都市时尚风采.潮流风衣大衣一直是时尚界备受追捧的单品之一。它既能为我们遮风挡雨,又能为我们穿出时尚感,
  • 暖心家居服套装,柔软舒适,可爱**形象,让宝宝安心入睡
    暖心家居服套装,柔软舒适,可爱*
    2023-12-16
    暖心家居服套装,让宝宝安心入睡.宝宝的睡眠质量对成长发育至关重要,而穿着舒适的家居服对宝宝的睡眠质量有着直接的影响。为了
  • 时尚儿童牛仔裤,经典款式,耐穿耐磨,让宝宝更有个性
    时尚儿童牛仔裤,经典款式,耐穿耐
    2024-01-10
    时尚儿童牛仔裤引领潮流.时尚儿童牛仔裤一直是儿童服装中的经典款式,不仅经典耐穿,而且可以展现宝宝的个性。随着时尚的发展,