参考:https://blog.csdn.net/nsh119/article/details/81587462
https://blog.csdn.net/shichaog/article/details/73264152
https://www.cnblogs.com/welen/p/7485151.html
yesno是关于yes和no两个孤立词的识别,该实例是一个非常小的数据集,每一条记录都是一系列yes或者no的语音。
在终端输入: cd kaldi-trunnk/egs/yesno/s5 #进入到yesno的样例目录
再输入: ls #查看该目录下的有哪些文件
其中:conf文件夹里是一些配置文件,例如MFCC的参数,HMM的拓扑结构;
local文件夹里主要是一些准备的数据脚本,供顶层的脚本run.sh调用;
steps和utils文件夹里主要是一些运行时调用的脚本;
data文件夹里主要存放语言模型、发音字典和音素信息等等;
再输入:./run.sh #该脚本执行孤立词识别流程;
经过训练和测试,可以看到运行结果。
其中:WER是字错误率,是一个衡量语音识别系统的准确程度的度量。其计算公式是WER=(I+D+S)/N,其中I代表被插入的单词个数,D代表被删除的单词个数,S代表被替换的单词个数。也就是说把识别出来的结果中,多认的,少认的,认错的全都加起来,除以总单词数。这个数字当然是越低越好。
看看run.sh脚本:
1.音频文件下载,每个.wav文件的发音是yes,no.。文件名1代表yes,0代表no。这种文件名的命名方便以后的数据准备。
2.数据准备,
text:音频文件id(文件名)与单词的对应;
wav.scp:音频文件id 与音频文件的对应;
utt2spk:音频文件id与说话人的对应;
spk2utt:说话人id与音频文件id的对应;
其大致步骤为:将60个音频文件提取出文件id,其中30个作为训练,剩余30个作为测试。根据文件名中的1和0获取音频文件的内容。将其写入相应的文件,在实际大规模音频内容的情况下,需要自己制作上面的文件来做数据准备。
lexicon.txt :完整的词位(包括静音SIL)-音素对
lexicon_words.txt:单词-音素对
silence_phones.txt :非语言学音素
nonsilence_phones.txt: 语言学音素
optional_silence.txt :备选非语言音素
其大致步骤为:将input的文件夹下的已经写好的文件复制到该目录下,并加入SIL。
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结尾。感兴趣的话可以逐个打开查看!~~~
该脚本其实很简单,将已经生成好的语言模型(s5/input/task.arpabo)转化为Kaldi格式的G.fst,其结果在s5/data/lang_test_tg目录下,有关语言模型创建可参考语音识别-SRILM安装与使用。
3.特征向量提取,结果在s5/mfcc/目录下,其中.ark文件为MFCC的特征向量;.scp文件是音频文件或者说话人与相应ark文件的对应关系;cmvn为说话人,raw为音频文件。有关MFCC可以参考语音识别-MFCC特征提取。
4.单音素训练,该步的输出在s5/exp/mono0a/目录下,该步骤将生成声学模型。
5.构图,该步骤生成最终的HCLG.fst
6.解码,结果在s5/exp/mono0a/decode_test_yesno/目录下
7.查看结果,for x in exp/*/decode*; do [ -d $x ] && grep WER $x/wer_* | utils/best_wer.sh; done