在已经训练好模型的状况下,须要针对一个新任务作在线识别应该怎么作呢?ide
一种状况是,用已有的声学模型和新训练的语言模型。
语言模型能够同srilm等工具训练,可是
怎样将
语言模型与DNN
声学模型
结合一块儿来进行识别的。
SRILM能够用来训练ARPA格式的LM,假设
train.txt是语料,wordlist是词汇,
假设语言模型的字典和识别器的
字典同样,能够按以下办法训练LM
ngram-count -text train.txt -order 3 -limit-vocab -vocab wordlist -unk \
-map-unk "<unk>" -kndiscount -interpolate -lm srilm.o3g.kn.gz
而后经过下面的命令将
ARPA格式的LM转化成WFST格式
mkdir -p $lang_own
cp -r $lang/* $lang_own
gunzip -c $lm | utils/find_arpa_oovs.pl $lang_own/words.txt \
> $lang_own_tmp/oovs.txt || exit 1
gunzip -c $lm | \
grep -v '<s> <s>' | \
grep -v '</s> <s>' | \
grep -v '</s> </s>' | \
arpa2fst - | fstprint | \
utils/remove_oovs.pl $lang_own_tmp/oovs.txt | \
utils/eps2disambig.pl | utils/s2eps.pl | \
fstcompile --isymbols=$lang_own/words.txt --osymbols=$lang_own/words.txt \
--keep_isymbols=false --keep_osymbols=false | \
fstrmepsilon | fstarcsort --sort_type=ilabel > $lang_own/G.fst
utils/validate_lang.pl --skip-determinization-check $lang_own || exit 1;
最后生成新的语言模型在graph_own_dir
graph_own_dir=$model_dir/graph_own
utils/mkgraph.sh $lang_own $model_dir $graph_own_dir || exit 1;
第二种状况是,利用一个新的字典和已有的声学模型
这种状况也比较多,例如
用户想改变字典,新增词汇。首先要
修改lexicon,例如经过新增长单词到原来的lexicon。
若是不知道新单词对应的pronounciation, 能够经过工具
grapheme-to-phoneme G2P转化自动生成lexicon .常见的G2P工具备
Sequitur and Phonetisaurus。
利用新的lexicon能够建立新的lang目录
utils/prepare_lang.sh \
--phone-symbol-table $lang/phones.txt \
$dict_own "<SPOKEN_NOISE>" $lang_own_tmp $lang_own
新生成的lang就会在lang_own目录下。
--
phone-symbol-table选项十分重要,它保证了新lexicon里面的音素和原来识别器里面的音素是对应的。最后再生成语言模型。
graph_own_dir=$model_dir/graph_own
utils/mkgraph.sh $lang_own $model_dir $graph_own_dir || exit 1;
第三种状况是,字典语料都不一样,语言模型也从新训练。这个时候从准备字典开始就要从新作。
./local/
general_prep_dict.sh ./tv
utils/
prepare_lang.sh --phone-symbol-table data/lang/phones.txt tv3/dict/ "<UNK>" tv3/local/lang tv3/lang
local/
general_train_lm.sh tv
local/
general format_data.sh tv
utils/
mkgraph.sh tv/lang_dev/ exp/tri3b_dnn_2048x5/ tv/graph
注意: 有可能在prepare_lang的时候可能会出错,
这是由于准备字典时生成的lexicon.txt, non_silence_phone.txt,extra_questions.txt里面有
可能会含有原来声学模型训练时没有的因子,必需要保持二者一致。
Checking tv4/dict/extra_questions.txt ... --> reading tv4/dict/extra_questions.txt --> ERROR: phone "X5" is not in {, non}silence.txt (line 120, block 17) --> ERROR validating dictionary directory tv4/dict (see detailed error messages above)
Checking tv3/dict/extra_questions.txt ... --> reading tv3/dict/extra_questions.txt --> tv3/dict/extra_questions.txt is OK --> SUCCESS [validating dictionary directory tv3/dict] Phone appears in the lexicon but not in the provided phones.txt: X5