使用HTK搭建英文大词汇量连续语音识别系统(一)_htk 语音识别_Coding_Bug_Lu的博客-程序员秘密

技术标签: 语音识别  

在整个语音识别系统的搭建中,参考了博客https://blog.csdn.net/qq_43150721/article/details/98646889,自己动手搭建时,遇到了博客中没提到的问题,故记录下。

一、准备工作

  1. TIMIT语音库
    本文使用TIMIT语音库对系统进行训练和测试,这里分享TIMIT语音库如下:
    链接:https://pan.baidu.com/s/1Im5wSu-njmI9ci7CtIzGew
    提取码:3inh
    下载后,将压缩包中TIMIT文件夹解压,我在电脑D盘新建文件夹D:\HTK\dataset_TIMIT并解压至此。
  2. 设置环境变量,连接VCVARS32
    每次打开cmd,一定要设置环境变量,执行以下两步:

path=%path%;D:\Microsoft Visual Studio\VS2019pro\VC\Auxiliary\Build

然后输入VCVARS32。

path=%path%;D:\HTK\htk\bin.win32

如果嫌每次设置环境变量麻烦,也可以一次性解决,操作如下:
进入控制面板->系统,点击高级系统设置:
在这里插入图片描述
点击“环境变量"->在系统变量中选中”Path“,点击编辑,新建bin.win32和VS路径:
在这里插入图片描述
至此环境变量设置完成,打开cmd,输入HInit检验一下,如图:
在这里插入图片描述
3. 在D:\HTK中创建新文件夹data1,用于存放使用HTK的各种工具生成的我们所需要的文件。

二、建立发音字典,生成dict1、monophones1、dlog文件

1.用python对timit语音库中所有的.txt文本的路径及内容进行抓取,建立训练数据集抄本文件trainprompts
用python创建抄本文件trainprompts,代码如下:

import os
import re

# make English text clean
def clean_en_text(text):
    # keep English '-' ''' and space
    comp = re.compile('[^A-Z^a-z^\-^\' ]')
    return comp.sub('', text)

for root,dirs,files in os.walk(r"D:\HTK\dataset_TIMIT\TIMIT\TRAIN"):
    for file in files:
        if file.endswith('.TXT'):
            root_txt=os.path.join(root,file)     #文本路径
            a=root_txt.split('.',1)
            abs_path = os.path.join(root,file)
            with open(abs_path) as f:
                txt=clean_en_text(f.read())    #文本内容
                #print(root_txt+txt.upper())
                a1=open("D:\HTK\dataset_TIMIT\make_trainprompts.txt",'a')
                a1.write(a[0]+txt.upper()+'\n')
                a1.close()

执行后会在D:\HTK\dataset_TIMIT\中生成make_trainprompts.txt,去掉后缀修改名称即得到trainprompts文件。此文件内容为timit/train文件下所有wav的地址(注意最后文件名不带任何后缀)和文字内容,部分内容如下:

D:\HTK\dataset_TIMIT\TIMIT\TRAIN\DR1\FCJF0\SA1 SHE HAD YOUR DARK SUIT IN GREASY WASH WATER ALL YEAR
D:\HTK\dataset_TIMIT\TIMIT\TRAIN\DR1\FCJF0\SA2 DON’T ASK ME TO CARRY AN OILY RAG LIKE THAT
D:\HTK\dataset_TIMIT\TIMIT\TRAIN\DR1\FCJF0\SI1027 EVEN THEN IF SHE TOOK ONE STEP FORWARD HE COULD CATCH HER

2.使用HTK自带脚本prompts2wlist,将上述抄本文件trainprompts转换为wlist文件,从句子中得到排序好的单词列表
在data文件夹中新建scripts文件夹,在HTK samples文件中搜索prompts2wlist,把这个文件拷贝到data1/scripts文件中,将trainprompts文件移至data1文件夹下,依次执行如下命令:

D:
cd HTK/data
perl scripts/prompts2wlist trainprompts wlist

格式为perl+prompts2wlist工具地址+trainprompts地址+生成的wlist文件的地址。
这样在data1文件夹下生成wlist文件,部分内容如下:

'EM

A
ABBREVIATE
ABIDES
ABILITY
ABLE

3.处理TIMIT自带的发音字典TIMITDIC.TXT
TIMIT语音库自带的发音字典是TIMIT/DOC中的TIMITDIC.TXT,使用如下代码进行处理,得到TIMITDIC1.TXT。

def delblankline(infile, outfile):
    infopen = open(infile, 'r', encoding="utf-8")
    outfopen = open(outfile, 'w', encoding="utf-8")
    db = infopen.read()
    outfopen.write(db.replace(';', '\n'))
    infopen.close()
    outfopen.close()


delblankline("D:\HTK\dataset_TIMIT\TIMIT\DOC\TIMITDIC.TXT", "D:\HTK\dataset_TIMIT\TIMIT\DOC\TIMITDIC_1.txt")

将TIMITDIC1.TXT中前面的说明删去,得到:
在这里插入图片描述
再将前面4个单词的空格和换行去掉,如图:
在这里插入图片描述
继续用代码将前面的单词转换为大写,执行:

import re
def clean_en_text(text):
    # keep English
    comp = re.compile('[^A-Z^a-z^\-^\'^\n^\~ ]')
    return comp.sub('', text)

a1=open("D:\HTK\dataset_TIMIT\TIMIT\DOC\TIMITDIC_1.txt",'r+')
b=[]
txt1=a1.readlines()
a1.close()
for lines in txt1:
    a=lines
    b=a.split(' ',1)
    c=b[0].upper()+' '+b[1].replace('\n',' ')+'sp\n'
    d=clean_en_text(c)
    a2=open("D:\HTK\dataset_TIMIT\TIMIT\DOC\TIMITDIC_2.txt",'a')
    a2.write(d)
    a2.close()

得到TIMITDIC_2.txt文件,如图:(!注意,此代码不要运行第二遍,否则得到的TIMITDIC_2.txt文件内容顺序会出错
在这里插入图片描述
!注意格式:大写单词+一个空格+小写发音+结尾为sp\n,从单词A开始按字母顺序排列
将TIMITDIC_2.txt文件名称去掉后缀改为timit,并放在data1文件夹下。
用记事本分别打开wlist和timit文件,在含有“’”符号的单词前添加‘\’符号,即:

wlist中:\'EM
timit中:\'EM ax m sp

接下来对timit文件进行处理,执行以下步骤:

  1. 将位于“\‘EM”单词前面的所有单词按照字母顺序插入到相应位置
    例如:将

BOURGEOISIE b uh r zh w aa z iy sp
插入到:
BOURGEOIS b uh r zh w aa sp和BOWL b ow l sp中
形成:
BOURGEOIS b uh r zh w aa sp
BOURGEOISIE b uh r zh w aa z iy sp
BOWL b ow l sp

  1. 搜索”~“符号,将多音词的词性连同符号 "~"一起删去,再放到相应的正确位置
    例如,原文本为:

LIVED l ih v d sp
LIVELY l ay v l iy sp
LIVES l ih v z sp
LIVESTOCK l ay v s t aa k sp
LIVE~ADJ l ay v sp
LIVE~V l ih v sp

修改为

LIVE l ay v sp
LIVE l ih v sp
LIVED l ih v d sp
LIVELY l ay v l iy sp
LIVES l ih v z sp
LIVESTOCK l ay v s t aa k sp

4.调用htk生成音素文件monophones0,日志文件dlog,发音字典文件dict1
在data1文件中新建dict文件夹存放语音字典,之后在cmd中执行以下命令:

D:\HTK\data1>HDMan -m -w wlist -n monophones0 -l dlog dict/dict1 timit

得到音素文件monophones0,日志文件dlog和发音字典文件dict1
用写字板打开音素文件monophones0,增添一个新的音素sil,如下:

ax
m
sp
b

zh
em
sil

共47个音素
dlog为生成字典dict1时,wlist中单词生成发音字典的产生的消息记录。dict1是wlist的发音字典,包含于timit中,格式与timit一致,如下:
这里自己增添了一行“-- sp”:
在这里插入图片描述

三、字级别标音, 生成标注文件trainwords.mlf

使用prompts2mlf将trainprompts文件转换成标注文件trainwords.mlf
在HTK samples文件中搜索prompts2mlf,把这个文件拷贝到data1/scripts文件中,新建data1/labels文件夹,执行如下命令:

D:\HTK\data1>perl scripts/prompts2mlf labels/trainwords.mlf trainprompts

在labels中生成trainwords.mlf,部分内容如下:
在这里插入图片描述
用记事本打开该文件,在所有“'EM”前加上符号“\”,即修改为“\'EM”

四、音素级标音,生成标注文件:phones0.mlf

在scripts文件夹中创建mkphones0.txt,内容为:

EX
IS sil sil
DE sp

!注意,这个文件最后一定要有一行换行,将后缀改为.led,生成mkphones0.led文件。
执行以下命令:

D:\HTK\data1>HLEd -l * -d dict/dict1 -i labels/phones0.mlf scripts/mkphones0.led labels/trainwords.mlf

在labels文件夹中得到音素级标音文件phones0.mlf,部分内容如下:

#!MLF!#
“*/SA1.lab”
sil
sh
iy
hh
ae
d
y
uh

第一部分完。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43017004/article/details/104720093

智能推荐

[精华][推荐]SSO CAS单点登录框架学习 搭建详细步骤及源码_chukaopi2273的博客-程序员秘密

1.通过下载稳定版本的方式下载cas的相关源码包,如下: 直接选择4.2.1的稳定代码即可 2.我们项目中的版本版本使用maven apereo远程库去下载 通过远程maven库下载cas-server-webapp的war包,步骤如下: (一)访问Mave...

怎样与机器对话?_cowboy_wz的博客-程序员秘密

麦卡锡1959年发表的论文中,他发现这个目标是构造一台机器可以“执行一些简单的可以由任何非低能的人进行的言词推理过程”。用这种方式表达听起来非常可行。但达到目标还很遥远。

浅谈分支预测、流水线与条件转移_爱吃的小花猫的博客-程序员秘密

在StackOverflow上有这么一个问题 Why is processing a sorted array faster than an unsorted array? 。例子中,对一个数组进行条件求和,在排序前和排序后,性能有很大的差别。原始的例子是C++和Java的,这里将其换成了C# :static void Main(string[] args){ // Genera

“初老症”在靠近_sonach的博客-程序员秘密

转载自:http://blog.ifeng.com/article/17590948.html随着偶像剧《我可能不会爱你》的热播,“初老症”一词逐渐为人所知。林依晨扮演的三十岁白领,面临着未老先衰的窘境,心理和身体仿佛都比实际年龄老得快。这种情况被称为初老症。其实,初老症一词是剧中虚构的。但是,由剧情而来的50条初老症状测试,却被众多80后网友认为与自身情况相似,因此得出这样的结论

场景文本识别应用自然语言处理的方法综述(2021年)_诸神缄默不语的博客-程序员秘密

本文是场景文本识别领域应用自然语言处理方法的前沿技术综述

随便推点

在VB.NET动态接口是如何实现的?_weixin_34268610的博客-程序员秘密

在VB.NET这一完全面向对象语言的应用中,会接触到许多新的操作方法以及代码编写方式,让程序员眼前一亮,大大提高了编程效率。其中VB.NET动态接口的应用就可以帮助开发人员轻松完成一些特定任务。 在谈到动态语言与静态语言的区别时,有一句很经典的话:Static typing when possible, dynamic typing when needed。Visu...

线刷手机_XuLujuncsdn的博客-程序员秘密

适用范围:1.版本降级2.手机无法正常OTA升级3.手机黑砖无法启动注意事项1.本教程只适合有刷机经验的机友自行刷机,请小白用户不要轻易尝试2.在未了解相关刷机要求或者操作步骤导致手机变砖的,请自行到售后网点处理刷机准备1.下载ZUK Z1手机驱动:  ZUK1399669,如果您要查看本帖隐藏内容请回复2.下载qpst刷机工具:

关于adaboost分类器的一点看法_adaboost的基分类器是线性的,那么整体分类器是否是线性的_青莲太初的博客-程序员秘密

对于在图像中的任何物体,要检测出它,必须要得到一种东西,使之和其他物体分别开了。这种东西,在图像处理中叫做特征,这个理解我想是应该考虑到特征的类型啦。例如 颜色,灰度值,纹理,轮廓,而真正到到图像处理级别的就是特征向量,即这些特征的数学表达形式,如谈到纹理,可以用距的方式表达。既然特征能够将物体和其他东西分辨出来,如何组织他们呢,用adaboost是一种很好的组织方法。  adaboost

alc list_乾朗的博客-程序员秘密

Checklist: Application Layer Checklist tags: layerThis is the master check-list for the application layer; all mandatory items must

css3中calc、vw、vh、vmin、vmax 属性的应用及兼容性_css vh兼容性_我想叫蜡笔小小新呀的博客-程序员秘密

一、 calc()的使用什么是calc()?calc()从字面我们可以把他理解为一个函数function。其实calc是英文单词calculate(计算)的缩写,是css3的一个新增的功能,用来指定元素的长度。比如说,你可以使用calc()给元素的border、margin、pading、font-size和width等属性设置动态值。为何说是动态值呢?因为我们使用的表达式来得到的值。不过calc...

java面试---string、stringbuilder、stringbuffer的使用与区别_有亿点点胖的博客-程序员秘密

String类,内部实现使用到final关键字,所以每次修改或者赋值String类型变量时,其都会分配新的地址。 public static void main(String[] args) { String str = "hello"; System.out.println(str.hashCode()); str +="world"; System.out.println(str.hashCode()); Stri

推荐文章

热门文章

相关标签