HTK 连续语音识别系统搭建

本文详细介绍了如何利用HTK工具从头构建一个针对中文发音的数字连续语音识别系统。步骤包括:创建语法文件、生成词网络、制作词典、录音、创建标注文件、提取音频特征、进行HMM模型训练、确定静音模型、建立三音素模型、模型绑定及结果验证。通过这个过程,作者实现了对数字序列的准确识别。
摘要由CSDN通过智能技术生成

HTK 连续语音识别系统搭建

前言

本文参考自HTK BOOK,完成数字序列的连续语音识别系统搭建,数字按照中文发音,如果HTK安装存在问题,或者HTK工具、脚本存在缺失,不在本文范围内;step by step! 详细步骤! 话不多说,开始!

步骤

  1. 建立目标语法文件:digit.gram, 内容如下:

    $digit= ( one | two | three | four | five | six | seven | eight | nine | zero );
    (SENT-START <$digit > SENT-END)
    
  2. 由语法文件生成词网络 :
    执行命令HParse digit.gram digit.net 生成 digit.net 词网络,digit.net的内容大致如下:

    VERSION=1.0
    N=15   L=33   
    I=0    W=SENT-END            
    I=1    W=zero                
    I=2    W=!NULL               
    I=3    W=nine                
    I=4    W=eight               
    I=5    W=seven               
    ...
    J=23    S=2    E=8    
    J=24    S=12   E=8    
    J=25    S=2    E=9    
    J=26    S=12   E=9    
    J=27    S=2    E=10   
    J=28    S=12   E=10   
    J=29    S=2    E=11   
    J=30    S=12   E=11   
    J=31    S=14   E=12   
    J=32    S=0    E=13   
    
    
  3. 生成词典:dict
    在HTK BOOK中,是使用HDMan -m -w wlist -n monophones0 -l dlog dict beep names生成词典和monophones,beep和names这两个发音词典需要用户下载、编辑,然后HDMan 将wlist中的词依次标上发音,beep词典htk book中给出了链接下载,这里可能会报order的问题,词典必须先排序。
    在本文中,并未采用该词典,而是直接手动编辑,本文采用的是中文发音(虽然符号是英文的one,two…你也可以用中文‘一’,‘二’…,但不能用阿拉伯数字12345…,会出错),不会采用beep发音词典,以下是手动编辑的dict:

    SENT-END        sil
    SENT-START      sil
    eight           b a 
    five            u 
    four            s I 
    nine            j y ow 
    one             i 
    seven           q i 
    six             l y ow 
    three           s a nT 
    two             er 
    zero            l i ng 
    

    monophone.0,训练词典中的音素列表,手动编辑如下:

    l
    i
    ng
    er
    s
    a
    nT
    I
    u
    y
    ow
    q
    b
    j
    sil
    

    如果你有大量词汇,建议还是用HDMan来生成

  4. 录音:
    采用HTK自带的工具录音(仅windows),命令HSGen -l -n 200 digit.net dict > testprompts,生成testprompts,该文件是按照语法网络随机生成的sentence,然后按照testprompts的内容录音,testprompts文件内容大概如下:

    1. SENT-START one eight two SENT-END 
    2. SENT-START six three one two SENT-END 
    ...
    n-1. SENT-START eight five three eight six nine five eight seven eight one SENT-END 
    n. SENT-START five SENT-END 
    

    HTK的HSLab工具,执行HSLab noname,弹出界面如下,点击rec,说话,然后点击stop,最后save:
    在这里插入图片描述

  5. 建立词级别标注文件
    HTKTutorial目录下提供的prompts2mlf脚本,根据testprompts生成标注文件digit.mlf(需要根据你wav保存的文件名做适当编辑),mlf文件大致如下:

    #!MLF!#
    "*/noname_s1.lab"
    one
    eight
    two
    .
    "*/noname_s2.lab"
    six
    three
    one
    two
    .
    ......
    
  6. 建立音素级别标注文件
    HLEd 工具完成音素级别标注,命令HLEd -l * -d dict -i phones0.mlf mkphones0.led digit.mlf,其中mkphones0.led文件内容编辑如下,具体含义可查看htk book:

    EX
    IS sil sil
    DE sp
    

    生成的phones0.mlf文件如下:

    #!MLF!#
    "*/noname_s1.lab"
    sil
    i
    b
    a
    er
    sil
    .
    "*/noname_s2.lab"
    sil
    l
    y
    ow
    s
    a
    nT
    i
    er
    sil
    .
    ......
    
  7. wav编码
    编码即音频特征提取,本文跟htk book保持一致,采用mfcc特征
    命令:HCopy -T 1 -C mfcc.cfg -S wav.scp
    其中mfcc.cfg内容如下:

    # Coding parameters
    TARGETKIND = MFCC_0_D_A
    TARGETRATE = 100000.0
    SAVECOMPRESSED = T
    SAVEWITHCRC = T
    WINDOWSIZE = 250000.0
    USEHAMMING = T
    PREEMCOEF = 0.97
    NUMCHANS = 26
    CEPLIFTER = 22
    NUMCEPS = 12
    ENORMALISE = F
    

    wav.scp文件内容大致如下,根据你自己的路径和文件名来编辑,linux系统也一样:

    E:\htk_demo\noname_s1.wav E:\htk_demo\noname_s1.mfc
    E:\htk_demo\noname_s2.wav E:\htk_demo\noname_s2.mfc
    E:\htk_demo\noname_s4.wav E:\htk_demo\noname_s4.mfc
    E:\htk_demo\noname_s5.wav E:\htk_demo\noname_s5.mfc
    E:\htk_demo\noname_s6.wav E:\htk_demo\noname_s6.mfc
    ...
    

    执行完后,会生成与wav文件对应的mfcc特征文件

  8. 建立Flat Start Monophones (单高斯)
    大部分情况下,我们很难事先去做音素级别的标注,所以采用Flat Start 的方式初始化。
    命令HCompV -C mfcc.cfg -f 0.01 -m -S wav.scp -M hmm0 proto, 记得手动创建hmm0文件夹,同时需要先定义HMM模型,proto文件如下:

    ~o <VecSize> 39 <MFCC_0_D_A>
    ~h "proto"
    <BeginHMM>
    <NumStates> 5
    <State> 2
    <Mean> 39
    0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值