如需转载本网站内容,请标明转载来源,且保持作品完整性
运行实例TIMIT
Timit是LDC收集的一个语料库,是商业化的,所以Kaldi里没有内置,需要自己下载。https://pan.baidu.com/s/1qYkDora
Timit/s5文件夹下面新建文件夹data,把timit.rar解压后的四个文件放入data中。
仍然需要修改cmd.sh,以为是在本地运行, ./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开始运行,目前桌面已经黑屏卡死,机器风扇一直咆哮,期待明天有神奇的事情发生!