好记性不如烂笔头

Kaldi(2)

Posted on By ZealerDrm

如需转载本网站内容,请标明转载来源,且保持作品完整性

 

运行实例yesno

./egs目录是用来放实例的,所以yesno这个实例应该放在里面,实际上,./egs里有很多公公语音数据空的训练步骤和测试结果, yesno属于很简单的一个,可以用来理解语音识别的整体流程。

运行很简单,在./egs/yesno/s5目录下,运行

sudo ./run.sh

得到运行结果,WER为,0.00。

WER是字错误率词错误率!是一个衡量语音识别系统准确程度的度量,其计算公式为WER=(I+D+S)/N,其中I代表被插入的单词个数,D代表被删除的单词个数,S代表被替换的单词个数,N代表单词总数。也就是说 把识别出来的结果中,多识别的、少识别的、识别错的全部加起来,除以总单词数,结果数值越小越好。

yesno运行流程

run.sh脚本

输入:

vim run.sh 

可以看到run.sh脚本内容。

#!/bin/bash

train_cmd="utils/run.pl"
decode_cmd="utils/run.pl"

if [ ! -d waves_yesno ]; then
  wget http://www.openslr.org/resources/1/waves_yesno.tar.gz || exit 1;
  # was:
  # wget http://sourceforge.net/projects/kaldi/files/waves_yesno.tar.gz || exit 1;
  tar -xvzf waves_yesno.tar.gz || exit 1;
fi

train_yesno=train_yesno
test_base_name=test_yesno

rm -rf data exp mfcc

# Data preparation

local/prepare_data.sh waves_yesno
local/prepare_dict.sh
utils/prepare_lang.sh --position-dependent-phones false data/local/dict "<SIL>" data/local/lang data/lang
local/prepare_lm.sh

# Feature extraction
for x in train_yesno test_yesno; do
 steps/make_mfcc.sh --nj 1 data/$x exp/make_mfcc/$x mfcc
 steps/compute_cmvn_stats.sh data/$x exp/make_mfcc/$x mfcc
 utils/fix_data_dir.sh data/$x
done

# Mono training
steps/train_mono.sh --nj 1 --cmd "$train_cmd" \
  --totgauss 400 \
  data/train_yesno data/lang exp/mono0a
 
# Graph compilation 
utils/mkgraph.sh data/lang_test_tg exp/mono0a exp/mono0a/graph_tgpr

# Decoding
steps/decode.sh --nj 1 --cmd "$decode_cmd" \
	exp/mono0a/graph_tgpr data/test_yesno exp/mono0a/decode_test_yesno

for x in exp/*/decode*; do [ -d $x ] && grep WER $x/wer_* | utils/best_wer.sh; done

1.

train_cmd="utils/run.pl"
decode_cmd="utils/run.pl"

定义机器的运行方式,是在本地运行的,没有表明使用GPU,说明是使用的CPU。(train_cmd和decode_cmd是什么意思,没记住!!!)

2.

if [ ! -d waves_yesno ]; then  
wget http://www.openslr.org/resources/1/waves_yesno.tar.gz || exit 1;  
# was:  
# wget http://sourceforge.net/projects/kaldi/files/waves_yesno.tar.gz || exit 1;  
tar -xvzf waves_yesno.tar.gz || exit 1;
fi 

if判断,如果有yesno音频,则直接解压,如果没有,在指定的网址上下载完后再解压。

3.

train_yesno=train_yesno
test_base_name=test_yesno

命名训练集和测试集

4.Data preparation–数据准备

local/prepare_data.sh waves_yesno

wav 文件预处理,

结果保存在s5/data/train_yesno和s5/data/test_yesno中,里面主要有下面几个文件:

  • text:音频文件id(文件名)与单词的对应 (比如:0_0_0_0_1_1_1_1.wavz中,1代表yes,0代表no)
  • wav.scp:音频文件id与音频文件的对应
  • utt2spk:音频文件id与说话人的对应
  • spk2utt:说话人id与 音频文件id的对应

字典准备

local/prepare_dict.sh

结果保存在s5/data/local/dict目录下面:

  • lexicon.txt:完整的词位(包含静音SIL)-音素对

  • lexicon_words.txt:单词-音素对

  • silence_phones.txt: 非语言学音素

  • nonsilence_phones.txt:语言学音素

  • optional_silence.txt :备选非语言音素

lang目录

utils/prepare_lang.sh --position-dependent-phones false data/local/dict "<SIL>" data/local/lang data/lang

结果保存在s5/data/long目录下:

  • phones.txt:音素与整形的对应(openfst格式的symbol tables),以后的操作单词将以整形数字代替

  • words.txt:单词与整形的对应(openfst格式的symbol tables),以后的操作音素将以整形数字代替

  • L_disambig.fst:加消歧符号的字典fst(可以被kaldi识别的字典)

  • L.fst:字典fst(可以被kaldi识别的字典)

  • topo:音素状态转移图(HMM)Y,N每个音素为三种状态;SIL为五种状态

  • oov:词汇表之外的单词会映射到该文件中

  • phones:该目录下有许多关于音素集的信息。同一类信息可能有三种不同的格式,分别以.csl、.int和.txt结尾。

准备语言模型

local/prepare_lm.sh

将已经生成好的语言模型(s5/input/task.arpabo)转化为Kaldi格式的G.fst,其结果在s5/data/lang_test_tg目录下

5.Feature extraction-特征向量提取

for x in train_yesno test_yesno; do
 steps/make_mfcc.sh --nj 1 data/$x exp/make_mfcc/$x mfcc
 steps/compute_cmvn_stats.sh data/$x exp/make_mfcc/$x mfcc
 utils/fix_data_dir.sh data/$x
done

结果在s5/mfcc目录下。

MCFF:梅尔频率倒谱系数 ark文件为MFCC的特征向量;scp文件是音频文件或说话人与相应ark文件的对应关系;前缀cmvn为说话人,raw为音频文件。

6.Mono training-单音素训练

steps/train_mono.sh --nj 1 --cmd "$train_cmd" \
  --totgauss 400 \
  data/train_yesno data/lang exp/mono0a

结果输出在s5/exp/mono0a/目录下,该步骤将生成声学模型。

7.Graph compilation-构图

utils/mkgraph.sh data/lang_test_tg exp/mono0a exp/mono0a/graph_tgpr

生成最终的HCLG.fst.

8.Decoding-解码

steps/decode.sh --nj 1 --cmd "$decode_cmd" \
	exp/mono0a/graph_tgpr data/test_yesno exp/mono0a/decode_test_yesno

结果在s5/exp/mono0a/decode_test_yesno目录下。

9.查看目录

for x in exp/*/decode*; do [ -d $x ] && grep WER $x/wer_* | utils/best_wer.sh; done

得到所看到的结果。

此时,24号23:04,另一台电脑还在运行thchs30数据库,从24号14:00开始运行,目前桌面已经黑屏卡死,机器风扇一直咆哮,期待明天有神奇的事情发生!