小奥的学习笔记

  • Home
  • Learning & Working
    • Speech Enhancement Notes
    • Programming language
    • Computer & DL
    • MOOC
  • Life
    • Life Time
    • Thinking & Comprehension
    • Volunteer
    • Plan
    • Travel
  • Footprints
  • GuestBook
  • About
    • About Me
    • 个人履历
    • 隐私策略
  1. 首页
  2. Study-notes
  3. Computer & DL
  4. 语音处理学习笔记
  5. 正文

使用HTK中的HResults计算WER

2020年2月20日 1568点热度 0人点赞 1条评论

可以使用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为字准确率。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: HTK WER 字错误率
最后更新:2020年2月20日

davidcheung

这个人很懒,什么都没留下

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

搜索
欢迎关注我的个人公众号
最新 热点 随机
最新 热点 随机
DEEPFILTERNET:一种基于深度滤波的全频带音频低复杂度语音增强框架 奥地利匈牙利九日游旅程 论文阅读之Study of the General Kalman Filter for Echo Cancellation 小奥看房之鸿荣源珈誉府 杭州往返旅途及西溪喜来登和万怡的体验报告 2022年的第一篇碎碎念
奥地利匈牙利九日游旅程论文阅读之Study of the General Kalman Filter for Echo CancellationDEEPFILTERNET:一种基于深度滤波的全频带音频低复杂度语音增强框架
JSP环境配置图文详解 2010 S.V Beijing Travel 19:New Clothes&Shoes 《剑指Offer》题目解析(3) 2010 S.V Beijing Travel 3~4:唉 Leetcode题目解析(191128):2&3&72&75&76 “超”博客迁移通知
标签聚合
linux 学习 Python 生活 python学习 鸟哥的linux私房菜 高中 算法 leetcode Java
最近评论
davidcheung 发布于 5 个月前(02月09日) The problem has been fixed. May I ask if you can s...
tk88 发布于 5 个月前(02月07日) Hmm is anyone else having problems with the pictur...
cuicui 发布于 9 个月前(10月20日) :wink:
niming 发布于 10 个月前(09月19日) 同级校友,能刷到太巧了
davidcheung 发布于 2 年前(08月16日) 我得找一下我之前整理的word文档看一下,如果找到了我就更新一下这篇文章。
Nolan 发布于 2 年前(07月25日) 您的笔记非常有帮助。贴图不显示了,可以更新一下吗?
davidcheung 发布于 3 年前(06月19日) 到没有看webrtc的代码。现在主要在看我们公司的代码了。。。只是偶尔看一看webrtc的东西。。。
aobai 发布于 3 年前(03月13日) gain_change_hangover_ 应该是每三个block 只能够调整一次,这样保证每帧...
匿名 发布于 5 年前(12月30日) 烫
小奥 发布于 5 年前(12月12日) webRTC里面的NS本身我记得就是在C++里面呀

COPYRIGHT © 2025 小奥的学习笔记. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

陕ICP备19003234号-1

鲁公网安备37120202000100号