接上回,我们需要修改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 homen=4 #parallel jobs #我们把n=8改为:n=4
这里我们看到H='pwd'完全是为了后面引用这个路径用的,先不用管它.我们把n=8改为:n=4,是因为我们并发的时候为四核心。
#corpus and trans directorythchs=/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
在Linux中通过locale来设置程序运行的不同语言环境,locale由ANSI C提供支持。locale的命名规则为<语言>_<地区>.<字符集编码>,如zh_CN.UTF-8,zh代表中文,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。
未完待续。。。。