Kaldi语音识别学习记录-----编译安装

2023-11-07

语音识别领域的开源框架有CMUSphinx、HTK、Kaldi等等,而目前仍然比较活跃,且工程价值较高的就数Kaldi,很多从事语音方面的公司,都使用该框架训练自己的语音识别能力,由于其内部代码逻辑较为复杂,故这里一步一步来解读,了解语音识别的内部原理,并期望自定义,实现业务场景下的语音识别、语音唤醒等引擎。

一、准备工作

学习kaldi需要一定的语言基础,尤其是C++,基本上工具以及代码都是基于C++语言实现起来的,所以它相对python等语言还是有一定的门槛,大家在学习工作中,多读多写。从事算法研究方向,对于这门语言还是硬要求的,算法的工程化实现最好也是用C/C++来实现,确保性能。

硬件:x86_64 服务器一台(32C 128G),没有条件的小伙伴可以用PC机或虚拟机环境(编译及运行速度较慢)

操作系统:CentOS7.4 64bit

二、Kaldi下载

一般开源组件都在使用git作为版本控制,Kaldi也不例外,版本放在github上进行代码管理

先安装git工具

# yum install git

下载Kaldi源码

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

三、Kaldi编译

kaldi下载完成后,需要先编译其依赖的第三方组件,一般在tools目录下,其安装脚本依赖系统命令,请提前自行安装automake、autoconf、libtool、g++、wget

# cd tools
# make

执行后会依次安装openfst、mkl、sctk、sph2pipe等工具,实际在编译过程中会出现报错,主要是由于sctk代码使用c++11,手动添加编译标志c++11

make[2]: 进入目录“/home/songwang/kaldi/tools/sctk-20159b5/src”
(cd asclite && if test -f makefile ; then make all ; fi)
make[3]: 进入目录“/home/songwang/kaldi/tools/sctk-20159b5/src/asclite”
(cd core && if test -f makefile ; then make all ; fi)
make[4]: 进入目录“/home/songwang/kaldi/tools/sctk-20159b5/src/asclite/core”
g++ -c  -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DHAVE_LIBM=1 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRING_H=1 -DHAVE_STDIO_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MATH_H=1 -DHAVE_TIME_H=1 -DHAVE_ASSERT_H=1 -DHAVE_FLOAT_H=1 -DHAVE_LIMITS_H=1  -I. -w -march=native  -w -march=native recording.cpp
In file included from /usr/include/c++/4.8.2/array:35:0,
                 from sgml_reportgenerator.h:29,
                 from recording.h:35,
                 from recording.cpp:24:
/usr/include/c++/4.8.2/bits/c++0x_warning.h:32:2: 错误:#error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
 #error This file requires compiler and library support for the \
  ^
make[4]: *** [recording.o] 错误 1
make[4]: 离开目录“/home/songwang/kaldi/tools/sctk-20159b5/src/asclite/core”
make[3]: *** [all] 错误 2
make[3]: 离开目录“/home/songwang/kaldi/tools/sctk-20159b5/src/asclite”
make[2]: *** [all] 错误 2
make[2]: 离开目录“/home/songwang/kaldi/tools/sctk-20159b5/src”
make[1]: *** [all] 错误 2
make[1]: 离开目录“/home/songwang/kaldi/tools/sctk-20159b5”
make: *** [sctk/.compiled] 错误 2

修改方式为src下Makefile文件,增加-std=c++11标志:

SCTK_CXFLAGS = -w -march=native -std=c++11

依赖组件安装完成后,进入src源码编译静态库及工具,这里关闭cuda,不使用GPU,不设置的话默认开启

# cd src
# ./configure --use-cuda=no --static

执行完后生成Makefile文件,但是这里为了便于后续其他动态库集成Kaldi静态库,加入-fPIC标志,修改Makefile文件:

CXXFLAGS = -fPIC -std=c++11 -I.. -isystem $(OPENFSTINC) -O1 \

执行编译操作,耗时较久,可以使用多进程编译方式,服务器环境下相对速度较快

# make depend -j 32
# make -j 32

编译完成后,可以把相关的文件拷贝出来,静态库如下:

# find src/ -name *.a | xargs -i cp {} /data/kaldi/lib_x64

头文件使用shell脚本拷贝,具体实现方式可自行根据实际情况考虑:

output=$1
dir=`pwd`
filelist=`ls $dir`
for file in $filelist:
do
	if [ -d $file ];then
		echo $file
		cd $file
		mkdir -p $output/$file
		cp -f *.h $output/$file
		cd ..
	fi
done

至此,Linux x64环境下的组件编译完成,笔者也编译了一套arm aarch64平台下的Kaldi库,相对坑比较多,后续有时间再更新

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kaldi语音识别学习记录-----编译安装 的相关文章

  • 访问特征矩阵的行向量时复制或引用

    我正在使用的代码Eigen http eigen tuxfamily org index php title Main Page矩阵库 我注意到在整个代码中 有如下访问器 RowVector3f V size t vertex index
  • 检查数据库中是否存在记录

    我正在使用这些代码行来检查记录是否存在 SqlCommand check User Name new SqlCommand SELECT FROM Table WHERE user txtBox UserName Text conn int
  • ASP.NET 如何在 Web API 中读取多部分表单数据?

    我将多部分表单数据发送到我的 Web API 如下所示 string example my string HttpContent stringContent new StringContent example HttpContent fil
  • ptrace和waitpid有什么关系?

    我正在练习使用ptrace但我不太了解它和之间的关系waitpid 这是我的测试程序 int main int argc char argv pid t pid 22092 if ptrace PTRACE ATTACH pid NULL
  • 如何准备sql语句并绑定参数?

    不幸的是 文档 http www sqlite org完全缺乏示例 这真的很奇怪 就好像它假设所有读者都是优秀的程序员一样 然而 我对C 并且无法真正从文档中弄清楚如何真正准备和执行语句 我喜欢它的实施方式PDO for PHP 通常 我只
  • 如何进行Visual Studio格式字典初始化?

    所有 Visual Studio 也包括 2012 不格式化以下内容 messageProcessor new Dictionary
  • C++ 中可以使用匿名类作为返回类型吗?

    有没有办法在 C 中使用匿名类作为返回类型 我用谷歌搜索这可能有效 struct Test fun 但是这段代码无法编译 错误信息是 新类型不能在返回类型中定义 其实代码没有任何意义 我只是想弄清楚匿名类是否可以用作C 中的返回类型 这是我
  • 为什么下面的重叠比较总是评估为 true

    我不明白为什么以下代码有警告 指出重叠比较始终评估为真 接下来的语句永远不会被执行 QVariant MainModel data const QModelIndex index int role const if index isVali
  • Bazel:将编译标志添加到默认 C++ 工具链

    我想向默认的 C 工具链添加一些编译器和链接器标志 以便我构建的所有目标 本地或导入 共享它们 我知道可以定义我自己的工具链 但我不想这样做 因为它非常复杂且容易出错 理想情况下我想要这样的东西 cc toolchain cc defaul
  • VS C# 中的依赖地狱,找不到依赖项

    我创建了一个图表 C 库 我们称之为chartlibrary 它本身依赖于多个第三方 dll 文件 在另一个可执行项目中 我们称之为chartuser 我参考了chartlibrary项目 两个项目位于 Visual Studio 中的同一
  • C++ 更改屏幕方向问题 -- DEVMODE dmDisplayOrientation DMDO_90 undefined

    我似乎无法编译一些 C 代码 我正在翻转显示器的方向 但 VS2008 告诉我 DMDO 90 和 DMDO 270 无法识别 error C2065 DMDO 90 undeclared identifier error C2065 DM
  • 多个包含带有变量定义的头文件

    我只是构建一个简单的 C 项目 代码如下所示 head h ifndef HEAD H define HEAD H int my var 100 endif src1 cpp include head h src2 cpp include
  • C# 从今天起 30 天

    我需要我的应用程序从今天起 30 天后过期 我会将当前日期存储在应用程序配置中 如何检查应用程序是否已过期 我不介意用户是否将时钟调回来并且应用程序可以正常工作 用户太愚蠢而不会这样做 if appmode Trial string dat
  • 在 boost 元组、zip_iterator 等上使用 std::get 和 std::tie

    我有哪些使用选择std get lt gt and std tie lt gt 与增强结构一起 例子 我想使用基于范围的 for 循环在多个容器上进行迭代 我可以实施zip函数 它使用boost zip iterator include
  • 来自用户定义文字的整数字符序列,以字符串作为参数

    目前 只有双精度数可以在用户定义的文字中生成字符模板 template
  • 为什么在 C++ 类中的数据成员上使用像 m_ 这样的前缀?

    许多 C 代码使用语法约定来标记数据成员 常见的例子包括 m memberName对于公共成员 在所有使用公共成员的情况下 memberName对于私人会员或所有会员 其他人尝试强制使用this gt member每当使用数据成员时 根据我
  • 提升shared_from_this<>()

    有人可以用几句话概括一下如何提升shared from this lt gt 应该使用智能指针 特别是从使用绑定函数在 io service 中注册处理程序的角度来看 编辑 一些回复要求提供更多背景信息 基本上 我正在寻找 陷阱 即人们使用
  • 为什么 getch 不可移植?

    是什么使得 getch 本质上无法作为标准 C 函数包含在内 对于控制台界面来说 它是如此直观和优雅 如果没有它 要求输入单个字符总是会产生误导 因为用户可以输入多个键 更糟糕的是 您经常需要确保在读取控制台输入后清除标准输入 这甚至不是作
  • Cordova 上的 ClearCookiesAsync()

    我正在尝试使用 wp8 cordova 中的插件来清除 WebBrowser cookie 我已经让它与 JavaScript 进行通信 并且我的 c 文件中有类似这样的内容 using WPCordovaClassLib Cordova
  • 使用 ImageResizer 获取图像尺寸的最佳方法

    我正在将现有的 MVC 4 网站从自制用户文件上传切换为在上传时使用 ImageResizer 调整文件大小 我在文档中看到我不应该使用 System Drawing 但我无法找出任何其他获取图像尺寸的方法 尺寸是来自原始图像还是调整大小的

随机推荐

  • 开窗函数 OVER(PARTITION BY)函数介绍

    开窗函数 分析函数用于计算基于组的某种聚合值 它和聚合函数的不同之处是 对于每个组返回多行 而聚合函数对于每个组只返回一行 开窗函数指定了分析函数工作的数据窗口大小 这个数据窗口大小可能会随着行的变化而变化 排序 即便值一样 也不会出现重复
  • java与数据库的相关小知识

    1 软编码链接数据库 public class DBManager private Connection con public Connection getCon String driverClass null String jdbcUrl
  • 实现物体的移动--刚体和代码中操控位置移动

    文章目录 实现物体的移动 先让物体有碰撞体积 给物体绑定刚体 实现物体的移动 先让物体有碰撞体积 给物体绑定刚体 其他的属性和使用方法可以到文档里查看 文档真的超级详细 但是光有碰撞规则是不行的 我们要为它加一个刚体 将对应函数绑定好 然后
  • 计算机网络设置中如何删除家庭组,【求助】Windows无法从该家庭组中删除你的计算机...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 echo 服务名称fdPHost 显示名称Function Discovery Provider Host 进程svchost exe echo DEMAND或DISABLED或AUTO 手动
  • 树莓派 安装Arch Linux ARM

    首先 需要一个linux环境 archlinuxarm系统的安装需要用linux环境复制文件 把sd卡或tf卡连接到装有linux环境的电脑上 首先 确定自己树莓派的型号是b 2b 还是3b 选择合适版本 打开终端 并获得超级权限 sudo
  • Sonar Java默认扫描规则

    规则如下 equals should not be used to test the values of Atomic classes equals 方法不应该用在原子类型的数据上 如 AtomicInteger AtomicLong At
  • MCDF实验——Lab4

    在之前的Lab3中 通过一个初具规模的MCDT的验证环境 学习到 验证环境按照隔离的观念 应分为硬件DUT 软件验证环境 和处于信号媒介的接口interface 对于软件验证环境 需要经历建立阶段 build 连接阶段 connect 产生
  • 浅谈项目售前调研

    一 概述 说到软件项目的售前调研工作 可能还得先谈谈售前顾问这个重要的角色 在IT软件行业 售前顾问位于职业金字塔顶端 是项目开发 实施人员与销售人员间的纽带和桥梁 在销售人员眼中 售前顾问扮演的是技术专家的角色 而在项目实施和开发人员眼中
  • 中兴网络设备交换机路由器查看日志命令方法

    描述 中兴网络设备交换机路由器查看日志命令方法 命令 show logfile
  • 小程序如何实现本地去水印

    自媒体时代 很多人都进行伪原创 但是有些视频本身就有水印的 这个时候我们怎么办 很多人都不懂这个方法 所以导致很多人不会使用 一般都是电脑操作 那我们就没有办法了吗 今天介绍的就是小程序如何实现本地去水印 我们也知道FFmpeg命令 去掉视
  • 波形分析软件 android,新版 PicoScope 软件提供更出色的波形分析和功能 – 免费获取!...

    全球领先的 PC 示波器制造商 Pico Technology Ltd 发布了 PicoScope 软件 6 11 7 版 此版本的 PicoScope 可为研发新一代电气和电子技术的工程师 科学家 技术人员和研究人员提供重要的新功能 本文
  • wifi感知---csi技术

    CSI在WiFi研究领域指Channel State Information 也就是通过接收到的WiFi信号来估计WiFi信号的传播信道长什么样子 它表征了一系列影响的综合 例如散射 衰落 能量随着距离的衰减 目前人们可以从CSI里提取到很
  • C#文件读写小案例

    目录 1 驱动器管理类 2 目录管理类 3 文件管理类 4 路径管理类 5 FileStream类读取文件 6 StreamReader类读取文件 7 使用FileStream类写入文件 用FileStream类写入文件可以指定要写入的位置
  • 逐个版本分析鬼火引擎

    这段时间做手游的cocos2dx的学习 和做web开发的项目 感觉很没劲 还是得研究引擎 我看到有个人的博客直接分析鬼火引擎0 1版本 这个方法不错 两万行左右代码 sourceforge里面有各个版本的代码 这样 正好可以循序渐进地进行
  • Maven导包及打包

    Maven是什么 Maven是一个跨平台的项目管理工具 作为Apache组织的一个颇为成功的开源项目 其主要服务于基于Java平台的项目创建 依赖管理和项目信息管理 是一个自动化构建工具 maven是Apache的顶级项目 解释为 专家 内
  • org.springframework.web.bind.annotation 注解详解

    处理request RequestBody RequestHeader RequestMapping RequestParam RequestPart CookieValue PathVariable 传送门 处理response Resp
  • Python算法教程:强连通分量

    强连通分量 strongly connected components SCCs 是一个能让有向路径上所有节点彼此到达的最大子图 Kosaraju的查找强连通分量算法 def strongly connected components gr
  • Windows下 VS2015编译RocksDB

    Windows下 VS2015编译RocksDB VS2015编译RocksDB RocksDB 是一个来自 facebook 的可嵌入式的支持持久化的 key value 存储系统 也可作为 C S 模式下的存储数据库 但主要目的还是嵌入
  • unity Input.GetAxis()函数

    开发手册上有相关解释 但说得很不清楚 看完也不懂 下面给出详细的解释 根据输入设备 参数分为两类 一 触屏类 1 Mouse X 鼠标沿屏幕X移动时触发 2 Mouse Y 鼠标沿屏幕Y移动时触发 3 Mouse ScrollWheel 鼠
  • Kaldi语音识别学习记录-----编译安装

    语音识别领域的开源框架有CMUSphinx HTK Kaldi等等 而目前仍然比较活跃 且工程价值较高的就数Kaldi 很多从事语音方面的公司 都使用该框架训练自己的语音识别能力 由于其内部代码逻辑较为复杂 故这里一步一步来解读 了解语音识