在上一篇博客的最后,利用HDMan工具生成dict和monophone1文件,利用到了beep、names、wlist等文件。下面借这个机会来调试跟踪下这个工具是如何一步步完成上述任务的。重点说明如何在Visual Studio下调试HTK的代码,后面遇到更加复杂任务,比如GMM建模、HMM模型训练、解码等任务时,跟踪代码看看它是如何实现的。
步骤一:
打开VS,点击文件——新建——项目,
选择空项目,点下一步。
截图已经说明清楚了。点击新建后了,在界面上的解决方案资源管理器里出现新建的项目和解决方案。
再看一下,解决方案存储位置的情况:
HTK.sln就是解决方案的文件,它是一个XML文件,描述这个方案的一些情况。比如Visual Studio的版本信息,平台配置信息等等
看一下它的内容吧。
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29020.237
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HDMan", "HDMan\HDMan.vcxproj", "{C42A149F-374E-4454-9E08-0FC8FBBA43F9}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C42A149F-374E-4454-9E08-0FC8FBBA43F9}.Debug|x64.ActiveCfg = Debug|x64
{C42A149F-374E-4454-9E08-0FC8FBBA43F9}.Debug|x64.Build.0 = Debug|x64
{C42A149F-374E-4454-9E08-0FC8FBBA43F9}.Debug|x86.ActiveCfg = Debug|Win32
{C42A149F-374E-4454-9E08-0FC8FBBA43F9}.Debug|x86.Build.0 = Debug|Win32
{C42A149F-374E-4454-9E08-0FC8FBBA43F9}.Release|x64.ActiveCfg = Release|x64
{C42A149F-374E-4454-9E08-0FC8FBBA43F9}.Release|x64.Build.0 = Release|x64
{C42A149F-374E-4454-9E08-0FC8FBBA43F9}.Release|x86.ActiveCfg = Release|Win32
{C42A149F-374E-4454-9E08-0FC8FBBA43F9}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {92EF52E3-085B-4682-AAE8-6222B4F67B41}
EndGlobalSection
EndGlobal
这个容器包含了一个Project,名字叫“HDMan”,它对应的Visual Studio版本是Visual Studio Version 16。非特殊情况下,不要手动修改这个XML文件。跟HTK.sln同级的还有文件夹HDMan,里面包含三个文件。这个文件夹就是HDMan项目的根目录。其中HDMan.vcxproj描述了该项目的配置信息,感兴趣的可以看一看。
步骤二:添加源代码。
HTK代码结构包括两个方面和两个层次。一是关于语音模型,包括库文件HTKLib和工具HTKTools,其中HTKLib包含比如wave文件处理、signal信号处理、标注处理函数、训练依赖的函数库等等,而HTKTools是具体利用库函数生成的可执行文件,能够在命令行调用的工具,例如HDMan.exe、HERest.exe、Hinit.exe、HVite.exe等等,这些文件中都包含一个main函数。另一方面是关于语言模型的,HLMLib和HLMTools。目前只关于语音模型,因此主要考虑HTKLib和HTKTools两个文件夹下的代码。
将下载的htk源码里的HTKLib文件夹复制到解决方案的目录下,也就是HTK.sln文件所在的目录。因为后面还要添加更多项目都需要用到这个库,只要是HTKTools里的工具。
现在给HDMan项目添加源文件和头文件。
以添加源文件为例,右键单击“源文件”,选择“添加”——“现有项”,系统打开一个文件选择窗口,找到刚才复制过来的HTKLib文件夹,选择所有的.c文件,除了下面五个:“HArc.c”, “HExactMPE.c”, “HFBLat.c”, “HGraf.c” 和“HGraf.null”,原因是什么暂时不清楚,当作一个彩蛋,最后来揭晓吧。
与添加源文件类似,还要添加代码涉及到的头文件,将HTKLib中的头文件加入进“头文件”中来,除去“HArc.h”, “HExactMPE.h” 和 “HFBLab.h”三个文件。
“配置属性->C/C++->常规->附加包含目录”中加: D:\vscode\source\repos\HTK\HTKLib
“配置属性->C/C++->常规->警告等级”设置为:关:关闭所有警告(/W0)
“配置属性->C/C++->命令行->附加选项“中加: /wd4335 /D "WIN32_AUDIO" /D ARCH=\"WIN32\" /D isnan=_isnan /D WIN32 /D _CRT_SECURE_NO_WARNINGS
SDL检查为“否”
“配置属性->链接器->输入->附加依赖项”中加: winmm.lib
设置完成后,生成解决方案
看看我们的输出文件夹中是否有期待的结果。
红圈的文件就是生成的HDMan.exe工具。找到“源文件”下的HDMan.c,打点断,在配置文件的“调试”项中,添加命令参数。
执行调试,或者直接点“F5”键,就开始调试了。