可以使用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,就输入
d:
cd D:\Program Files (x86)\Visual Studio 14.0\Common7\Tools
切换目录后,执行:vsvar32。
然后切换回C:\htk。接下来执行:
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 all
把以上所有文件编译完成,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 西安电子科技大学
然后使用python编写脚本文件进行转换,脚本文件内容如下:
# -*- coding: utf-8 -*-
"""
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即可。
运行的时候执行命令如下:
python src2mlf.py src.txt >src.mlf
python rec2mlf.py testResult.txt >testResult.mlf
然后在命令行中切换到当前mlf目录,然后执行以下命令即可
HResults.exe -t -I src.mlf nul testResult.mlf
当然对于Linux(如CentOS系统)下,则执行
HResults -t -I src.mlf /dev/null testResult.mlf
下面举一个例子,例如源文件(cessrc.txt)为
1 西安电子科技大学通信工程学院
2 山东科技大学
3 小奥部落格
测试输出结果(cestest.txt)为
1 西安电子科技大学同新工程学院
2 山东大学
3 小奥哈哈部落格
则经过HResults测试之后输出结果为

Aligned transcription: *No1.lab vs *No1.rec
LAB: 西 安 电 子 科 技 大 学 通 信 工 程 学 院
REC: 西 安 电 子 科 技 大 学 同 新 工 程 学 院
Aligned transcription: *No2.lab vs *No2.rec
LAB: 山 东 科 技 大 学
REC: 山 东 大 学
Aligned transcription: *No3.lab vs *No3.rec
LAB: 小 奥 部 落 格
REC: 小 奥 哈 哈 部 落 格
====================== HTK Results Analysis =======================
Date: Thu Feb 20 18:46:05 2020
Ref : cessrc.mlf
Rec : cestest.mlf
------------------------ Overall Results --------------------------
SENT: %Correct=0.00 [H=0, S=3, N=3]
WORD: %Corr=84.00, Acc=76.00 [H=21, D=2, S=2, I=2, N=25]
计算出来的Corr为字正确率,取100-Corr就为WER。ACC为字准确率。
文章评论