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

接上回
if [ -f $data/segments ]; then   #这里是查看data/mfcc/train下是否存在segments,如果存在则执行then后面的脚本,否则执行else后面的,
这个文件不存在,所以之后调用else后面的处理

  echo "$0 [info]: segments file exists: using that."

  split_segments=""
  for n in $(seq $nj); do
    split_segments="$split_segments $logdir/segments.$n"
  done

  utils/split_scp.pl $data/segments $split_segments || exit 1;
  rm $logdir/.error 2>/dev/null

  $cmd JOB=1:$nj $logdir/make_mfcc_${name}.JOB.log \
    extract-segments scp,p:$scp $logdir/segments.JOB ark:- \| \
    compute-mfcc-feats $vtln_opts --verbose=2 --config=$mfcc_config ark:- ark:- \| \
    copy-feats --compress=$compress $write_num_frames_opt ark:- \
      ark,scp:$mfccdir/raw_mfcc_$name.JOB.ark,$mfccdir/raw_mfcc_$name.JOB.scp \
     || exit 1;

else
  echo "$0: [info]: no segments file exists: assuming wav.scp indexed by utterance."   #打印make_mfcc.sh: [info]:没有段文件存在:假设wav.scp索引是通过说话者进行
  split_scps=""
  for n in $(seq $nj); do
    split_scps="$split_scps $logdir/wav_${name}.$n.scp"    
    echo "----test: $split_scps"
  done   #这里应该是切分为4个,每一个都添加到这个变量中,我们注释后面的,加入一些打印运行一下

我们看到分为了四个
  utils/split_scp.pl $scp $split_scps || exit 1;  #这里就是将$scp(也就是 data/mfcc/train下的wav.scp)按照 $split_scps切分,也就是切分为上面说到的四个,我们后面在具体的看。我们执行一下这句。我们看到在exp/make_mfcc/train下生成4个文件。

可以用对比软件与原来的wav.scp对比一下。后来发现每个文件中是2500条目,一共是10000条目。


  # add ,p to the input rspecifier so that we can just skip over
  # utterances that have bad wave data.   #加入,p到输入读取特征,这样我们就可以跳过那些有坏wave数据的话语。
这里是为了给run.sh中后面的compute-mfcc-feats计算MFCC参数用的。该程序需要两个命令行参数:rspecifier是用来读.wav数据(以发音为索引)和wspecifier是用来写特征(以发音为索引);参见The TableconceptSpecifying Table formats: wspecifiers and rspecifiers获取更多关于这些术语的解释。典型的用法是,将数据写入一个大的“archive”文件,也写到一个“scp”文件以便随机存取;参见Writing an archive and a script file simultaneously解释。

  $cmd JOB=1:$nj $logdir/make_mfcc_${name}.JOB.log \
    compute-mfcc-feats  $vtln_opts --verbose=2 --config=$mfcc_config \
     scp,p:$logdir/wav_${name}.JOB.scp ark:- \| \
      copy-feats $write_num_frames_opt --compress=$compress ark:- \
      ark,scp:$mfccdir/raw_mfcc_$name.JOB.ark,$mfccdir/raw_mfcc_$name.JOB.scp \
      || exit 1;

fi

整个就是一个cmd命令,很多参数$cmd 就是前面的run.pl JOB=1:$nj $logdir/make_mfcc_${name}.JOB.log 由于$nj为4 ,
则为JOB=1:4 ,然后是日志文件
$logdir/make_mfcc_${name}.JOB.log  接下来的compute-mfcc-feats就是调用kaldi/src/featbin下的compute-mfcc-feats,这个是由该目录下的compute-mfcc-feats.cc编译的,就是提取特征的。因为上回我们知道这块没有调用vtln扭曲因子,所以$vtln_opts没有值 --verbose=2是perl脚本的一个参数  

--config=conf/mfcc.conf 配置文件是这个,scp,p:$logdir/wav_${name}.JOB.scp 创建scp文件,copy-feats也是kaldi/src/featbin下的copy-feats,这个是由该目录下的copy-feats.cc编译的,上回我们知道这块没有调用,所以$write_num_frames_opt为空,由于之前启用了压缩compress=true  所以这里为--compress=true ,这里需要注意的是在文件前边加ark关键字,告诉copy-feats是什么格式的,还有后面加一个ark,t:- 表示输出格式为t文本,否则默认是二进制。同理我们这里的ark,scp应该是scp格式,然后是$mfccdir/raw_mfcc_$name.JOB.ark,$mfccdir/raw_mfcc_$name.JOB.scp 就是用到的ark文件和scp文件,生成的特征文件是最常用的,比如 MFCC FBANK , 我们可以把特征提取出来用到其他的地方。 后缀是ark.
我们在之前加入一些打印,方便查看每一个步骤。
echo "----test: $cmd###$logdir###$vtln_opts###$write_num_frames_opt###$compress###$mfccdir"
$cmd JOB=1:$nj $logdir/make_mfcc_${name}.JOB.log \
    compute-mfcc-feats  $vtln_opts --verbose=2 --config=$mfcc_config \
     scp,p:$logdir/wav_${name}.JOB.scp ark:- \| \
      copy-feats $write_num_frames_opt --compress=$compress ark:- \
      ark,scp:$mfccdir/raw_mfcc_$name.JOB.ark,$mfccdir/raw_mfcc_$name.JOB.scp \
      || exit 1;

我们运行一下,

如果没有错误就看下一篇文章
我们发现有错误一会再看,logdir就是exp/make_mfcc/train/
  $vtln_opts 没有 $write_num_frames_opt也没有 $compress为true  $mfccdir 为/opt/kaldi/egs/thchs30/s5/mfcc/train 
我们看一下错误,

我们看到在exp/make_mfcc/train下生成了四个日志文件,我们打开这四个日志文件发现问题都一样

我们看到都是出现在libkaldi-hmm.so上


我们在kaldi目录下查找一下,发现已经编译出libkaldi-hmm.so 但是为什么没有找到,我们继续查找

我们也发现在kaidi/src/lib下已经编译出很多的库,但是似乎这些库并没有添加到LD_LIBRARY_PATH中

所以我们要添加到LD_LIBRARY_PATH中,具体做法:
在kaldi/src/lib下执行 export LD_LIBRARY_PATH=$(pwd):$LD_LIBRARY_PATH,然后执行ldconfig进行刷新

我们看到已经设置成功了
我们看到在path.sh中的是要运行. $KALDI_ROOT/tools/config/common_path.sh的,而在common_path.sh中并没有提到LD_LIBRARY_PATH,所以我们刚刚执行的设置,应该可以解决问题。我们删除exp/make_mfcc/train下原来生成的make_mfcc_train.*.log ,然后重新执行run.sh,但是还是出现了同样的问题,后来我们看到在编译
compute-mfcc-feats时调用了src/kaldi.mk ,里面
KALDI_FLAVOR := dynamic
KALDILIBDIR := /home/xxx/kaldi/src/lib
DOUBLE_PRECISION = 0
OPENFSTINC = /home/xxx/kaldi/tools/openfst/include
OPENFSTLIBS = /home/xxx/kaldi/tools/openfst/lib/libfst.so
OPENFSTLDFLAGS = -Wl,-rpath=/home/xxx/kaldi/tools/openfst/lib
我们发现这里面的配置的编译目录与我们的实际项目不一致,原因是因为我们的这个工程是先从windows上的git下载下来的,然后先是放到了/home/xxx/,编译后又拷贝到了/opt下,所以这样 ,所以我们将thchs30语音库拷贝出来,然后删除工程,从git上重新clone,然后进行编译。
等编译好,我们再继续。
未完待续。。。。

猜你喜欢

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