logo头像

不忘初心,奋力前行

使用HTK中的HRESULTS计算WER

可以使用HTK中的HResults模块来计算WER(字错误率)。下面从HTK安装开始一点点为大家讲解如何使用。

本文参考网上的各种教程,属于个人原创,如需转载,请标明出处和本文地址。

本文主要由以下部分组成:

  • 一、HTK在Windows下的编译
  • 二、使用HResults模块计算WER

一、HTK在Windows下的编译

HTK的下载地址为: http://htk.eng.cam.ac.uk/download.shtml

请注意,下载的时候需要先注册账号然后进行下载。在安装之前,请务必确定已经安装了Visual Stuio,我使用的是Visual Studio 2019,所以推荐使用2019及以上版本。

下载完HTK后,将其解压,例如我是解压到了C:\htk目录,所以后续我以此目录来进行讲解。

在C:\htk目录新建一个文件夹名为 bin.win32 。然后打开命令行,切换到PATH中VS的地址,例如我的是D:\Program Files (x86)\Visual Studio 14.0\Common7\Tools,就输入

1
2
3
d:  

cd D:\Program Files (x86)\Visual Studio 14.0\Common7\Tools

切换目录后,执行:vsvar32。

然后切换回C:\htk。接下来执行:

1
2
3
4
5
6
7
8
9
10
11
cd  HTKLib
nmake /f htk_htklib_nt.mkf all 
cd ..
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 al

把以上所有文件编译完成,HTK就编译完成了,所有的可执行文件(.exe)都保存在了 *bin.win32 目录中。

为了使用方便,可以将C:\htk\bin.win32加入PATH变量。

二、使用HResults模块计算WER

WER的计算公式为:

WER = (S + D + I ) / N = (S + D + I ) / (S + D + C)

其中,S为替换的字数,D为删除的字数,I为插入的字数,C为正确的字数。
HResults模块只能用mlf模块,所以需要先想办法将文本转换为mlf格式。需要注意,为了符合格式要求,txt文档必须为ANSI编码格式,且其中的每一段话前面要加上数字序号。例如:

1
2
1 山东科技大学
2 西安电子科技大学

然后使用python编写脚本文件进行转换,脚本文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

"""
Created on Thu Feb 20 16:34:02 2020
 
@author: davidcheung
"""
 
#-*- coding:utf-8 -*-
import os,sys
 
def to_mlf(xi):
    dx={
       "0":"零",
       "1":"一",
       "2":"二",
       "3":"三",
       "4":"四",
       "5":"五",
       "6":"六",
       "7":"七",
       "8":"八",
       "9":"九"
    };
    d=[]
    eng=[]
    tx=[",",".","!","(",")",",","。","!",';','、',':','?','“','”'];
    for x in xi:
        u=x.encode("utf-8")
        if u in tx:
            continue;
        if len(u)==1:
            if u in dx:
                u=dx[u]
            eng.append(str(u, encoding='utf-8'))
        else:
            if len(eng)>0:
                d.append("".join(eng).upper())
                eng=[]
            d.append(str(u, encoding='utf-8'))
    if len(eng)>0:
            d.append("".join(eng).upper())
    return d
 
def fn_to_lab(s):
    x=s.split()
    for i in x:
        d=to_mlf(i.strip())
        if len(d)>0:
            print("\n".join(d))
    print('.')
 
fn=sys.argv[1]
print('#!MLF!#')
for l in open(fn):
    l=l.strip()
    x=l.split()
    k=x[0].strip()
    v=" ".join(x[1:])
    t=".".join(k)
    print('"*No%s.lab" ' % t)
    fn_to_lab(v)

此脚本可以明明为src2mlf.py,该脚本的功能是将正确的结果转化为相应的mlf文件。如果是测试结果,可以将该代码中print('"*No%s.lab" ' % t)lab修改为rec即可。

运行的时候执行命令如下:

1
2
python src2mlf.py src.txt >src.mlf
python rec2mlf.py testResult.txt >testResult.mlf

然后在命令行中切换到当前mlf目录,然后执行以下命令即可

1
HResults.exe -t -I src.mlf nul testResult.mlf

当然对于Linux(例如CentOS等)则执行

1
HResults -t -I src.mlf /dev/null testResult.mlf

下面举一个例子,例子详见原文:
http://www.yushuai.xyz/2020/02/20/4541.html

例子的结果详见下图。

结果示意图

支付宝打赏 微信打赏 QQ钱包打赏

感觉不错?欢迎给我 打个赏~我将不胜感激!