kaldi中文语音识别_基于thchs30(2)

接上回,我们需要修改cmd.sh.  如下:
export train_cmd=run.pl #将原来的queue.pl改为run.pl
export decode_cmd="run.pl#将原来的queue.pl改为run.pl    这里的--mem 4G 还是去掉吧  因为我机器装的虚拟机内存不是很大
export mkgraph_cmd="run.pl#将原来的queue.pl改为run.pl  这里的--mem 8G 还是去掉吧  因为我机器装的虚拟机内存不是很大
export cuda_cmd="run.pl#将原来的queue.pl改为run.pl 这里去掉原来的--gpu 1  因为我们不打算用GPU来参与

这里的都是调用的utils/run.pl,有的人说这里至少4核心4G内存,我认为是单核心4G内存,因为你的cpu数量只是执行时间问题而已。

具体执行run.sh,中间遇到过几个小问题,修改n=4,我的机器是4核的。  中间如果出现Error,多半是内存不足引起的,8G内存跑不过,有人说24G内存跑过了,

所以之前建议,一步一步跑是有道理的。

单步跑时是在run.sh的脚本中看到

#data preparation
这句,在它之后就全是shell的命令。建议一条一条的跑。不然中间会有莫名奇妙的断档和错误。如何一条条跑呢?
使用注释:
:<<!     。。。。        !    这两句相当于c语言的/*  */. 中间的。。。。相当于要注释的内容。

我们接下来看看run.sh,前面几行

#!/bin/bash
. ./cmd.sh ## You'll want to change cmd.sh to something that will work on your system.
                 ## This relates to the queue.

. ./path.sh

这里我们看到,其实执行run.sh的时候,它也是先要执行cmd.sh和path.sh,其中 cmd.sh就是刚刚我们改的,path.sh一会我们再说。

H=`pwd`  #exp home

n=4      #parallel jobs #我们把n=8改为:n=4

这里我们看到H='pwd'完全是为了后面引用这个路径用的,先不用管它.我们把n=8改为:n=4,是因为我们并发的时候为四核心。

#corpus and trans directory

thchs=/opt/kaldi/egs/thchs30/thchs30-openslr    #我们把原来的/nfs/public/materials/data/thchs30-openslr改为/opt/kaldi/egs/thchs30/thchs30-openslr

这里的意思是说,要训练的thchs30数据的目录,

我这里的目录是/opt/kaldi/egs/thchs30/thchs30-openslr


在其下有

data_thchs30.tgz    resource.tgz   test-noise.tgz 这三个语音文件压缩包,并且我们将语音文件也解压到这里。

也就是语音文件按照这个路径填写

接下来我们看一下path.sh

export KALDI_ROOT=`pwd`/../../..
[ -f $KALDI_ROOT/tools/env.sh ] && . $KALDI_ROOT/tools/env.sh
export PATH=$PWD/utils/:$KALDI_ROOT/tools/openfst/bin:$PWD:$PATH
[ ! -f $KALDI_ROOT/tools/config/common_path.sh ] && echo >&2 "The standard file $KALDI_ROOT/tools/config/common_path.sh is not present -> Exit!" && exit 1
. $KALDI_ROOT/tools/config/common_path.sh

export LC_ALL=C

我们看到是在运行run.sh是要用到的环境变量,在这里先设置一下.

我们看到先是设置了KALDI_ROOT,它实际就是kaldi的源码的根目录。

[ -f $KALDI_ROOT/tools/env.sh ] && . $KALDI_ROOT/tools/env.sh 

这句话的意思是如果存在这个环境变量脚本就执行这个脚本,但是我没有在该路径下发现这个脚本。

然后是将本目录下的utils目录, kaldi根目录下的tools/openfst/bin目录 和 本目录加入到环境变量PATH中。

然后是判断如果在kaldi根目录下的tools/config/common_path.sh不存在,就打印提示缺少该文件,并且退出。

这里我们在下载的kaldi工程中已经包含有这个文件,我们打开$KALDI_ROOT/tools/config/common_path.sh看一下

# we assume KALDI_ROOT is already defined
[ -z "$KALDI_ROOT" ] && echo >&2 "The variable KALDI_ROOT must be already defined" && exit 1
# The formatting of the path export command is intentionally weird, because
# this allows for easy diff'ing
export PATH=\
${KALDI_ROOT}/src/bin:\
${KALDI_ROOT}/src/chainbin:\
${KALDI_ROOT}/src/featbin:\
${KALDI_ROOT}/src/fgmmbin:\
${KALDI_ROOT}/src/fstbin:\
${KALDI_ROOT}/src/gmmbin:\
${KALDI_ROOT}/src/ivectorbin:\
${KALDI_ROOT}/src/kwsbin:\
${KALDI_ROOT}/src/latbin:\
${KALDI_ROOT}/src/lmbin:\
${KALDI_ROOT}/src/nnet2bin:\
${KALDI_ROOT}/src/nnet3bin:\
${KALDI_ROOT}/src/nnetbin:\
${KALDI_ROOT}/src/online2bin:\
${KALDI_ROOT}/src/onlinebin:\
${KALDI_ROOT}/src/rnnlmbin:\
${KALDI_ROOT}/src/sgmm2bin:\
${KALDI_ROOT}/src/sgmmbin:\
${KALDI_ROOT}/src/tfrnnlmbin:\

$PATH

我们看到它是全kaldi公用的全局PATH变量的设置,其中[ -z "$KALDI_ROOT" ] && echo >&2 "The variable KALDI_ROOT must be already defined" && exit 1

的意思是如果"$KALDI_ROOT"字符串长度为0,则提示KALDI_ROOT变量必须先定义,并且退出,之后就设置这些PATH变量。

所以接下来就是要执行. $KALDI_ROOT/tools/config/common_path.sh

最后就是export LC_ALL=C

在很多的shell脚本中,我们经常会看见某一句命令的前面有一句“LC_ALL=C”
SAR_CMD="LC_ALL=C sar -u -b 1 5 | grep -i average "
这到底是什么意思?
LC_ALL=C 是为了去除所有本地化的设置,让命令能正确执行。

Linux中通过locale来设置程序运行的不同语言环境,localeANSI C提供支持。locale的命名规则为<</span>语言>_<</span>地区>.<</span>字符集编码>,如zh_CN.UTF-8zh代表中文,CN代表大陆地区,UTF-8表示字符集。在locale环境中,有一组变量,代表国际化环境中的不同设置:1. LC_COLLATE
定义该环境的排序和比较规则

2. LC_CTYPE
用于字符分类和字符串处理,控制所有字符的处理方式,包括字符编码,字符是单字节还是多字节,如何打印等。是最重要的一个环境变量。

3. LC_MONETARY
货币格式

4. LC_NUMERIC
非货币的数字显示格式

5. LC_TIME
时间和日期格式

6. LC_MESSAGES
提示信息的语言。另外还有一个LANGUAGE参数,它与LC_MESSAGES相似,但如果该参数一旦设置,则LC_MESSAGES参数就会失效。LANGUAGE参数可同时设置多种语言信息,如LANGUANE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"

7. LANG
LC_*的默认值,是最低级别的设置,如果LC_*没有设置,则使用该值。类似于 LC_ALL

8. LC_ALL
它是一个宏,如果该值设置了,则该值会覆盖所有LC_*的设置值。注意,LANG的值不受该宏影响。

C"是系统默认的locale"POSIX""C"的别名。所以当我们新安装完一个系统时,默认的locale就是C或POSIX

"POSIX" :Specifies the minimal environment for C-language translation called the POSIX locale. Ifsetlocale() is not invoked, the POSIX locale is the default
"C" Equivalent to "POSIX".
path.sh我们就看到这里。

未完待续。。。。


猜你喜欢

转载自blog.csdn.net/dqxiaoxiao/article/details/80262189