kaldi 在线识别

  • 测试环境:Ubuntu16.04
  • 建议:仔细地按照此教程来,有些人中间出错是因为没仔细按照教程的步骤和细节
  • 文档更新时间:20180713
  • 使用thchs30训练最后的识别准确率约:64%

运行thchs30步骤

thchs30<span class="hljs-attribute">-openslr
&#x251C;&#x2500;&#x2500; data_thchs30
&#x251C;&#x2500;&#x2500; resource
&#x2514;&#x2500;&#x2500; test<span class="hljs-attribute">-noise</span></span>
  • 1
  • 2
  • 3
  • 4

4.打开s5目录,编辑cmd.sh. 修改为本地运行, 如下

<span class="hljs-keyword">export train_cmd=run.pl
<span class="hljs-keyword">export decode_cmd=run.pl
<span class="hljs-keyword">export mkgraph_cmd=run.pl
<span class="hljs-keyword">export cuda_cmd=run.pl</span></span></span></span>
  • 1
  • 2
  • 3
  • 4

修改s5下面的run.sh脚本,可以改两个地方

  • 1
  • 2
  • 3
  • 4

5.可以直接运行bash run.sh,前面没有配置错误什么的话应该不会有问题,有问题的话注意看输出,大概跑几小时到十几小时(根据机器而定)。也可以选择建议一行一行地跑这个脚本,这样容易定位错误。如何一行行跑呢? 使用注释:

<span class="hljs-symbol">:<<block ....我是注释内容 <span class="hljs-constant">BLOCK</block></span>
  • 1
  • 2
  • 3
  • 4

6.按照上面的一句一句的来。它大概有几个过程:数据准备,monophone单音素训练, tri1三因素训练, trib2进行lda_mllt特征变换,trib3进行sat自然语言适应,trib4做quick,后面就是dnn了

7.当运行到dnn时候会报错,因为默认dnn都是用GPU来跑的。它会检查一下,发现只在CPU下,就终止了。这里建议不要跑dnn了。因为我试过,改成CPU之后跑了7,8天,才迭代17,18次。太慢了。而一次训练怎么的也得20多次。还要训练好几回。所以,想跑dnn的话还是找GPU吧。

8.运行结束后看thchs30/s5/exp目录,其中tri1/decode_test_word/scoring_kaldi/best_wer 文件就是程序的错误率约36.15%,tri1/final.mdl即为输出的模型,此外graph_word文件夹下面有words.txt,和HCLG.fst,一个是字典,一个是有限状态机。有这3个文件,就可以来使用你的识别功能了。

9.识别自己的语音(使用wav文件或者麦克风)识别效果并不准,错误率约36%。回到源码的kaldi/src目录下。make ext 编译扩展程序。(在这之前确定你的tools文件夹下的portaudio已经装好)之后,会看到onlinebin文件夹。里面有两个程序,online-wav-gmm-decode-faster 用来回放wav文件来识别的,online-gmm-decode-faster用来从麦克风输入声音来识别的。(这里开个小差:portaudio 装好后,有可能收不到声音,可以装个audio recoder(用apt-get),之后用它录音试试,测测是否有声音,只要能录音,portaudio就没问题,一般装完就好了,不行就再重启一下。不知道为啥。)

10.我们找一个例子吧:去egs下,打开voxforge,里面有个online_demo,直接考到thchs30下。在online_demo里面建2个文件夹online-data work,在online-data下建两个文件夹audio和models,audio下放你要回放的wav,models建个文件夹tri1,把s5下的exp下的tri1下的final.mdl和35.mdl(final.mdl是快捷方式)考过去。把s5下的exp下的tri1下的graph_word里面的words.txt,和HCLG.fst,考到models的tri1下。这里复制完后目录结构应该是这样的

online_demo
&#x251C;&#x2500;&#x2500; online-data
&#x2502;   &#x251C;&#x2500;&#x2500; audio
&#x2502;   &#x2502;   &#x251C;&#x2500;&#x2500; <span class="hljs-number">1.wav
&#x2502;   &#x2502;   &#x251C;&#x2500;&#x2500; <span class="hljs-number">2.wav
&#x2502;   &#x2502;   &#x251C;&#x2500;&#x2500; <span class="hljs-number">3.wav
&#x2502;   &#x2502;   &#x251C;&#x2500;&#x2500; <span class="hljs-number">4.wav
&#x2502;   &#x2502;   &#x251C;&#x2500;&#x2500; <span class="hljs-number">5.wav
&#x2502;   &#x2502;   &#x2514;&#x2500;&#x2500; trans<span class="hljs-preprocessor">.txt
&#x2502;   &#x2514;&#x2500;&#x2500; models
&#x2502;       &#x2514;&#x2500;&#x2500; tri1
&#x2502;           &#x251C;&#x2500;&#x2500; <span class="hljs-number">35.mdl
&#x2502;           &#x251C;&#x2500;&#x2500; final<span class="hljs-preprocessor">.mdl
&#x2502;           &#x251C;&#x2500;&#x2500; HCLG<span class="hljs-preprocessor">.fst
&#x2502;           &#x2514;&#x2500;&#x2500; words<span class="hljs-preprocessor">.txt
&#x251C;&#x2500;&#x2500; README<span class="hljs-preprocessor">.txt
&#x251C;&#x2500;&#x2500; run<span class="hljs-preprocessor">.sh
&#x2514;&#x2500;&#x2500; work[&#x8FD9;&#x4E2A;&#x6587;&#x4EF6;&#x5939;&#x8FD0;&#x884C;run<span class="hljs-preprocessor">.sh&#x6210;&#x529F;&#x540E;&#x624D;&#x4F1A;&#x51FA;&#x73B0;]
    &#x251C;&#x2500;&#x2500; ali<span class="hljs-preprocessor">.txt
    &#x251C;&#x2500;&#x2500; hyp<span class="hljs-preprocessor">.txt
    &#x251C;&#x2500;&#x2500; input<span class="hljs-preprocessor">.scp
    &#x251C;&#x2500;&#x2500; ref<span class="hljs-preprocessor">.txt
    &#x2514;&#x2500;&#x2500; trans<span class="hljs-preprocessor">.txt</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

11.打开online_demo的run.sh

  • 将下面这段注释掉:(这段是voxforge例子中下载现网的测试语料和识别模型的。我们测试语料自己准备,模型就是tri1了)
<span class="hljs-keyword">if [ ! <span class="hljs-operator">-s <span class="hljs-variable">${data_file}.tar.bz2 ]; <span class="hljs-keyword">then
    <span class="hljs-built_in">echo <span class="hljs-string">"Downloading test models and data ..."
    wget -T <span class="hljs-number">10 -t <span class="hljs-number">3 <span class="hljs-variable">$data_url;

    <span class="hljs-keyword">if [ ! <span class="hljs-operator">-s <span class="hljs-variable">${data_file}.tar.bz2 ]; <span class="hljs-keyword">then
        <span class="hljs-built_in">echo <span class="hljs-string">"Download of <span class="hljs-variable">$data_file has failed!"
        <span class="hljs-keyword">exit <span class="hljs-number">1
    <span class="hljs-keyword">fi
<span class="hljs-keyword">fi</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

  • 然后再找到如下这句,将其路径改成tri1

ac_model_<span class="hljs-built_in">type=tri2b_mmi</span>

改成:

ac_model_<span class="hljs-built_in">type=tri1</span>

以及:

online<span class="hljs-attribute">-wav<span class="hljs-attribute">-gmm<span class="hljs-attribute">-decode<span class="hljs-attribute">-faster <span class="hljs-subst">--verbose<span class="hljs-subst">=<span class="hljs-number">1 <span class="hljs-subst">--rt<span class="hljs-attribute">-min<span class="hljs-subst">=<span class="hljs-number">0.8 <span class="hljs-subst">--rt<span class="hljs-attribute">-max<span class="hljs-subst">=<span class="hljs-number">0.85<span class="hljs-subst">\
            <span class="hljs-subst">--<span class="hljs-keyword">max<span class="hljs-attribute">-active<span class="hljs-subst">=<span class="hljs-number">4000 <span class="hljs-subst">--beam<span class="hljs-subst">=<span class="hljs-number">12.0 <span class="hljs-subst">--acoustic<span class="hljs-attribute">-scale<span class="hljs-subst">=<span class="hljs-number">0.0769 <span class="hljs-subst">\
            scp:<span class="hljs-variable">$decode_dir/input<span class="hljs-built_in">.scp <span class="hljs-variable">$ac_model/model</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  • 1
  • 2
  • 3

改成:(仅修改了最后的model为final.mdl)

online<span class="hljs-attribute">-wav<span class="hljs-attribute">-gmm<span class="hljs-attribute">-decode<span class="hljs-attribute">-faster <span class="hljs-subst">--verbose<span class="hljs-subst">=<span class="hljs-number">1 <span class="hljs-subst">--rt<span class="hljs-attribute">-min<span class="hljs-subst">=<span class="hljs-number">0.8 <span class="hljs-subst">--rt<span class="hljs-attribute">-max<span class="hljs-subst">=<span class="hljs-number">0.85<span class="hljs-subst">\
            <span class="hljs-subst">--<span class="hljs-keyword">max<span class="hljs-attribute">-active<span class="hljs-subst">=<span class="hljs-number">4000 <span class="hljs-subst">--beam<span class="hljs-subst">=<span class="hljs-number">12.0 <span class="hljs-subst">--acoustic<span class="hljs-attribute">-scale<span class="hljs-subst">=<span class="hljs-number">0.0769 <span class="hljs-subst">\
            scp:<span class="hljs-variable">$decode_dir/input<span class="hljs-built_in">.scp <span class="hljs-variable">$ac_model/final<span class="hljs-built_in">.mdl</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  • 1
  • 2
  • 3

12.直接./run.sh吧,就是开始回放识别了。里面有提示,./run.sh –test-mode live命令就是从麦克风识别。

13.升华部分在这里。我们试完tri1的模型后,一定很想试试tri2或3.但当你操作时,会遇到如下的问题:

ERROR (online<span class="hljs-attribute">-wav<span class="hljs-attribute">-gmm<span class="hljs-attribute">-decode<span class="hljs-attribute">-faster:LogLikelihoods():diag<span class="hljs-attribute">-gmm<span class="hljs-built_in">.cc:<span class="hljs-number">533) DiagGmm<span class="hljs-tag">::ComponentLogLikelihood, dimension mismatch <span class="hljs-number">39vs<span class="hljs-built_in">. <span class="hljs-number">40</span></span></span></span></span></span></span></span></span></span></span>

怎么解决? 仔细看看这个源文件,它是dieta的。如果要是ldp还得加matrix参数(拿tri2b举例)。

于是修改run.sh成如下这个样子 :(就是把12.mat(在tri2中final.mat是12.mat的快捷方式,所以拷贝final.mat)考过来,引入命令中)

ac_model=<span class="hljs-variable">${data_file}/models/<span class="hljs-variable">$ac_model_type
trans_matrix=<span class="hljs-string">"<span class="hljs-variable">$ac_model/12.mat"
audio=<span class="hljs-variable">${data_file}/audio

<span class="hljs-keyword">if [ <span class="hljs-operator">-s <span class="hljs-variable">$ac_model/matrix ]; <span class="hljs-keyword">then
    trans_matrix=<span class="hljs-variable">$ac_model/<span class="hljs-number">12.mat
<span class="hljs-keyword">fi</span></span></span></span></span></span></span></span></span></span></span></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

同时把把s5下的exp下的tri2b下的12.mat考到models的tri2b下。

14.再次修改run.sh成如下这个样子(添加2个参数–left-context=3 –right-context=3)

online<span class="hljs-attribute">-wav<span class="hljs-attribute">-gmm<span class="hljs-attribute">-decode<span class="hljs-attribute">-faster <span class="hljs-subst">--verbose<span class="hljs-subst">=<span class="hljs-number">1 <span class="hljs-subst">--rt<span class="hljs-attribute">-min<span class="hljs-subst">=<span class="hljs-number">0.8 <span class="hljs-subst">--rt<span class="hljs-attribute">-max<span class="hljs-subst">=<span class="hljs-number">0.85 <span class="hljs-subst">\
            <span class="hljs-subst">--<span class="hljs-keyword">max<span class="hljs-attribute">-active<span class="hljs-subst">=<span class="hljs-number">4000 <span class="hljs-subst">--beam<span class="hljs-subst">=<span class="hljs-number">12.0 <span class="hljs-subst">--acoustic<span class="hljs-attribute">-scale<span class="hljs-subst">=<span class="hljs-number">0.0769 <span class="hljs-subst">--left<span class="hljs-attribute">-context<span class="hljs-subst">=<span class="hljs-number">3 <span class="hljs-subst">--right<span class="hljs-attribute">-context<span class="hljs-subst">=<span class="hljs-number">3<span class="hljs-subst">\
            scp:<span class="hljs-variable">$decode_dir/input<span class="hljs-built_in">.scp <span class="hljs-variable">$ac_model/final<span class="hljs-built_in">.mdl <span class="hljs-variable">$ac_model/HCLG<span class="hljs-built_in">.fst <span class="hljs-subst">\
            <span class="hljs-variable">$ac_model/words<span class="hljs-built_in">.txt <span class="hljs-string">'1:2:3:4:5' ark,t:<span class="hljs-variable">$decode_dir/trans<span class="hljs-built_in">.txt <span class="hljs-subst">\
            ark,t:<span class="hljs-variable">$decode_dir/ali<span class="hljs-built_in">.txt <span class="hljs-variable">$trans_matrix;;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  • 1
  • 2
  • 3
  • 4
  • 5

15.运行./run.sh,结果如下。怎么样,有点酷不? 如果想使用tri2等模型做麦克风在线的,也同理修改就可以了。

online<span class="hljs-attribute">-wav<span class="hljs-attribute">-gmm<span class="hljs-attribute">-decode<span class="hljs-attribute">-faster <span class="hljs-subst">--verbose<span class="hljs-subst">=<span class="hljs-number">1 <span class="hljs-subst">--rt<span class="hljs-attribute">-min<span class="hljs-subst">=<span class="hljs-number">0.8 <span class="hljs-subst">--rt<span class="hljs-attribute">-max<span class="hljs-subst">=<span class="hljs-number">0.85 <span class="hljs-subst">--<span class="hljs-keyword">max<span class="hljs-attribute">-active<span class="hljs-subst">=<span class="hljs-number">4000 <span class="hljs-subst">--beam<span class="hljs-subst">=<span class="hljs-number">12.0 <span class="hljs-subst">--acoustic<span class="hljs-attribute">-scale<span class="hljs-subst">=<span class="hljs-number">0.0769 <span class="hljs-subst">--left<span class="hljs-attribute">-context<span class="hljs-subst">=<span class="hljs-number">3 <span class="hljs-subst">--right<span class="hljs-attribute">-context<span class="hljs-subst">=<span class="hljs-number">3 scp:<span class="hljs-built_in">./work/input<span class="hljs-built_in">.scp online<span class="hljs-attribute">-data/models/tri2b/final<span class="hljs-built_in">.mdl online<span class="hljs-attribute">-data/models/tri2b/HCLG<span class="hljs-built_in">.fst online<span class="hljs-attribute">-data/models/tri2b/words<span class="hljs-built_in">.txt <span class="hljs-number">1:<span class="hljs-number">2:<span class="hljs-number">3:<span class="hljs-number">4:<span class="hljs-number">5 ark,t:<span class="hljs-built_in">./work/trans<span class="hljs-built_in">.txt ark,t:<span class="hljs-built_in">./work/ali<span class="hljs-built_in">.txt online<span class="hljs-attribute">-data/models/tri2b/<span class="hljs-number">12.mat
File: D4_750
&#x82CF;&#x5317; &#x519B;&#x793C; &#x4E0B;&#x8DEA; &#x5C06; &#x662F; &#x9A6C; &#x6E5B; &#x6740;&#x4EBA; &#x91CC; &#x675C; &#x5510; &#x636E; &#x4E94; &#x82CF; &#x5E76; &#x6848; &#x4F46; &#x751C;&#x7F8E; &#x4F46; &#x4E5F; &#x5206;&#x6790; &#x6297;&#x6218;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  • 1
  • 2
  • 3

训练与解码脚本解读

本节结合官方文档对主要脚本进行解读。

以下流程中的符号解释:->表示下一步,{}表示循环,[]表示括号内每一个都要进行一次,()表示不同分支下可能进行的操作

1.train_mono.sh 用来训练单音子隐马尔科夫模型,一共进行40次迭代,每两次迭代进行一次对齐操作

gmm<span class="hljs-attribute">-init<span class="hljs-attribute">-mono<span class="hljs-subst">->compile<span class="hljs-attribute">-train<span class="hljs-attribute">-graphs<span class="hljs-subst">->align<span class="hljs-attribute">-equal<span class="hljs-attribute">-compiled<span class="hljs-subst">->gmm<span class="hljs-attribute">-est<span class="hljs-subst">->
{gmm<span class="hljs-attribute">-align<span class="hljs-attribute">-compiled<span class="hljs-subst">->gmm<span class="hljs-attribute">-acc<span class="hljs-attribute">-stats<span class="hljs-attribute">-ali<span class="hljs-subst">->gmm<span class="hljs-attribute">-est}<span class="hljs-number">40<span class="hljs-subst">->analyze_alignments<span class="hljs-built_in">.sh</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

2.train_deltas.sh 用来训练与上下文相关的三音子模型

check_phones_compatible<span class="hljs-built_in">.sh<span class="hljs-subst">->acc<span class="hljs-attribute">-tree<span class="hljs-attribute">-stats<span class="hljs-subst">-><span class="hljs-keyword">sum<span class="hljs-attribute">-tree<span class="hljs-attribute">-stats<span class="hljs-subst">->cluster<span class="hljs-attribute">-phones<span class="hljs-subst">->compile<span class="hljs-attribute">-questions<span class="hljs-subst">->
build<span class="hljs-attribute">-tree<span class="hljs-subst">->gmm<span class="hljs-attribute">-init<span class="hljs-attribute">-model<span class="hljs-subst">->gmm<span class="hljs-attribute">-mixup<span class="hljs-subst">->convert<span class="hljs-attribute">-ali<span class="hljs-subst">->compile<span class="hljs-attribute">-train<span class="hljs-attribute">-graphs<span class="hljs-subst">->
{gmm<span class="hljs-attribute">-align<span class="hljs-attribute">-compiled<span class="hljs-subst">->gmm<span class="hljs-attribute">-acc<span class="hljs-attribute">-stats<span class="hljs-attribute">-ali<span class="hljs-subst">->gmm<span class="hljs-attribute">-est}<span class="hljs-number">35<span class="hljs-subst">->analyze_alignments<span class="hljs-built_in">.sh</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  • 1
  • 2
  • 3

3.train_lda_mllt.sh 用来进行线性判别分析和最大似然线性转换

check_phones_compatible<span class="hljs-built_in">.sh<span class="hljs-subst">->split_data<span class="hljs-built_in">.sh<span class="hljs-subst">->ali<span class="hljs-attribute">-to<span class="hljs-attribute">-post<span class="hljs-subst">->est<span class="hljs-attribute">-lda<span class="hljs-subst">->acc<span class="hljs-attribute">-tree<span class="hljs-attribute">-stats<span class="hljs-subst">-><span class="hljs-keyword">sum<span class="hljs-attribute">-tree<span class="hljs-attribute">-stats<span class="hljs-subst">->
cluster<span class="hljs-attribute">-phones<span class="hljs-subst">->compile<span class="hljs-attribute">-questions<span class="hljs-subst">->build<span class="hljs-attribute">-tree<span class="hljs-subst">->gmm<span class="hljs-attribute">-init<span class="hljs-attribute">-model<span class="hljs-subst">->convert<span class="hljs-attribute">-ali<span class="hljs-subst">->compile<span class="hljs-attribute">-train<span class="hljs-attribute">-graphs<span class="hljs-subst">->
{gmm<span class="hljs-attribute">-align<span class="hljs-attribute">-compiled<span class="hljs-subst">->gmm<span class="hljs-attribute">-acc<span class="hljs-attribute">-stats<span class="hljs-attribute">-ali<span class="hljs-subst">->gmm<span class="hljs-attribute">-est}<span class="hljs-number">35<span class="hljs-subst">->analyze_alignments<span class="hljs-built_in">.sh</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  • 1
  • 2
  • 3

4.train_sat.sh 用来训练发音人自适应,基于特征空间最大似然线性回归

check_phones_compatible<span class="hljs-built_in">.sh<span class="hljs-subst">->ali<span class="hljs-attribute">-to<span class="hljs-attribute">-post<span class="hljs-subst">->acc<span class="hljs-attribute">-tree<span class="hljs-attribute">-stats<span class="hljs-subst">-><span class="hljs-keyword">sum<span class="hljs-attribute">-tree<span class="hljs-attribute">-stats<span class="hljs-subst">->cluster<span class="hljs-attribute">-phones<span class="hljs-subst">->compile<span class="hljs-attribute">-questions<span class="hljs-subst">->
build<span class="hljs-attribute">-tree<span class="hljs-subst">->gmm<span class="hljs-attribute">-init<span class="hljs-attribute">-model<span class="hljs-subst">->gmm<span class="hljs-attribute">-mixup<span class="hljs-subst">->convert<span class="hljs-attribute">-ali<span class="hljs-subst">->compile<span class="hljs-attribute">-train<span class="hljs-attribute">-graphs<span class="hljs-subst">->
{gmm<span class="hljs-attribute">-align<span class="hljs-attribute">-compiled<span class="hljs-subst">->(ali<span class="hljs-attribute">-to<span class="hljs-attribute">-post<span class="hljs-subst">->)gmm<span class="hljs-attribute">-acc<span class="hljs-attribute">-stats<span class="hljs-attribute">-ali<span class="hljs-subst">->gmm<span class="hljs-attribute">-est}<span class="hljs-number">35<span class="hljs-subst">->ali<span class="hljs-attribute">-to<span class="hljs-attribute">-post<span class="hljs-subst">->
gmm<span class="hljs-attribute">-est<span class="hljs-subst">->analyze_alignments<span class="hljs-built_in">.sh</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  • 1
  • 2
  • 3
  • 4

5.train_quick.sh 用来在现有特征上训练模型。
对于当前模型中在树构建之后的每个状态,它基于树统计中的计数的重叠判断的相似性来选择旧模型中最接近的状态。

check_phones_compatible<span class="hljs-built_in">.sh<span class="hljs-subst">->ali<span class="hljs-attribute">-to<span class="hljs-attribute">-post<span class="hljs-subst">->est<span class="hljs-attribute">-lda<span class="hljs-subst">->acc<span class="hljs-attribute">-tree<span class="hljs-attribute">-stats<span class="hljs-subst">-><span class="hljs-keyword">sum<span class="hljs-attribute">-tree<span class="hljs-attribute">-stats<span class="hljs-subst">->
cluster<span class="hljs-attribute">-phones<span class="hljs-subst">->compile<span class="hljs-attribute">-questions<span class="hljs-subst">->build<span class="hljs-attribute">-tree<span class="hljs-subst">->gmm<span class="hljs-attribute">-init<span class="hljs-attribute">-model<span class="hljs-subst">->convert<span class="hljs-attribute">-ali<span class="hljs-subst">->compile<span class="hljs-attribute">-train<span class="hljs-attribute">-graphs<span class="hljs-subst">->
{gmm<span class="hljs-attribute">-align<span class="hljs-attribute">-compiled<span class="hljs-subst">->gmm<span class="hljs-attribute">-acc<span class="hljs-attribute">-stats<span class="hljs-attribute">-ali<span class="hljs-subst">->gmm<span class="hljs-attribute">-est}<span class="hljs-number">20<span class="hljs-subst">->analyze_alignments<span class="hljs-built_in">.sh</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
  • 1
  • 2
  • 3

6.run_dnn.sh 用来训练DNN,包括xent和MPE

{make_fbank<span class="hljs-preprocessor">.sh->compute_cmvn_stats<span class="hljs-preprocessor">.sh}[train,dev,test]->train<span class="hljs-preprocessor">.sh->{decode<span class="hljs-preprocessor">.sh}[phone,word]->
align<span class="hljs-preprocessor">.sh->make_denlats<span class="hljs-preprocessor">.sh->train_mpe<span class="hljs-preprocessor">.sh->{{decode<span class="hljs-preprocessor">.sh}[phone,word]}<span class="hljs-number">3</span></span></span></span></span></span></span></span></span>

7.train_mpe.sh 用来训练dnn的序列辨别MEP/sMBR
这个阶段训练神经网络以联合优化整个句子,这比帧级训练更接近于一般ASR目标。
sMBR的目的是最大化从参考转录对齐导出的状态标签的期望正确率,而使用网格框架来表示竞争假设。
训练使用每句迭代的随机梯度下降法。
首先使用固定的低学习率1e-5(sigmoids)运行3-5轮。
在第一轮迭代后重新生成词图,我们观察到快速收敛。
我们支持MMI, BMMI, MPE 和sMBR训练。所有的技术在Switchboard 100h集上是相同的,仅仅在sMBR好一点点。
在sMBR优化中,我们在计算近似正确率的时候忽略了静音帧。

{nnet<span class="hljs-attribute">-train<span class="hljs-attribute">-mpe<span class="hljs-attribute">-sequential}<span class="hljs-number">3<span class="hljs-subst">->make_priors<span class="hljs-built_in">.sh</span></span></span></span></span></span>

8.train_dae.sh 用来实验基于dae的去噪效果

compute_cmvn_stats<span class="hljs-preprocessor">.sh->{<span class="hljs-keyword">add-noise-mod<span class="hljs-preprocessor">.py->make_fbank<span class="hljs-preprocessor">.sh->compute_cmvn_stats<span class="hljs-preprocessor">.sh}[train,dev,test]->
train<span class="hljs-preprocessor">.sh->nnet-concat->{{decode<span class="hljs-preprocessor">.sh}[phone,word]}[train,dev,test]</span></span></span></span></span></span></span>

9.train.sh 用来训练深度神经网络模型,帧交叉熵训练,该相位训练将帧分类为三音状态的DNN。这是通过小批量 随机梯度下降完成的。
默认使用Sigmoid隐藏单元,Softmax输出单元和完全连接的AffineTransform层,学习率是0.008,小批量的大小
为256。
我们没有使用动量或正则化(注:最佳学习率和隐藏单元的类型不同,sigmoid的值为0.008,tanh为0.00001。
通过’–feature-transform’和’-dbn’将input——transform和预训练的DBN传入此脚本,只有输出层被随机初始化。
我们使用提前停止来防止过度拟合,为此我们测量交叉验证集合(即保持集合)上的目标函数,
因此需要两对特征对齐dir来执行监督训练

feat<span class="hljs-attribute">-to<span class="hljs-attribute">-dim<span class="hljs-subst">->nnet<span class="hljs-attribute">-initialize<span class="hljs-subst">->compute<span class="hljs-attribute">-cmvn<span class="hljs-attribute">-stats<span class="hljs-subst">->nnet<span class="hljs-attribute">-forward<span class="hljs-subst">->nnet<span class="hljs-attribute">-concat<span class="hljs-subst">->cmvn<span class="hljs-attribute">-to<span class="hljs-attribute">-nnet<span class="hljs-subst">->
feat<span class="hljs-attribute">-to<span class="hljs-attribute">-dim<span class="hljs-subst">->apply<span class="hljs-attribute">-cmvn<span class="hljs-subst">->nnet<span class="hljs-attribute">-forward<span class="hljs-subst">->nnet<span class="hljs-attribute">-initialize<span class="hljs-subst">->train_scheduler<span class="hljs-built_in">.sh</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

10.train_scheduler.sh 典型的情况就是,train_scheduler.sh被train.sh调用。
一开始需要在交叉验证集上运行,主函数需要根据$iter来控制迭代次数和学习率。
学习率会随着目标函数相对性的提高而变化:
如果提高大于’start_halving_impr=0.01’,初始化学习率保持常数
否则学习率在每次迭代中乘以’halving_factor=0.5’来缩小
最后,如果提高小于’end_halving_impr=0.001’,训练终止。

11.mkgraph.sh 用来建立一个完全的识别网络

12.decode.sh 用来解码并生成词错率结果

13.align_si.sh 对制定的数据进行对齐,作为新模型的输入

14.make_fmllr_feats.sh 用来保存FMLLR特征

15.pretrain_dbn.sh 深度神经网络预训练脚本

16.decode_fmllr.sh 对发音人自适应的模型进行解码操作

17.nnet-train-frmshuff.cc 最普遍使用的神经网络训练工具,执行一次迭代训练。过程:
–feature-transform 即时特征扩展
NN输入-目标对的每帧重排
小批量随机梯度下降(SGD)训练
支持的每帧目标函数(选项 – 对象函数):
Xent:每帧交叉熵
Mse:每帧均方误差

18.nnet-forward.cc 通过神经网络转发数据,默认使用CPU。选项:
–apply-log :产生神经网络的对数输出(比如:得到对数后验概率)
–no-softmax :从模型中去掉soft-max层
—class-frame-counts:从声学得分中减去计算对数的计数

专有缩写中文解释

cmvn&#xFF1A;&#x5012;&#x8C31;&#x5747;&#x503C;&#x548C;&#x65B9;&#x5DEE;&#x5F52;&#x4E00;&#x5316;
fft&#xFF1A;&#x5FEB;&#x901F;&#x5085;&#x91CC;&#x53F6;&#x53D8;&#x6362;
GMM&#xFF1A;&#x9AD8;&#x65AF;&#x6DF7;&#x5408;&#x6A21;&#x578B;
MFCC&#xFF1A;&#x6885;&#x5C14;&#x5012;&#x8C31;&#x7CFB;&#x6570;
pcm&#xFF1A;&#x8109;&#x51B2;&#x7F16;&#x7801;&#x8C03;&#x5236;
pdf&#xFF1A;&#x6982;&#x7387;&#x5206;&#x5E03;&#x51FD;&#x6570;
PLP&#xFF1A;&#x611F;&#x77E5;&#x7EBF;&#x6027;&#x9884;&#x6D4B;&#x7CFB;&#x6570;
SGMM&#xFF1A;&#x5B50;&#x7A7A;&#x95F4;&#x9AD8;&#x65AF;&#x6DF7;&#x5408;&#x6A21;&#x578B;
UBM&#xFF1A;&#x901A;&#x7528;&#x80CC;&#x666F;&#x6A21;&#x578B;
VTLN&#xFF1A;&#x7279;&#x5F81;&#x7EA7;&#x58F0;&#x9053;&#x957F;&#x5EA6;&#x5F52;&#x4E00;&#x5316;

Original: https://www.cnblogs.com/zhwl/p/12881306.html
Author: 郑文亮
Title: kaldi 在线识别

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/546236/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • idea tomcat 输出乱码问题

    配置idea:Help -> Edit Custom VM Options,增加 -Dfile.encoding=UTF-8,tomcat的日志输出就不乱码了 tomcat启…

    技术杂谈 2023年7月11日
    070
  • GIT使用说明

    1、Git入门教程 1.1:Git入门与使用 (一) Git介绍与安装 1.2:Git入门与使用 (二) Git相关命令的介绍与使用 1.3:Git入门与使用 (三) 使用GitH…

    技术杂谈 2023年6月21日
    093
  • c# 获取数字的小数位数

    /// /// &#x83B7;&#x53D6;&#x5C0F;&#x6570;&#x4F4D;&#x6570; /// /// &…

    技术杂谈 2023年5月30日
    096
  • Docker搭建STF私有移动测试云平台

    一. STF介绍 Smartphone Test Farm(简称STF)是一个web应用程序,主要用于从指定的浏览器中远程调试智能手机、智能手表等,可远程调试超过160多台设备。S…

    技术杂谈 2023年7月24日
    080
  • Maven进行clean时报错,解决方法

    Q1:由于网络原因,maven仓库中产生了后缀LastUpdated文件,再次clean直接报错 参考方法:https://www.cnblogs.com/DDgougou/p/1…

    技术杂谈 2023年6月21日
    0107
  • 我是仙人掌社论

    闲话被虎哥扬了,哼哼啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊! 遂水篇博客 . 我是仙人掌珂…

    技术杂谈 2023年7月23日
    0111
  • PyQt5 设置鼠标形状

    ################################ PyQt5中文网 – PyQt5全套视频教程 # https://www.PyQt5.cn/ # 主讲: 村长 #…

    技术杂谈 2023年5月31日
    0105
  • 「甄知科技」收购数智化开发平台「猪齿鱼」,将和已有产品「燕千云」融合形成产品闭环

    甄知 • 使命源自解决流程挑战 36氪获悉,专注企业业务服务和软件研发管理的「甄知科技」将完成对数智化开发平台「猪齿鱼」的收购。据了解,本次收购后,「甄知科技」将通过「燕千云」和「…

    技术杂谈 2023年7月24日
    069
  • CentOS7 安装 OpenBLAS

    将仓库clone到本地 git clone https://github.com/xianyi/OpenBLAS.git GitHub 地址:https://github.com/…

    技术杂谈 2023年7月10日
    074
  • ThreadLocal类的一个小应用

    先前使用多线程模拟体检科室体检,但是循环使用的是while(true),一直在思考加一个线程去判断是否完成体检,然后终止这些死循环,后来发现这种idea显然绕远了。现在借助Thre…

    技术杂谈 2023年7月24日
    065
  • 设计模式-工厂方法模式 实战演习 代码实现

    一、工厂方法模式介绍 工厂模式,是一种创建型设计模式,其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。 工厂模式是 Java 开发中最常见的一种模式,其主要意图是…

    技术杂谈 2023年7月25日
    081
  • 复杂度分析

    复杂度 复杂度分析是数据结构与算法的核心精髓,指在不依赖硬件、宿主环境、数据集的情况下,粗略推导,考究出算法的效率和资源消耗情况, 包括时间复杂度和空间复杂度 时间复杂度 首先从C…

    技术杂谈 2023年7月23日
    080
  • 用户成长体系-积分体系设计

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/shoshana-kong/p/16498618.htm…

    技术杂谈 2023年6月1日
    095
  • JavaCV的摄像头实战之五:推流

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是《JavaCV的摄…

    技术杂谈 2023年7月11日
    0105
  • 八、变量与常量

    一、变量 1.1、变量的基本概念 Java是一种强类型语言,每个变量都必须声明其类型。Java变量是程序中最基本的存储单元,其要素包括变量名、变量类型和作用域。 type varN…

    技术杂谈 2023年6月21日
    0121
  • 关于构建学术型实验室的若干指导意见

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/hxsyl/p/6500718.htmlAuthor: …

    技术杂谈 2023年5月31日
    0104
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球