• 应用HTK搭建语音拨号系统2:创建单音素HMM模型


    选自:http://maotong.blog.hexun.com/6204849_d.html

    苏统华

    哈尔滨工业大学人工智能研究室

    2006年10月30日

     

    声明:版权所有,转载请注明作者和来源

    该系统能够识别连续说出的数字串和若干组姓名。建模是针对子词(sub-word, eg. 音素),具有一定的可扩充性。当加入一个新名字时,只需修改发音词典和任务语法即可。模型为连续混合高斯输出,运用语音决策树聚类形成的绑定状态式三音素。

    2. 创建单音素HMM模型

    涉及创建一系列单高斯单音素HMM的过程。

    [step 6]一致初始法创建单音素模型

    定义一个原始模型proto

    文件名:proto

    ~o <VecSize> 39 <MFCC_0_D_A>

    ~h "proto"

    <BeginHMM>

      <NumStates> 5

      <State> 2

        <Mean> 39

          0.0 (x39)

        <Variance> 39

          1.0  (x39)

     <State> 3

        <Mean> 39

          0.0  (x39)

        <Variance> 39

          1.0  (x39)

     <State> 4

        <Mean> 39

          0.0  (x39)

        <Variance> 39

          1.0  (x39)

     <TransP> 5

      0.0 1.0 0.0 0.0 0.0

      0.0 0.6 0.4 0.0 0.0

      0.0 0.0 0.6 0.4 0.0

      0.0 0.0 0.0 0.7 0.3

      0.0 0.0 0.0 0.0 0.0

    <EndHMM>

    训练文件存于train.scp中,用全局均值和方差来初始化HMM模型的高斯参数:

    HCompV -C .configconfig1 -f 0.01 -m -S train.scp -M .hmmshmm0 proto

     

    注4:也可以省掉-C参数,只要train.scp里是特征文件列表,并且特征是MFCC_0_D_A

     

    在目录hmm0下生成了更新后的proto和一个截至宏vFloors基于.hmmshmm0下的两个文件手工制作主宏文件Master Macro Filehmmdefs和与vFloors相关的宏macro,具体制作过程见HTK book,压缩包中有实例

    由于暂时不用sp模型,删去monophones1中的sp构成monophones0文件重估参数:

    HERest -C .configconfig1 -I .labelsphones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H .hmmshmm0macros -H .hmmshmm0hmmdefs -M .hmmshmm1 .listsmonophones0

     

    同上,重复估计两次:

    HERest -C .configconfig1 -I .labelsphones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H .hmmshmm1macros -H .hmms\hmm1hmmdefs -M .hmmshmm2 .listsmonophones0

     

    HERest -C .configconfig1 -I .labelsphones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H .hmmshmm2macros -H .hmmshmm2hmmdefs -M .hmmshmm3 .listsmonophones0

     

    注5:为节省空间,也因为上面三步很简单(想出错都难),hmm1和hmm2下的模型文件并没有包含在压缩包里。但hmm3下的模型文件包含在压缩包里了(因为下一步要用到)。

     

    [step 7]修补哑音素模型

    sil模型加入回溯链,对sp绑定到sil的中间状态上。具体的,哑音素模型按下面两步执行。首先,修改hmm3hmmdef,复制sil的中间状态为sp模型的唯一状态,另存到hmmshmm4目录下。然后,指明sp绑定到sil中间状态,利用HHEd加入回溯转移概率:

    HHEd -H .hmmshmm4macros -H .hmmshmm4hmmdefs -M .hmmshmm5 sil.hed .listsmonophones1

    修改mkphones0.led,去掉最后一行,存为mkphones1.led,利用HLEd工具得到包含sp的音素级真值文本:

    HLEd -l * -d .dictdict1 -i .labelsphones1.mlf mkphones1.led .labels rainwords.mlf

     

    重估两次:

    HERest -C .configconfig1 -I .labelsphones1.mlf -t 250.0 150.0 1000.0 -S train.scp -H .hmmshmm5macros -H .hmmshmm5hmmdefs -M .hmmshmm6 .listsmonophones1

     

    HERest -C .configconfig1 -I .labelsphones1.mlf -t 250.0 150.0 1000.0 -S train.scp -H .hmmshmm6macros -H .hmmshmm6hmmdefs -M .hmmshmm7 .listsmonophones1

     

    注6:hmm5和hmm6下的模型文件并没有包含在压缩包里。为了进行下面的阶段性测试,hmm7下的模型文件包含在压缩包里了。

     

    这么没头没尾的干下去,太枯燥了!我们先看看这时的识别率如何吧,也能增加一点成就感。执行如下命令:

    HVite -H .hmmshmm7macros -H .hmmshmm7hmmdefs -S test.scp -l * -i . esults ecout_step7.mlf -w wdnet -p 0.0 -s 5.0 .dictdict1 .listsmonophones1

     

    HResults -I .labels estwords.mlf .listsmonophones1 . esults ecout_step7.mlf

    输出结果如下:

    ====================== HTK Results Analysis =======================

      Date: Mon Oct 30 20:20:52 2006

      Ref : .labels estwords.mlf

      Rec : . esults ecout_step7.mlf

    ------------------------ Overall Results --------------------------

    SENT: %Correct=0.00 [H=0, S=15, N=15]

    WORD: %Corr=94.12, Acc=41.18 [H=64, D=0, S=4, I=36, N=68]

    ==============================================================

    看着上面的结果,你不感到奇怪么?话语级识别正确率怎么是零!通过分析识别输出文件recout_step7.mlf,发现在每一句上都加上了SENT-STARTSENT-END。这是与标注真值文本无法完全吻合的黑手呀!一个解决办法是在运行HResults时加入-e选项来忽略掉SENT-STARTSENT-END,如下所示:

    HResults -e ??? SENT-START -e ??? SENT-END -I .labels estwords.mlf .listsmonophones1 . esults ecout_step7.mlf

    这时的输出结果:

    ====================== HTK Results Analysis =======================

      Date: Mon Oct 30 20:33:27 2006

      Ref : .labels estwords.mlf

      Rec : . esults ecout_step7.mlf

    ------------------------ Overall Results --------------------------

    SENT: %Correct=66.67 [H=10, S=5, N=15]

    WORD: %Corr=94.12, Acc=85.29 [H=64, D=0, S=4, I=6, N=68]

    ===============================================================

     

    上面的方案可以解决问题,但不是很完美。应该在获得的识别结果中(recount_step7.mlf)不产生SENT-STARTSENT-END才好。分析dict1字典发现,对应SENT-STARTSENT-END的相关信息如下:

    SENT-END        sil

    SENT-START      sil

    应该加入[]以表示他们并不输出任何东西。把dict1字典另存为dict2并替换上面两行成如下形式:

    SENT-END        []  sil

    SENT-START      []  sil

    重新运行问题解决。相应的,HResults的参数可以省掉-e了:

    HVite -H .hmmshmm7macros -H .hmmshmm7hmmdefs -S test.scp -l * -i . esults ecout_step7_2.mlf -w wdnet -p 0.0 -s 5.0 .dictdict2 .listsmonophones1

     

    HResults -I .labels estwords.mlf .listsmonophones1 . esults ecout_step7_2.mlf

     

    [step 8]重校准训练数据

    确认trainwords.mlf中的路径为”*/S0???.lab”,修改dict2 加入silence sil一项,另存为dict3,执行HVite进行Viterbi校准:

    HVite -l * -o SWT -b silence -C .configconfig1 -a -H .hmmshmm7macros -H .hmmshmm7hmmdefs -i .labelsaligned.mlf -m -t 350.0 -y lab -I .labels rainwords.mlf -S train.scp .dictdict3 .listsmonophones1

     

    重估两次:

    HERest -C .configconfig1 -I .labelsaligned.mlf -t 250.0 150.0 1000.0 -S train.scp -H .hmmshmm7macros -H .hmmshmm7hmmdefs -M .hmmshmm8 .listsmonophones1

     

    HERest -C .configconfig1 -I .labelsaligned.mlf -t 250.0 150.0 1000.0 -S train.scp -H .hmmshmm8macros -H .hmmshmm8hmmdefs -M .hmmshmm9 .listsmonophones1

     

    我们再来看看这时的识别率怎么样。

    HVite -H .hmmshmm9macros -H .hmmshmm9hmmdefs -S test.scp -l * -i . esults ecout_step8.mlf -w wdnet -p 0.0 -s 5.0 .dictdict2 .listsmonophones1

     

    HResults -I .labels estwords.mlf .listsmonophones1 . esults ecout_step8.mlf

    这时的输出结果:

    ====================== HTK Results Analysis =======================

      Date: Mon Oct 30 21:06:51 2006

      Ref : .labels estwords.mlf

      Rec : . esults ecout_step8.mlf

    ------------------------ Overall Results --------------------------

    SENT: %Correct=73.33 [H=11, S=4, N=15]

    WORD: %Corr=97.06, Acc=88.24 [H=66, D=0, S=2, I=6, N=68]

    ===============================================================

     

    可以看出,识别结果比校准前有不小的提高。我们继续重估两次测试一下结果,看看会出现什么情况:

    HERest -C .configconfig1 -I .labelsaligned.mlf -t 250.0 150.0 1000.0 -S train.scp -H .hmmshmm9macros -H .hmmshmm9hmmdefs -M .hmmshmm9_1 .listsmonophones1

     

    HERest -C .configconfig1 -I .labelsaligned.mlf -t 250.0 150.0 1000.0 -S train.scp -H .hmmshmm9_1macros -H .hmmshmm9_1hmmdefs -M .hmmshmm9_2 .listsmonophones1

     

    HVite -H .hmmshmm9macros -H .hmmshmm9hmmdefs -S test.scp -l * -i . esults ecout_step8_2.mlf -w wdnet -p 0.0 -s 5.0 .dictdict2 .listsmonophones1

     

    HResults -I .labels estwords.mlf .listsmonophones1 . esults ecout_step8_2.mlf

    识别结果如下:

    ====================== HTK Results Analysis =======================

      Date: Mon Oct 30 21:18:34 2006

      Ref : .labels estwords.mlf

      Rec : . esults ecout_step8_2.mlf

    ------------------------ Overall Results --------------------------

    SENT: %Correct=73.33 [H=11, S=4, N=15]

    WORD: %Corr=97.06, Acc=88.24 [H=66, D=0, S=2, I=6, N=68]

    ==============================================================

     

    发现识别结果提高有限!下面通过绑定状态的三音素模型来进一步提高识别效果。

     

    注7:hmm8和hmm9_1下的模型文件并没有包含在压缩包里。

  • 相关阅读:
    百度地图API示例之小实践 添加代理商标注
    MySQL分组操作
    MySQL连表操作
    MySQL多对多操作
    MySQL一对一操作
    MySQL唯一索引
    MySQL用户授权管理
    MySQL外键操作
    MySQL删操作
    MySQL增操作
  • 原文地址:https://www.cnblogs.com/welen/p/3781888.html
Copyright © 2020-2023  润新知