模型的训练由数据驱动,有些数据是必须要准备的。为了让机器学会将语音转换为文本,首先需要给它提供大量的例子,即语音及其对应的文本,这是原始素材,也最能反映学习目的。这些数据的符号化和结构化则需要一些人类先验知识,包括语言知识和数字信号处理相关手段。
4.1数据准备
1)基本数据
run.sh中的Bookmark:basicpreparation对Thchs30原始数据进行了形式上的处理,以适应Kaldi的需要。一个常规的有监督语音识别数据集必然包括一一对应的语音和文本,说话人的信息有好处但非必要。Thchs30经过初步处理后得到四种文本文件,可以直接打开查看(比如训练集放在data/train下),这四个文件也是Kaldi的必需文件:
●wav.scp,每条语音的ID及其存储路径;
●text,每条语音的ID及其对应文本;
●utt2spk,每条语音的ID及其说话人ID;
●spk2utt,每个说话人的ID及其所说语音的所有ID,使用utils/spk2utt_to_utt2spk.pl或utils/utt2spk_to_spk2utt.pl可实现spk2utt和utt2spk的相关转换。
对于不同数据源或任务,可能需要另外准备一些文件,比如segments文件标记每个语音片段属于某条语音的哪一部分,文件格式形如“”,时间以秒计,extra●ct-segments读取此文件后对音频进行批量剪切并保存为Kaldi支持的格式(sox也可逐条切割音频);spk2gender文件标明每个说话人的性别,用于性别识别;utt2lang文件标明每条语音ID对应的语种ID,用于语种识别。由于不同的数据集有着不同的编排,并没有统一的工具提取出以上文件。当根据某个数据集自行生成以上类别的文件并用sort排序后,可以使用utils/validate_data_dir.sh校验是否满足Kaldi需求,并使用utils/fix_data_dir.sh进行修复。根据数据校验和修复脚本也可侧面了解Kaldi支持的文件类型和格式。
utt2spk和spk2utt是Kaldi处理所必须的,有时候如果不能提供说话人信息,可以“伪造”,比如每条语音的说话人ID直接使用这条语音的ID,这对语音识别性能影响不大,但在做说话人识别任务时,显然务必要提供真实的说话人信息。此外,两个文件都需要按第一列排序,为保证二者顺序的总体一致性,通常句子ID的前缀设置为说话人ID。
2)语言资料
语言知识方面,见Bookmark:languagepreparation,Kaldi至少需要以下文件,存放于data/dict下:
●lexicon.txt,发音词典,即每个词与其所对应的音素串,格式为“wordphone1phone2phone3...”,中文韵母具有不同的音调,可添加后缀,例如“1”(一声)、“2”(二声)、“3”(三声)、“4”(四声)、“5”(轻声);
●lexiconp.txt,与lexicon.txt作用相同,多了发音概率,是人工设置的先验假设,格式为“wordpronunciation-probabilityphone1...”,可由系统通过lexicon.txt自动生成(此时所有词的概率相同),二者提供一个即可,lexiconp.txt优先使用;
●silence_phones.txt,静音类音素,包括静音(sil或者SIL)、噪音、笑声等非语言直接相关的伪音素,同一行的音素是某一个音素的不同变体(重音、音调方面),故可共享决策树根;
●nonsilence_phones.txt,语言直接相关的真实音素,同一行的音素是某一个音素的不同变体(重音、音调方面),故可共享决策树根;
●optional_silence.txt,备用的静音类音素,一般直接来自silence_phones.txt中的sil或者SIL;
●extra_questions.txt,可为空,同一行的音素有着相同的重音或音调,与GMM训练中自动生成的“questions”一同用于决策树的生成。
对于同一种语言,基于新的数据集训练系统时,上述语言资料文件都可以直接移植过去复用。运行egs/wsj/s5/local/wsj_prepare_dict.sh可以瞥见如何利用CMU英语发音词典构建出其他所需文件,Thchs30中文数据集提供了准备好的语言资料。发音词典应尽可能覆盖训练语料,且基于已有的音素表,可更改或扩充发音词典,以适用于不同的领域或场景。到此为止,Kaldi用于语音识别系统训练的数据都齐全了,后来的事便是Kaldi对这些数据的自动处理和使用。
在决策树的生成当中,nonsilence_phones.txt倡“合”,extra_questions.txt倡“分”,然而前者中的一行如果由同一基音素衍生出来,具有不同的重音或音调,则在后者中常常处于不同的行,这时保留根源性,以前者为准。
Bookmark:languageprocessing中utils/prepare_lang.sh对data/dict进行了处理,得到data/lang。选项“position_dependent_phones”指明是否使用位置相关的音素,即是否根据一个音素在词中的位置将其加上不同的后缀:“_B”(开头)、“_E”(结尾)、“_I”(中间)、“_S”(独立成词)。参数“”取自lexicon.txt,后续处理中所有集外词(OutOfVocabulary,OOV)都用它来代替。lang中生成的文件:
●phones.txt,将所有音素一一映射为自然数,即音素ID,引入“”(epsilon)、消歧(Disambiguation)符号“#n”(n为自然数),便于FST处理;
●words.txt,将词一一映射为自然数,即词ID,引入“”(epsilon)、消歧符号“#0”、“”(句子起始处)、“”(句子结尾处),便于FST处理;
●oov.txt,oov.int,集外词的替代者(此处为)及其在words.txt中的ID;
topo,各个音素HMM模型的拓扑图,第二章提过将一个音素(或三音素)表示成一个HMM,此文件确定了每个音素使用的HMM状态数以及转移概率,用于初始化单音素GMM-HMM,可根据需要自行进行修改(并用utils/validate_lang.pl校验),实验中静音音素用了5个状态,其他音素用了3个状态;
L.fst,L_disambig.fst,发音词典转换成的FST,即输入是音素,输出是词,两个FST的区别在于后者考虑了消歧;
phones/,是dict/的拓展,内部文件均可以文本形式打开查看,后缀为txt/int/csl的同名文件之间是相互转换的,其中context_indep.txt标明了上下文无关建模的音素,通常为静音音素,wdisambig.txt/wdisambig_phones.int/wdisambig_words.int分别标明了words.txt引入的消歧符号(#0)及其在phones.txt和words.txt中的ID,roots.txt定义了同一行音素的各个状态是否共享决策树的根以及是否拆分,对应的音素集则存放于sets.txt。
消歧是为了确保发音词典能够得到一个确定性的(Deterministic)WFST。如果有些词对应的音素串是另一些词音素串的前缀,比如good的音素串是goodness的前半段音素串,需要在前者对应的音素串后面加入消歧音素,破坏这种前缀关系,这样,WFST中一个词的路径就不会包含于另一个词的路径中。
语言模型方面,可以单独提供ARPA格式的统计语言模型,也可以由现有文本训练出来(如使用KaldiLM工具或SRILM工具包的ngram-count,具体训练方法可参照egs/fisher_swbd/s5/local/fisher_train_lms.sh),utils/format_lm.sh将该语言模型转换为G.fst,即输入是词,输出也是词,与data/lang中的文件一同放在data/graph/lang下,用于后面制作解码图,与模型的训练无关。
4.2声学特征提取
原始音频信号可以直接作为模型的输入,只是在保守情况下,如数据不足、计算力薄弱时,更讨好的做法是先将其由时域信号转换为频域信号,借鉴人耳的处理机制,最终产生声学特征。声学特征提取使得语音信息更容易暴露,大大降低算法优化的压力,某种程度上也起到降维的效果,提高计算效率,比如16kHz下的25ms共个数值可转换为40维的声学特征。
Bookmark:featureextraction分别提取音频的MFCC(MelFrequencyCepstralCoefficient,梅尔频率倒谱系数)和FBANK(MelFilterBank,梅尔滤波器组)两种声学特征,并计算二者关于说话人的倒谱均值和方差统计量,用于CMVN(CepstralMeanandVarianceNormalization)标准化。
计算MFCC和FBANK之前需要通过conf/{mfcc.conf,fbank.conf}设置相关选项,可通过命令行运行
转载请注明:http://www.0431gb208.com/sjszlfa/1135.html