kaldi的编译安装与报错解决方法

本文详细介绍在Ubuntu16.04环境下,从零开始编译安装Kaldi语音识别工具的过程,包括解决编译中遇到的权限问题及MKL安装失败的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引入

kaldi是语音识别领域,最常用的一个工具。

它自带了很多特征提取模块,能提取MFCC/ivector/xvector等语音特征;也自带了很多语音模型代码,可以直接使用或重新训练GMM-HMM等模型;它还支持GPU进行训练。可以说是功能很强大了。

更厉害的是,你只需要简单的SHELL编程,就能使用kaldi。kaldi作为一个工具,不需要像库一样进行大量编程,所以使用门槛其实不高。

但是,它并没有做到像tensorflow/keras这样非常容易的安装配置。kaldi是需要自己在不同平台上重新编译,才能使用的。这就需要我们配置编译环境,以及各种编译依赖。

虽然有一个python版本的pykaldi,但它只是一个wrapper,底层还是得自己重新编译安装kaldi才能使用。并且笔者和pykaldi的研发人员交流过,它目前并不支持kaldi的所有功能。感兴趣的读者可以查看这里(https://github.com/pykaldi/pykaldi/issues/101)。

相信很多新手在编译kaldi时,都遇到过很多问题。网上有一些资料(虽然有的比较老,与目前的编译方式不一样了),也能搜到一些解决方法,但笔者还是遇到了不少需要自己解决的问题。

所以把自己编译安装kaldi的过程,以及遇到问题的解决方法记录在此,供参考。

编译安装kaldi

我的系统是Linux Ubuntu 16.04。具体过程如下

  1. 安装一些依赖工具与第三方库
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install git
sudo apt-get install bc
sudo apt-get install g++
sudo apt-get install zlib1g-dev make automake autoconf bzip2 libtool subversion
sudo apt-get install libatlas3-base
  1. 下载kaldi,目前kaldi最新版本的代码都是在github(早期的老版本是在svn)
git clone https://github.com/kaldi-asr/kaldi.git
cd kaldi/tools
  1. 用kaldi自带的脚本check_dependencies.sh来检测是否安装完所有必须的依赖工具
extras/check_dependencies.sh

根据提示安装必须的依赖。我这里提示缺少MKL,也提示了需要用tools目录下自带的脚本extras/install_mkl.sh来安装MKL。

  1. 安装MKL

运行脚本extras/install_mkl.sh

extras/install_mkl.sh

安装过程中报错如下:

AppStream cache update completed, but some metadata was ignored due to errors.
Reading package lists... Done
E: Failed to fetch http://security.ubuntu.com/ubuntu/dists/xenial-security/multiverse/dep11/Components-amd64.yml  Could not open file /var/lib/apt/lists/parti
al/security.ubuntu.com_ubuntu_dists_xenial-security_multiverse_dep11_Components-amd64.yml.xz - open (13: Permission denied) [IP: 91.xxx.88.xxx 80]
E: Some index files failed to download. They have been ignored, or old ones used instead.
extras/install_mkl.sh: MKL package intel-mkl-64bit-2019.2-057 installation FAILED.

Please open an issue with us at https://github.com/kaldi-asr/kaldi/ if you
believe this is a bug.

用ll命令,检查报错的文件,发现是个链接,如下所示:

kaldi/tools# ll /var/lib/apt/lists/partial/security.ubuntu.com_ubuntu_dists_xenial-security_multiverse_dep11_Components-amd64.yml.xz

lrwxrwxrwx 1 root root 108 Nov 22 01:31 /var/lib/apt/lists/partial/security.ubuntu.com_ubuntu_dists_xenial-security_multiverse_dep11_Components-amd64.yml.xz -> /var/lib/apt/lists/security.ubuntu.com_ubuntu_dists_xenial-security_multiverse_dep11_Components-amd64.yml.gz

查看链接到的目标文件权限,发现它没有写权限。这就是问题所在了,上面报错是Permission denied,正好是权限不够。

kaldi/tools# ll /var/lib/apt/lists/security.ubuntu.com_ubuntu_dists_xenial-security_multiverse_dep11_Components-amd64.yml.gz

-rw-r--r-- 1 root root 158 Feb  2  2017 /var/lib/apt/lists/security.ubuntu.com_ubuntu_dists_xenial-security_multiverse_dep11_Components-amd64.yml.gz

改动该文件的权限,让其可写,如下所示

kaldi/tools# chmod 666  /var/lib/apt/lists/security.ubuntu.com_ubuntu_dists_xenial-security_multiverse_dep11_Components-amd64.yml.gz

然后,重新安装mkl

extras/install_mkl.sh

得到如下提示,说明MKL安装成功

extras/install_mkl.sh: Configuring ld runtime bindings
+ echo '/opt/intel/lib/intel64
/opt/intel/mkl/lib/intel64'
+ ldconfig
extras/install_mkl.sh: MKL package intel-mkl-64bit-2019.2-057 was successfully installed

在运行check_dependencies.sh,检查依赖,得到如下提示,则说明所有依赖都安装成功。

# extras/check_dependencies.sh

extras/check_dependencies.sh: all OK.
  1. 编译tools

依赖安装成功,说明编译所需的工具和环境都配置好了,接下来就可以编译tools。

kaldi/tools#  make -j 8
  1. 编译src

tools编译成功后,就可以到src目录下,编译src


kaldi/src#  ./configure --shared

kaldi/src#  make depend -j

kaldi/src#  make -j

这个步骤比较花时间,编译成功后,提示如下

Running matrix-lib-test ... 3s... SUCCESS matrix-lib-test
Running sparse-matrix-test ... 0s... SUCCESS sparse-matrix-test
make[1]: Leaving directory '/home/rootuser/speech_2019/kaldi/src/matrix'
echo Done
Done

接下来,可以跑一下最简单的例子,来验证kaldi是否安装成功。

跑yesno例子来验证安装成功

运行自带的yesno例子,跑./run.sh即可运行:

kaldi/egs/yesno/s5# ls

conf  input  local  path.sh  run.sh  steps  utils

kaldi/egs/yesno/s5# ./run.sh

如果没有报错,那恭喜您,到这里,kaldi编译安装成功!

附录:运行yesno例子的完整输出

kaldi/egs/yesno/s5# ./run.sh

steps/train_mono.sh: Pass 25
steps/train_mono.sh: Pass 26
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 27
steps/train_mono.sh: Pass 28
steps/train_mono.sh: Pass 29
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 30
steps/train_mono.sh: Pass 31
steps/train_mono.sh: Pass 32
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 33
steps/train_mono.sh: Pass 34
steps/train_mono.sh: Pass 35
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 36
steps/train_mono.sh: Pass 37
steps/train_mono.sh: Pass 38
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 39
steps/diagnostic/analyze_alignments.sh --cmd utils/run.pl data/lang exp/mono0a
steps/diagnostic/analyze_alignments.sh: see stats in exp/mono0a/log/analyze_alignments.log
1 warnings in exp/mono0a/log/update.*.log
6 warnings in exp/mono0a/log/init.log
exp/mono0a: nj=1 align prob=-81.88 over 0.05h [retry=0.0%, fail=0.0%] states=11 gauss=371
steps/train_mono.sh: Done training monophone system in exp/mono0a
tree-info exp/mono0a/tree
tree-info exp/mono0a/tree
fstpushspecial
fstminimizeencoded
fsttablecompose data/lang_test_tg/L_disambig.fst data/lang_test_tg/G.fst
fstdeterminizestar --use-log=true
fstisstochastic data/lang_test_tg/tmp/LG.fst
0.534295 0.533859
[info]: LG not stochastic.
fstcomposecontext --context-size=1 --central-position=0 --read-disambig-syms=data/lang_test_tg/phones/disambig.int --write-disambig-syms=data/lang_test_tg/tmp
/disambig_ilabels_1_0.int data/lang_test_tg/tmp/ilabels_1_0.21306 data/lang_test_tg/tmp/LG.fst
fstisstochastic data/lang_test_tg/tmp/CLG_1_0.fst
0.534295 0.533859
[info]: CLG not stochastic.
make-h-transducer --disambig-syms-out=exp/mono0a/graph_tgpr/disambig_tid.int --transition-scale=1.0 data/lang_test_tg/tmp/ilabels_1_0 exp/mono0a/tree exp/mono
0a/final.mdl
fsttablecompose exp/mono0a/graph_tgpr/Ha.fst data/lang_test_tg/tmp/CLG_1_0.fst
fstdeterminizestar --use-log=true
fstminimizeencoded
fstrmsymbols exp/mono0a/graph_tgpr/disambig_tid.int
fstrmepslocal
fstisstochastic exp/mono0a/graph_tgpr/HCLGa.fst
0.5342 -0.000299216
HCLGa is not stochastic
add-self-loops --self-loop-scale=0.1 --reorder=true exp/mono0a/final.mdl exp/mono0a/graph_tgpr/HCLGa.fst
steps/decode.sh --nj 1 --cmd utils/run.pl exp/mono0a/graph_tgpr data/test_yesno exp/mono0a/decode_test_yesno
decode.sh: feature type is delta
steps/diagnostic/analyze_lats.sh --cmd utils/run.pl exp/mono0a/graph_tgpr exp/mono0a/decode_test_yesno
steps/diagnostic/analyze_lats.sh: see stats in exp/mono0a/decode_test_yesno/log/analyze_alignments.log
Overall, lattice depth (10,50,90-percentile)=(1,1,2) and mean=1.2
steps/diagnostic/analyze_lats.sh: see stats in exp/mono0a/decode_test_yesno/log/analyze_lattice_depth_stats.log
local/score.sh --cmd utils/run.pl data/test_yesno exp/mono0a/graph_tgpr exp/mono0a/decode_test_yesno
local/score.sh: scoring with word insertion penalty=0.0,0.5,1.0
%WER 0.00 [ 0 / 232, 0 ins, 0 del, 0 sub ] exp/mono0a/decode_test_yesno/wer_10_0.0

参考

### 虚拟机 Ubuntu 安装配置文件报错解决方案 在虚拟机环境中安装和配置 Ubuntu 时,可能会遇到多种类型的报错问题。以下是针对常见报错及其解决方案的详细说明。 #### 一、Kaldi 编译过程中可能出现的报错解决方法 当在 Ubuntu 18.04 上安装 Kaldi 并进行工具和源码编译时,可能遇到各种依赖项缺失或环境配置不当的问题[^1]。 - **问题**: `tools` 或 `src` 的编译过程失败。 - **解决方法**: - 确保已正确安装所有必要的依赖库,例如 `sox`, `boost`, 和 `atlas` 等。 - 使用命令更新系统包: ```bash sudo apt-get update && sudo apt-get upgrade -y ``` - 如果仍然存在未满足的依赖关系,则可以手动下载并安装这些库。 - 对于特定错误消息(如链接器找不到某些函数),可以通过修改 Makefile 文件来调整路径或参数。 #### 二、Ubuntu 虚拟机启动黑屏问题 如果虚拟机中的 Ubuntu 启动后仅显示黑色屏幕而无任何图形界面,则可能是显卡驱动或其他硬件兼容性问题所致[^2]。 - **原因分析**: - VMware 工具未正确初始化。 - 显存分配不足或者 GPU 加速被禁用。 - **处理措施**: - 尝试通过按住 Shift 键进入恢复模式,并重新安装桌面环境。 - 修改 GRUB 引导选项,在内核行追加 `nomodeset` 参数以禁用专有显卡驱动支持。 - 更新主机端软件至最新版本并客户操作系统匹配。 #### 三、Windows 中 VirtualBox 下增强功能无法正常加载 部分用户报告说他们在 Windows 主机上利用 VirtualBox 创建的 Ubuntu 实例中遇到了“增强功能”安装失败的情况[^3]。具体表现为点击按钮后提示无法挂载虚拟 CD-ROM 设备。 - **应对策略**: - 手动卸载现有的虚拟光驱镜像再重试一次操作; - 检查目标 ISO 是否损坏并通过官方渠道获取新的副本; - 若上述均无效则考虑切换到其他替代品比如 Vagrant box 来简化部署流程。 #### 四、CH34X USB 驱动模块加载异常情况下的修复指南 对于那些希望自定义串口通信设备驱动程序的人来说,有时即使成功完成了初始阶段即 `make all` 步骤之后再次运行 `make load` 却遭遇权限拒绝之类的障碍[^4]: - **建议做法**: - 添加当前登录账户到 dialout 组以便获得足够的访问权限:`sudo usermod -aG dialout $USER` - 关闭安全防护机制SELinux临时测试效果: `setenforce 0` #### 五、关于 XShell 远程连接时报 “no .Xauthority exists”的警告信息 此现象表明客户端试图开启远程 GUI 应用却缺乏相应的认证令牌文件[^5]: - **纠正方式**: - 判断是否存在该隐藏目录结构;如果没有创建它(`mkdir ~/.Xauthority`)接着赋予适当读写属性给所有人(`chmod u+rwx,g=rx,o=r ~/.Xauthority`) - 另外确认SSH会话已经启用了转发特性(-Y/-X标志) ```bash ssh -X username@remote_host ``` ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值