应用HTK搭建语音拨号系统1:数据准备

时间:2021-10-05 16:16:52

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

应用HTK搭建语音拨号系统--数据准备

苏统华

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

2006年10月30日

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

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

1. 数据准备

需要录制训练数据和测试数据。为进行校准,还需要数据的标注文本。这里用任务语法(task grammar)产生真值文本(ground truth)。为了处理训练数据,需要定义一个语音集合和一个字典用以涵盖训练和测试数据中涉及的单词。

[step 1]任务语法定义

任务语法以包含变量的正则表达式形式定义,存储在文件gram里:

文件名:gram

$digit = ONE | TWO | THREE | FOUR | FIVE |

SIX | SEVEN | EIGHT | NINE | OH | ZERO;

$name = [ SUE ] LAW |

[ JULIAN ] TYLER |

[ DAVE ] WOOD |

[ PHIL ] LEE |

[ STEVE ] YOUNG;

( SENT-START ( DIAL <$digit> | (PHONE|CALL) $name) SENT-END )

上面的语法是高层表示,必须通过HParse转成HTK可用的底层表示。底层表示存于文件wnet中:

HParse gram wdnet

文件名:wdnet

VERSION=1.0

N=31   L=62

I=0    W=SENT-END

I=1    W=YOUNG

I=2    W=!NULL

……

J=0     S=2    E=0

J=1     S=16   E=0

……

J=61    S=0    E=29

[step 2]字典定义

此例中利用BEEP语音字典,除去其中的重音符,并在每个发音后加入sp(short pause,小停顿)。如果有哑音标志,就用MP命令把sil和sp合并成sil。这些处理命令放在global.ded编辑脚本中:

文件名:global.ded

AS sp

RS cmu

MP sil sil sp

执行HDMan生成与任务相关的发音词典dict1:

HDMan -m -w .\lists\wlist -n .\lists\monophones1 -l dlog .\dict\dict1 .\dict\beep .\dict\names

上面的names文件是手工制作的专有人名的发音(包括SEND-START,SEND-END),文件wlist是出现在任务语法中的所有单词的有序列表,文件monophones1是用到的音素的列表,dlog为参数文件。

注1:实际上,这里应该手工修改dict1,为SENT-END 和SENT-START加上无输出标志,为了展示队后面步骤地影响,这里故意不添加。

文件名:.\dict\dict1

CALL            k ao l sp

DAVE            d ey v sp

DIAL            d ay ax l sp

EIGHT           ey t sp

FIVE            f ay v sp

FOUR            f ao sp

FOUR            f ao r sp

JULIAN          jh uw l ia n sp

JULIAN          jh uw l y ax n sp

LAW             l ao sp

LEE             l iy sp

NINE            n ay n sp

OH              ow sp

ONE             w ah n sp

PHIL            f ih l sp

PHONE           f ow n sp

SENT-END        sil

SENT-START      sil

SEVEN           s eh v n sp

SIX             s ih k s sp

STEVE           s t iy v sp

SUE             s uw sp

SUE             s y uw sp

THREE           th r iy sp

TWO             t uw sp

TYLER           t ay l ax sp

WOOD            w uh d sp

YOUNG           y ah ng sp

ZERO            z ia r ow sp

文件名:.\dict\names

DAVE            d ey v

JULIAN  jh uw l y ax n

JULIAN  jh uw l ia n

LAW                     l ao

LEE               l iy

PHIL              f ih l

SENT-END    [] sil

SENT-START       [] sil

STEVE           s t iy v

SUE               s uw

SUE               s y uw

TYLER          t ay l ax

WOOD          w uh d

YOUNG         y ah ng

为了避免在dlog里出现烦人的wanning,那就在names和beep同一目录下分别建立同名的编辑脚本,内容为空即可。

文件名:names.ded

文件名:beep.ded

[step 3]录制语音数据

HSGen工具可以生成符合task grammar的句子,用来指导录音(HTK book 里叫sentence prompts):

HSGen -l -n 140 wdnet .\dict\dict1>.\labels\trainprompts

HSGen -l -n 15 wdnet .\dict\dict1>.\labels\testprompts

根据上述指令文件,录制相应的140个训练用语音数据文件和15个测试用语音数据文件。一个录制的例子如下:

HSLab .\data\Train\speech\S0001

注2:随本文的压缩包没有包括这些数据文件,但包括了它们对应的特征文件,所以对整个实验没有什么影响。

[step 4]标注数据,得到真值文件

Perl脚本prompts2mlf可以把录音文本截成单词级真值文件。例如:

perl .\scripts\prompts2mlf .\labels\trainwords.mlf .\labels\trainprompts

perl .\scripts\prompts2mlf .\labels\testwords.mlf .\labels\testprompts

标注编辑器HLEd可把单词级真值文本(word level MLF)转成音素级真值文本(phone level MLF):

HLEd -l * -d .\dict\dict1 -i .\labels\phones0.mlf mkphones0.led .\labels\trainwords.mlf

编辑脚本mkphones0.led的内容如下:

文件名:mkphones0.led

EX

IS sil sil

DE sp

EX命令表示按照字典dict1进行展开,IS表示在每个话语的前后插入标志,DE一行表示phones0.mlf中单词间不用sp隔开。

[step 5]数据的特征提取

这里所用特征为MFCC。工具HCopy可以实现提取特征的工作。

HCopy -T 1 -C .\config\config1 -S codetr.scp

其中,配置文件config1要设置转换参数,另一脚本文件(script file)codetr.scp指定训练及输入和输出文件列表。执行结果,HCopy对codetr.scp文件左侧的语音数据按config的配置提取特征并存入codetr.scp文件右侧特征文件中。

文件名:.\config\config1

# 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

对于测试数据如法炮制:

HCopy -T 1 -C .\config\config1 -S codete.scp

注3:由于附带的压缩包已经包括了特征文件(在.\data\*\feature下),本步骤不用执行。