基于htk工具包的语音识别

article/2025/10/7 5:16:03

htk简介:

HTK是一个构建隐藏马尔可夫模型(HMMs)的工具包。HMMs可以用于任何时间序列的建模建模,HTK的核心就是类似的通用目的。然而,HTK主要设计用于构建基于HMM的语音处理工具,特别是识别程序。因此,大部分HTK中的基础设施支持专门用于此任务。

--------------------------------------------------------------------------------

                                                        安装篇

--------------------------------------------------------------------------------

1.下载到HTK-3.4.1.ZIP后,解压,将其中的htk文件夹整个复制到E盘根目录下,路径最好都是英文。

2.确保的环境变量Path包含路径(此为本机vs2013的路径,其它版本可根据安装目录找到):F:\工具文件\vs2013_installation_path\Common7\Tools ,路径根据你安装所在目录作相应改变。此次安装需要加诸多路径到环境变量中,如下图

其中第二个环境变量是运行程序的目录文件夹,需要加到环境变量中,路径是你的HTK安装路径;后面三个都是DOS窗口编译时用nmake编译需要添加的环境变量,路径是你的vs安装路径中的VC文件夹下的文件路径,读者只需添加到环境变量中即可,后续会详细解释。

3.打开DOS 命令窗口, 在命令窗口中输入cd HTK-3.4.1 进入HTK-3.4.1文件夹,在该文件夹下建立一个新文件夹bin.win32 . 输入:mkdir bin.win32就可以新建文件夹(注:HTK的盘符是你安装时候的盘符,笔者已经在E盘安装好了,此时在D盘做试验);

此时可以去你的HTK文件夹下看是否有bin.win32这个文件夹,有的话说明成功。

4.接下来在DOS窗口运行vcvars32,这个文件是在F:\工具文件\vs2013_installation_path\VC\bin目录下,也就是vs安装路径下的VC里面的bin目录下运行vcvars32.bat(注意后缀名也要写上);

5.接下来编译htk库文件:

总共有四个库文件需要编译,分别是HTKLib,HTKTools,HLMLib,HLMTool四个文件,具体步骤如下:

cd HTKLib(进入路径)
              nmake /f htk_htklib_nt.mkf all
              cd ..(返回上级目录)

              同理编译HTK TOOLS ,输入以下命令:

              cd HTKTools
              nmake /f htk_htktools_nt.mkf all
              cd ..
              cd HLMLib
              nmake /f htk_hlmlib_nt.mkf all
              cd ..
              cd HLMTools
              nmake /f htk_hlmtools_nt.mkf all
              cd ..

6.编译成功后你会发现在你的htk文件夹中的bin.win32这个文件中会出现很多.exe文件,如图:

   HSLab.exe     录音,标记工具Hcopy.exe     从语音提取特征参数的工具HInit.exe 和 HCompV.exe 对HMM模型初始化的工具,注意,这里需要对每个模型都要使用此命令进行初始化HRest.exe     对模型进行迭代训练的工具HParse.exe    语法转网络的工具,发音转本文用到的。HSGen.exe    语法查错工具HVite.exe      解码工具,也就是识别工具。可以用命令行方式使用,也可以用交互方式使用。

此时说明你的四个htk库文件编译成功!

此时要将bin.win32这个文件的路径加入到 环境变量中才能运行生效,E:\HTK-3.4.1\htk\bin.win32加入环境变量 。也就是步骤2中的第二个环境变量的加入;

安装htk后在E:\HTK-3.4.1\htk目录下运行HInit后若出现以下界面,

则说明你的htk已经安装成功一半了!!!

7.此时确保电脑已经安装Active Perl编辑器,用来编译CGI程序;

     ActivePerl一个perl脚本解释器。其包含了包括有 Perl for Win32、Perl for ISAPI、PerlScript、Perl Package Manager四套开发工具程序,可以让用户编写出适用于unix,windows,linux系统的CGI程序来。

此时开始运行HTKDemo程序:

cd HTKDemomkdir hmmscd hmmsmkdir tmpmkdir hmm.0mkdir hmm.1mkdir hmm.2mkdir hmm.3cd ..mkdir protomkdir accmkdir testperl runDemo.pl configs\monPlainM1S1.dcf

先要在HTKDemo文件夹下新建四个文件夹,分别是hmms,proto,acc,test,在hmms文件夹下再创建四个文件夹分别为hmm.0,hmm.1,hmm.2,hmm.3,建立完后然后在E:\HTK-3.4.1\samples\HTKDemo目录下运行以下2代码,若出现以下界面:

 perl runDemo.pl configs\monPlainM1S1.dcf

则说明此时htk已经完全地安装成功了!

 

---------------------------------------------------------------------------------

                                                 使用篇

---------------------------------------------------------------------------------

接下来就可以使用htk了!

1. 建立语音材料库,确定识别基本元,比如一个单词 yes no ok等,或者 声母 b p m f 韵母 d t n l 等,确定基本元后,标记好识别基本元。

     2. 对语音材料库中的声音文件提取MFCC声纹特征

     3.为每一个基本元建立一个HMM模型。

     4.利用MFCC声纹特征对每一个HMM模型进行训练,使模型参数与其描述的识别基本元对应。

     5.定义输入语音的语法规则等,从发音对应到文字。

     6. 识别。

先做第一步:建立语音材料库,确定基本单元;

1.先打开DOS窗口,运行录音标记工具,输入HSLab yes.sig命令,回车;有可能出现以下错误:

“ERROR [+6870]  MakeXGraf: Not compiled with X11 support: use HGraf.X.c
FATAL ERROR - Terminating program HSlab”;

这是因为 默认情况下HSLab工具使用的是x11做的图形界面接口,windows不支持,所以需要修改一下生成文件,使用windows GUI。修改htk_htklib_nt.mkf(两处),将HGraf.null.obj替换为HGraf_WIN32.obj,HGraf.null.olv替换为 HGraf_WIN32.olv。

然后(进入HTKLib文件夹 )--> 使用命令:nmake /f htk_htklib_nt.mkf all重新编译HTKLib 下的\htk_htklib_nt.mkf。;打开htk \HTKTools下的Makefile.in(右击用记事本打开),将其中"-lX11"删除(查找);
然后(进入HTKTools文件夹 )-->重新编译生成 htk_htktools_nt.mkf
再按照上面的步骤安装即可。就可以解决上述问题!

这里要用nmake方式编译上述两个配置文件,此时要先找到你的vs安装路径里面的VC文件夹,然后将里面的Include、lib、和bin三个文件夹的路径加到你的系统变量里面去,否则在用nmake编译上述文件夹时会出现错误,所以一定要加到环境变量。

此时再运行htk_htktools_nt.mkf文件时还肯会出现以下错误:

 

这个问题的解决办法网上的很复杂,我找了很多办法也解决不了,后来摸索出了一种简单的方法,就是再运行htk_htktools_nt.mkf文件时先要运行以下F:\工具文件\vs2013_installation_path\VC\bin文件下的vcvars32.bat文件,然后再运行htk_htktools_nt.mkf文件!

若出现以下界面,则说明nmake /f htk_htklib_nt.mkf all和nmake /f htk_htktools_nt.mkf all两个配置文件运行成功!

 

此时再运行录音工具HSLab yes.sig命令,激动人心的画面出现了!!!

 

若出现以上界面,则说明录音工具运行成功,此时可进行录音!

录制声音。点击rec按钮,说:“yes”,然后点击stop按钮。你会看到界面上出现一个语音波形,一条语音样本就录制完成了,你可以点击play播放听一下。


http://chatgpt.dhexx.cn/article/fDoth8CF.shtml

相关文章

jQuery学习手册(15)

逐个设置 $(div).css(width, 100px)​ $(div).css(height, 100px)​ $(div).css(background, black)链式设置 注意:如果大于3步,建议分开 $(div).css(width, 100px).css(height, 100px).css(background, black)批量设置 $(div).css({ ​ …

第7章页面布局-ConstrainedBox限定宽高

防采集标记:亢少军老师的课程和资料 import package:flutter/material.dart; class LayoutDemo extends StatelessWidget {overrideWidget build(BuildContext context) {return new Scaffold(appBar: new AppBar(title: new Text(ConstrainedBox限定宽高示例),),b…

全网最详细的一篇Flutter 尺寸限制类容器总结

Flutter中尺寸限制类容器组件包括ConstrainedBox、UnconstrainedBox、SizedBox、AspectRatio、FractionallySizedBox、LimitedBox、Container。这些组件可以约束子组件的尺寸,下面一一介绍。 ConstrainedBox ConstrainedBox组件约束子组件的最大宽高和最小宽高&am…

android中各种height和width总结

1. getMeasuredWidth()和getWidth() 以这两个为例,高度与其相同。这两个是在自定义View中最常见到的,通过字面意思可以看出,前者是测量的宽度,后者是控件的实际宽度,下面看下官方文档对他们的描述: //Ret…

JavaFX布局(一)

说道GUI编程一定要谈到布局,JavaFX内置了大量的布局控件提供给我们使用。其实,JavaFX的布局控件和界面元素控件都是继承自javafx.scene.layout.Region类。我们这里只看布局控件类。布局控件我们在界面上一般是看不到的,它一个容器用于放置其它…

Android 桌面小组件 AppWidgetProvider

废话 桌面小组件,绝对是小程序中的小程序,说白了就是任何复杂一丁点的操作都不适合做成桌面小组件。 所以这里采用的演示的例子,就只有一个白色圆角背景,外加一个文本框,显示文字。 小组件的教程网上一搜一大堆&…

Android 约束布局 ConstrainLayout min max width

写一个自定义view package com.anguomob.guidelineimport android.content.Context import android.graphics.Canvas import android.graphics.Color import android.util.AttributeSet import android.view.Viewclass ZeroView constructor(context: Context?, attrs: Attri…

ConstrainLayout 基础教程2,近期想跳槽的程序员必看

特性详解 Visibility behavior (可见性的表现) ConstraintLayout对可见性被标记View.GONE的控件(后称“GONE控件”)有特殊的处理。一般情况下,GONG控件是不可见的,且不再是布局的一部分,但是在布局计算上,ConstraintLayout与传统布局有一个很重要的区别: 传统布局下,…

UGUI源码解析——LayoutElement

一:前言 继承了ILayoutElement和ILayoutIgnorer接口,作为布局元素组件 挂载了Layout Element组件的对象,布局并不会生效,它是受到实现了布局组的控制(HorizontalLayoutGroup、VerticalLayoutGroup、GridLayoutGroup) 二&#xff…

Layui框架的使用技巧

1.选中html代码块&#xff0c;ctrlshift减号- 就会全部折叠 2.加入Thymeleaf模板需要添加命名空间 <!DOCTYPE html> <html xmlns:th"http://www.thymeleaf.org/"></html> 2.1 替换方法 2.2添加 th:fragment 2.3主页面用一行代码替换 3.SpringBo…

UGUI源码解析——LayoutUtility

一&#xff1a;前言 布局的工具类&#xff0c;可以获取到对象的minWidth、preferredWidth、flexibleWidth、minHeight、preferredHeight、layoutPriority的属性值 二&#xff1a;源码解析 ——获取对象属性值的方法 以上方法可以获取到对象的minWidth、preferredWidth、flexi…

Flutter布局指南之深入理解BoxConstraints

点击上方蓝字关注我&#xff0c;知识会给你力量 强烈建议先看下这篇文章——Flutter你竟是这样的布局 不管你是Android开发&#xff0c;还是Flutter开发&#xff0c;当你开始使用Flutter茫茫多的Widget时&#xff0c;可能会猜测Widget在屏幕上的尺寸和位置&#xff0c;但事实上…

vue element-ui el-table表格二次封装 自定义el-table表格组件 vue封装表格组件

CommTable.vue table组件 <template><div><el-table:data"tableData"border:class"tabClass ? tabClass : null":showHeader"showHeader ? showHeader : true":spanMethod"spanMethod ? spanMethod : null"element…

Stage的MinWidth和MinHeight的疑问

设置了Stage的MinWidth和MinHeight,但是显示的时候不是这个高度和宽度&#xff0c;最小化之后再次显示的时候就可以了&#xff0c;奇怪 package stage;import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import jav…

php的width是什么意思,minwidth什么意思?min-width怎么设置

很多人刚刚入门css的新手&#xff0c;不知道minwidth什么意思&#xff1f;min-width怎么设置&#xff0c;下面php中文网就带领大家来学习一下min-width。 一&#xff1a;minwidth什么意思 在css中&#xff0c;minwidth是设置段落的最小宽度&#xff0c;使用该属性是设置一个最小…

width和min-width的区别和差异性比较

1、正常情况下&#xff1a; width :给块级元素/行内块 元素设置固定的宽度&#xff0c;或者固定百分比的宽度。 min-width: 当盒子内部元素宽度小于 min-width的值时&#xff0c;盒子宽度为 min-width的值&#xff0c;当盒子内容宽度大于 min-width的值时&#xff0c;盒子随着…

【NOIP2013提高组】华容道

题目背景 NOIP2013 提高组 Day2 试题。 题目描述 小 B 最近迷上了华容道&#xff0c;可是他总是要花很长的时间才能完成一次。于是&#xff0c;他想到用编程来完成华容道&#xff1a;给定一种局面&#xff0c;华容道是否根本就无法完成&#xff0c;如果能完成&#xff0c;最…

【NOIP2013提高组】花匠

题目背景 NOIP2013 提高组 Day2 试题。 题目描述 花匠栋栋种了一排花&#xff0c;每株花都有自己的高度。花儿越长越大&#xff0c;也越来越挤。栋栋决定把这排中的一部分花移走&#xff0c;将剩下的留在原地&#xff0c;使得剩下的花能有空间长大&#xff0c;同时&#xff…

【NOIP2013提高组】积木大赛

题目背景 NOIP2013 提高组 Day2 试题 题目描述 春春幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为 n 的大厦&#xff0c;大厦可以看成由 n 块宽度为 1 的积木组成&#xff0c;第 i 块积木的最终高度需要是 hi。 在搭建开始之前&#xff0c;没有任何…

7.15 NOIP 2013

NOIP 2013 DAY 1 DAY1 T1 转圈游戏 快速幂模板 #include<bits/stdc.h> using namespace std; int n,m,k,x; long long ans; long long cmd(long long a,long long b){long long sum1;for(;a;a>>1){if(a&1){sumsum*b%n;}bb*b%n; } return sum; } int main(…