解决【kaldi】生成L.fst时 报错:libfst.so.16: cannot open shared object file 及类似问题

报错信息:fstcompile: error while loading shared libraries: libfst.so.16: cannot open shared object file: No such file or directory

报错信息:fstarcsort: error while loading shared libraries: libfst.so.16: cannot open shared object file: No such file or directory

使用脚本utils/prepare_lang.sh 生成L.fst

utils/prepare_lang.sh ~/kaldi/data/dict/ 'SIL' ~/kaldi/data/tmp/01/ ~/kaldi/data/L/lang/

报错信息如下:
在这里插入图片描述
出现这个错误是无法正常生成L.fst的

原因暂且未知,有说法是因为编译好kaldi之后移动了目录导致,但是总的来说原因一般有两个:

  • 一是:操作系统里确实没有包含该共享库(lib*.so.*文件)或者共享库版本不对,遇到这种情况那就去网上下载并安装上即可。

  • 二是:已经安装了该共享库,但执行需要调用该共享库的程序的时候,程序按照默认共享库路径找不到该共享库文件。

我们这里属于原因2


解决方案

  1. 首先在kaldi根目录下 查找 报错库位置
cd ~/kaldi/kaldi/
find . -name libfstscript.so.16
# 缺少什么就查找什么 如下所示

在这里插入图片描述
记住这两个位置的上一路径,下面进行配置

  1. 在环境变量文件当中设置 LD_LIBRARY_PATH
    LD_LIBRARY_PATH 的意思是告诉 loader 在哪些目录中可以找到共享库
vim ~/.bashrc
export LD_LIBRARY_PATH=~/kaldi/kaldi/tools/openfst-1.7.2/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=~/kaldi/kaldi/tools/openfst-1.7.2/src/script/.libs:$LD_LIBRARY_PATH 
# wq

source  ~/.bashrc #激活环境变量

在这里插入图片描述
一般来说到这里已经可以正常使用了,可以返回执行刚刚的脚本文件了,

如果还不行,再看下面…

  1. 配置 /etc/ld.so.conf文件:
cat /etc/ld.so.conf
# 输出: include ld.so.conf.d/*.conf
 
echo "~/kaldi/kaldi/tools/openfst-1.7.2/lib" >> /etc/ld.so.conf
echo "=~/kaldi/kaldi/tools/openfst-1.7.2/src/script/.libs" >> /etc/ld.so.conf
 
ldconfig

ldconfig命令的用途:
主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如lib*.so*),进而创建出动态装入程序(ld.so)所需的链接和缓存文件。缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表。

如果共享库文件安装到了/usr/local/lib(很多开源的共享库都会安装到该目录下)或其它“非/lib或/usr/lib”目录下,那么在执行ldconfig命令前,就要把新共享库目录加入到共享库配置文件/etc/ld.so.conf中.

  1. 如果上述方法都未成功 将kaldi根目录移回原来安装的位置,这样立即解决问题。

  2. 如都未解决可考虑重新编译Kaldi

现在再运行结果如下:
在这里插入图片描述
成功解决 beautiful !!!


看到了上图,细心的小伙伴已经发现了 一个新的错误(见最后一行)
“sym2int.pl: undefined symbol SIL (in position 1)”
解决:
Just add “ SIL” to the top of your lexicon.txt file and try again.
(只需将“ < SIL > SIL”添加到 lexicon.txt 文件的顶部,然后再试一次。)
没用…

同时你还会发现 L_disambig.fst 也没有生成

解决方法:
把使用 utils/prepare_lang.sh 的时候把 'SIL'改成 '<SIL>'或者'<UNK>',命令如下:

但是一定要到Kaldi路径下去执行!!!***
# 先cd到kaldi目录
cd ~/kaldi/kaldi/egs/wsj/s5
# 执行脚本生成
utils/prepare_lang.sh ~/kaldi/data/dict/ '<SIL>' ~/kaldi/data/tmp/01/ ~/kaldi/data/L/lang/

这个时候又会出现各种编译库找不到,根据我上面的踩坑记录,继续find -name就好了,最后 ~/.bashrc 里面如下:
在这里插入图片描述

# 添加find . -name libfstscript.so.16 libkaldi-decoder.so                        
export LD_LIBRARY_PATH=~/kaldi/kaldi/tools/openfst-1.7.2/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=~/kaldi/kaldi/tools/openfst-1.7.2/src/script/.libs:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=~/kaldi/kaldi/src/decoder:$LD_LIBRARY_PATH                         
export LD_LIBRARY_PATH=~/kaldi/kaldi/src/lib:$LD_LIBRARY_PATH                             
export LD_LIBRARY_PATH=~/kaldi/kaldi/src/fstext:$LD_LIBRARY_PATH 
export LD_LIBRARY_PATH=~/kaldi/kaldi/src/util:$LD_LIBRARY_PATH   
export LD_LIBRARY_PATH=~/kaldi/kaldi/src/matrix:$LD_LIBRARY_PATH 
export LD_LIBRARY_PATH=~/kaldi/kaldi/src/base:$LD_LIBRARY_PATH   
export LD_LIBRARY_PATH=~/kaldi/kaldi/src/lat:$LD_LIBRARY_PATH    
export LD_LIBRARY_PATH=~/kaldi/kaldi/src/hmm:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=~/kaldi/kaldi/src/tree:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=~/kaldi/kaldi/src:$LD_LIBRARY_PATH

记得 source ~/.bashrc #激活环境变量

最后编译结果如下:
在这里插入图片描述
可以看到,现在L.fst的所有内容都已经正确生成了.


生成 G.fst 报错

报错信息 arpa2fst: error while loading shared libraries: libkaldi-lm.so: cannot open shared object file: No such file or directory

不用慌,继续上面的步骤

cd ~/kaldi/kaldi
find -name libkaldi-lm.so
vim ~/.bashrc
source ~/.bashrc

~/.bashrc 末尾添加的内容如下:

export LD_LIBRARY_PATH=~/kaldi/kaldi/src/lm:$LD_LIBRARY_PAT

现在重新执行以下命令:

utils/format_lm_sri.sh L/lang G/normal/LM dict/lexicon.txt G/normal

可以看到G.fst已经生成成功了
在这里插入图片描述

更多推荐