zoukankan      html  css  js  c++  java
  • [转] 如何用kaldi训练好的模型做特定任务的在线识别

    转自:http://blog.csdn.net/inger_h/article/details/52789339

    在已经训练好模型的情况下,需要针对一个新任务做在线识别应该怎么做呢?

    一种情况是,用已有的声学模型和新训练的语言模型。

    语言模型可以同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
     
  • 相关阅读:
    Shell脚本笔记(二)Shell变量
    Shell脚本笔记(三)shell中的数学计算
    Shell脚本笔记(五)Shell函数
    Shell脚本笔记(四)条件判断
    Kotlin基础(五)Kotlin的类型系统
    Kotlin基础(四)Lambda编程
    Kotlin基础(三)类、对象和接口
    Kotlin基础(二)函数的定义与调用
    Kotlin基础(一)Kotlin快速入门
    第四周学习进度
  • 原文地址:https://www.cnblogs.com/welen/p/7567429.html
Copyright © 2011-2022 走看看