語音識別ASR - HTK(HResults)計算字錯率WER、句錯率SER

HResults計算字錯率(WER)、句錯率(SER)

前言html

       很久沒發文,看到仍有這麼多關注的小夥伴,以爲不發篇文對不住。確實很久沒有輸出經驗總結相關的文檔,抽了個時間,整理了下筆記,發一篇關於ASR經常使用測試指標。好比字錯率、句錯率指標,以及計算工具HResults的使用篇,後續慢慢找時間輸出一些人工智能領域,小白可理解可用的基礎知識,或者整理一些其餘筆記發一發。node

 

轉載說明python

本文爲原創文章,如需轉載,請在開篇顯著位置註明做者Findyou和出處算法

 

 

1、基礎概念


 1.一、語音識別(ASR)

語音識別(speech recognition)技術,也被稱爲自動語音識別(英語:Automatic Speech Recognition, ASR),bash

狹隘一點白話說:將語音轉換爲文字的技術。app

Findyou:通常使用ASR縮寫。iphone

 

1.二、句錯率(SER)

  • 句錯誤率:Sentence Error Rate
  • 解釋:句子識別錯誤的的個數,除以總的句子個數即爲SER
  • 計算公式:(全部公式省了 * 100%)工具

SER = 錯誤句數 / 總句數

 

1.三、句正確率(S.Corr)

  • 句正確率:Sentence Correct
  • 計算公式:測試

S.Corr =  1 - SER = 正確句數 / 總句數

 

1.四、字錯率(WER/CER)

WER,Word error rate,詞錯率,但通常稱爲字錯率,是語音識別領域的關鍵性評估指標,WER越低表示效果越好ui

CER,Character Error Rate,字符錯誤率,中文通常用CER來表示字錯率,緣由請見1.4.3。

 

»1.4.1 、計算原理

字符串編輯距離(Levenshtein距離)算法

 

»1.4.二、計算公式(重要)

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

(公式圖片和文字同樣,僅方便拷貝)

 

  • S 爲替換的字數,經常使用縮寫WS
  • D 爲刪除的字數,經常使用縮寫WD
  • I  爲插入的字數,經常使用縮寫WI
  • H 爲正確的字數,維基百科是C,但我統一改用H
  • N 爲(S替換+ D刪除+ H正確)的字數

Findyou

1.正確的字數:維基百科裏用的是C表明,H = N - (S+D) = C,我這邊直接改爲H,減小過多概念與變量。

2.大多數文章都沒有給出N的計算方式,很容易誤覺得是原句總字數或者識別結果總字數。

3.不理解不要緊,下面實例會幫助理解。

 

»1.4.三、 問題

  • 問題1:爲何WER會大於100%

由於有插入字(識別多出來的字),因此理論上WER有可能大於100%,在下面實例我會舉例(請見2.3.5),但實際場景,特別是大樣本量的時候,基本太不可能出現。

 

  • 問題2:說中文應該用CER,即「字符錯誤率」(Character Error Rate)

Findyou舉個栗子:

英文:hello   # 算一個Word
中文:你好     # 算兩個字符

囉嗦文字解釋,就是:

英文,由於最小單元是Word,語音識別應該用"字錯誤率"(WER),

中文,由於最小單元是字符,語音識別應該用「字符錯誤率」(CER)。

 

BUT(就是可是的意思...),他跟我前面那一句同樣,說的都是廢話!

咱們計算的時候誰不是按:中文的一個字符  = 英文的一個Word,那這樣用WER的公式有什麼問題呢?

誰再跟你咬文嚼字,懟他,使勁懟!

懟完,說回嚴謹的話,建議採用CER表示,哈哈哈哈哈......

 

1.五、字正確率(W.Corr)

字正確率,Word Correct,通常國內宣傳用的多,識別率(識別正確率)達到多少多少(請見1.7)。

  • 計算公式

W.Corr =   ( N - D - S ) / N = H / N

 

  • 問題:只計算了識別正確的字,沒有管多出來的字(I插入),固然通常狀況下不會有什麼問題。

 

1.六、字準確率(W.Acc)

字準確率,Word Accuracy

  • 計算公式

W.Acc =  1 - WER = ( N - D - S - I ) / N = (H - I) / N

(圖片和文字同樣,方便拷貝,W.Acc是Findyou本身用的簡寫) 

 

  • 特殊狀況:當 I=0 時, W.Acc = W.Corr
  • 問題:爲何W.Acc會是負數?

同WER,由於有插入字。換個說法,由於字準確率=1 - WER,而WER可能大於1,因此W.Acc會出現負數,但實際狀況基本不存在。

 

1.七、聊點其餘

  • ASR影響素因

  1. 人羣:男、女、老人、小孩...
  2. 音量)
  3. 距離(與拾音設備的距離)
  4. 角度(與拾音設備的角度)
  5. 設備(拾音設備的硬件)
  6. 環境:安靜、嘈雜(自噪、外噪)、家庭、商場...
  7. 句長
  8. 口音、方言
  9. 語速
  10. 語言:中文、英語
  11. 等等

大概舉例幾個影響因素(懶得放腦圖,文字也方便你們拷貝),

由於ASR的識別影響因素過多,因此不少時候會從各類緯度測試,好比:男生字錯率、女生字錯率,或者小孩字錯率、平均字錯率等等,

若是沒有公佈測試數據與方法,不可信,因會存在幾個操做,最大的問題是:

過擬合:訓練數據、測試數據、驗證數據是同一份,打外比方說:要考試的卷子就是你前一天發的老師發的練習卷還帶答案的。

先扯到這,後面找時間再整理一篇ASR測試方法系統講一講,

作爲測試咱們如何去測ASR以及制定各類測試標準。

 

  • 行業水平

    • 英語-WER;
      • IBM:行業標準Switchboard語音識別任務,2016年 6.9%,2017年 5.5% 
      • 微軟:行業標準Switchboard語音識別任務,2016年 6.3% -> 5.9%,2017年 5.1%,這個目前最低的。

說明:ICASSP2017上IBM說人類速記員WER是5.1%,通常認爲5.9% 的字錯率是人類速記員的水平。

    • 中文-WER/CER:
      • 小米:2018年 小米電視 2.81%
      • 百度:2016年 短語識別 3.7%
    • 中文-W.Corr:
      • 百度:2016年 識別準確率 97%
      • 搜狗:2016年 識別準確率 97%
      • 訊飛:2016年 識別準確率 97%

 

Findyou部分數據來源:

微軟WER 5.9%:https://arxiv.org/abs/1610.05256

微軟WER 5.1%: https://www.microsoft.com/en-us/research/wp-content/uploads/2017/08/ms_swbd17-2.pdf

小米電視CER 2.81% :https://arxiv.org/pdf/1707.07167.pdf

國內百度等同時宣佈識別準確率97% : https://www.zhihu.com/question/53001402

 

2、HTK工具


解了ASR相關的指標,須要有工具來進行結果統計計算,

本次主要介紹HTK工具,python也有Levenshtein的庫,但沒有HResults現成的來的簡單。

 

2.一、HTK工具簡介

HTK工具,HTK(HMM Toolkit)一款基於HMM模型(隱馬爾可夫模型)的語音處理工具,HTK主要用於語音識別研究,儘管它已被用於許多其餘應用,包括語音合成,字符識別和DNA測序的研究。HTK最初是在劍橋大學工程系(CUED)的機器智能實驗室 (之前稱爲語音視覺和機器人小組)開發的。後版權展轉到Microsoft,其保留了原始HTK代碼的版權,具體介紹請移步HTK官網。

Findyou:下載你須要先註冊用戶,記住你的密碼,FTP下載的時候須要。

 

2.二、HResults簡介與使用

HTK有一系列工具,但我主要想寫的是HResults。 

Centos系統編譯後的HTK3.4.1版本,HResults下載地址

百度網盤: https://pan.baidu.com/s/1gfm9jjqjZzJXU0lyGrLrCA      提取碼: wbfp

 

»2.2.1 、使用幫助

$ HResults

USAGE: HResults [options] labelList recFiles... Option Default
-a s Redefine string level label SENT -b s Redefine unitlevel label WORD -c Ignore case differences off -d N Find best of N levels 1 -e s t Label t is equivalent to s -f Enable full results off -g fmt Set test label format to fmt HTK -h Enable NIST style formatting off -k s Results per spkr using mask s off -m N Process only the first N rec files all -n Use NIST alignment procedure off -p Output phoneme statistics off -s Strip triphone contexts off -t Output time aligned transcriptions off -u f False alarm time units (hours) 1.0 -w Enable word spotting analysis off -z s Redefine null class name to s ??? -A Print command line arguments off -C cf Set config file to cf default -D Display configuration variables off -G fmt Set source label format to fmt as config -I mlf Load master label file mlf -L dir Set input label (or net) dir current -S f Set script file to f none -T N Set trace flags to N 0 -V Print version information off -X ext Set input label (or net) file ext lab

HTKBook:  https://labrosa.ee.columbia.edu/doc/HTKBook21/node233.html

 

»2.2.2 、文本轉換爲MLF文件

  • 測試用例:src.txt  (暫時不要去管專業術語)
1 今每天氣怎麼樣
2 明每天氣怎麼樣

Findyou:

1.第一列是數字,主要是爲了與ASR結果一一對應

2.咱們通常會剔除標點符號計算WER,因此注意去標點符號

  • src.txt - > src.mlf 文件
#!MLF!#
"*No1.lab"
今
天
天
氣
怎
麼
樣
.
"*No2.lab"
明
天
天
氣
怎
麼
樣
.

Findyou:

1.注意第一行加:#!MLF!#

2.注意"*xxx.lab"

3.注意每句的點

 

  • ASR識別結果:testResult.txt 文件
1 驚每天氣
2 明每天氣怎麼樣

Findyou:

1.不少時間是自動化執行,或手工執行獲得識別結果

2.測試結果,第一列應該與src.txt對齊,經過第一列來識別須要對比的語料。

例:HResults 會根據 "*No1.lab"  對應  "*No1.rec"  來找到對應的文本計算WER。

 

  • testResult.txt - > testResult.mlf 文件
#!MLF!#
"*No1.rec"
驚
天
天
氣
.
"*No2.rec"
明
天
天
氣
怎
麼
樣
.

Findyou:

1.txt轉換到mlf能夠用腳本轉換,注意雙個mlf文件的不一樣,lab與rec關鍵字。

 

»2.2.3 、TXT轉換爲MLF腳本

  • src2mlf.py
 1 #-*- coding:utf-8 -*-
 2 import os,sys
 3 
 4 def to_mlf(xi):
 5     dx={
 6        "0":"",
 7        "1":"",
 8        "2":"",
 9        "3":"",
10        "4":"",
11        "5":"",
12        "6":"",
13        "7":"",
14        "8":"",
15        "9":""
16     };
17     d=[]
18     eng=[]
19     tx=[",",".","!","(",")","","","",'','','','','',''];
20     for x in xi:
21         u=x.encode("utf-8")
22         if u in tx:
23             continue;
24         if len(u)==1:
25             if u in dx:
26                 u=dx[u]
27             eng.append(str(u, encoding='utf-8'))
28         else:
29             if len(eng)>0:
30                 d.append("".join(eng).upper())
31                 eng=[]
32             d.append(str(u, encoding='utf-8'))
33     if len(eng)>0:
34             d.append("".join(eng).upper())
35     return d
36 
37 def fn_to_lab(s):
38     x=s.split()
39     for i in x:
40         d=to_mlf(i.strip())
41         if len(d)>0:
42             print("\n".join(d))
43     print('.')
44 
45 fn=sys.argv[1]
46 print('#!MLF!#')
47 for l in open(fn):
48     l=l.strip()
49     x=l.split()
50     k=x[0].strip()
51     v=" ".join(x[1:])
52     t=".".join(k)
53     print('"*No%s.lab" ' % t)
54     fn_to_lab(v)

Findyou:

1.此腳本是將測試用例轉爲src.mlf

2.如需將測試結果testResult.txt 轉testResult.mlf,則拷貝一份如 rec2mlf.py,改第53行的關鍵字lab爲rec便可。

  •  腳本使用
1 python src2mlf.py src.txt >src.mlf
2 python rec2mlf.py testResult.txt >testResult.mlf

 

 

»2.2.4 、經常使用命令

以上文2.2.2 舉例文本爲例

  • HResults -t -I src.mlf /dev/null testResult.mlf
Aligned transcription: *No.1.lab vs *No.1.rec
 LAB: 今 天 天 氣 好 嗎
 REC: 驚 天 天 氣
    ,-------------------------------------------------------------.
    | HTK Results Analysis at Wed Apr  3 16:26:59 2019            |
    | Ref: src.mlf                                                |
    | Rec: testResult.mlf                                         |
    |=============================================================|
    |           # Snt |  Corr    Sub    Del    Ins    Err  S. Err |
    |-------------------------------------------------------------|
    | Sum/Avg |    2  |  76.92   7.69  15.38   0.00  23.08  50.00 |
    `-------------------------------------------------------------'

 

  • HResults -t -I src.mlf /dev/null testResult.mlf
Aligned transcription: *No.1.lab vs *No.1.rec
 LAB: 今 天 天 氣 好 嗎
 REC: 驚 天 天 氣
====================== HTK Results Analysis =======================
  Date: Wed Apr  3 16:26:59 2019
  Ref : src.mlf
  Rec : testResult.mlf
------------------------ Overall Results --------------------------
SENT: %Correct=50.00 [H=1, S=1, N=2]
WORD: %Corr=76.92, Acc=76.92 [H=10, D=2, S=1, I=0, N=13]
===================================================================

 

2.三、HResults樣例解析

以一句測試用例與測試結果爲例,舉實例讓你們快速瞭解HResults的WER。

»2.3.1 只有刪除(D)

# 說明
LAB:測試用例
REC:識別結果

# 結果
Aligned transcription: *No.1.lab vs *No.1.rec
LAB: 今 天 天 氣 怎 麼 樣
REC: 今 天 天 氣
,-------------------------------------------------------------.
| HTK Results Analysis at Tue Apr  2 22:37:09 2019            |
| Ref: src.mlf                                                |
| Rec: testResult.mlf                                         |
|=============================================================|
|           # Snt |  Corr    Sub    Del    Ins    Err  S. Err |
|-------------------------------------------------------------|
| Sum/Avg |    1  |  57.14   0.00  42.86   0.00  42.86 100.00 |
`-------------------------------------------------------------'

...
------------------------ Overall Results --------------------------
SENT: %Correct=0.00 [H=0, S=1, N=1]
WORD: %Corr=57.14, Acc=57.14 [H=4, D=3, S=0, I=0, N=7]
===================================================================

 

  • SER(句錯率) = 1 / 1 = 100 %
  • S.Correct(句正確率) = 0 S.H / 1 S.N = 0.00 %
  • N = 0替換 + 3刪除 + 4正確 = 7
  • WER(字錯率) = ( S 0 + D 3 + I 0 ) / 7 = 42.86 %
  • W.Correct(字正確率) = H / N = 4 / 7 = 57.14 %
  • W.Accuracy(字準確率) = (H - I)/ N = 1 - W.Err = 57.14 %

  

»2.3.2 替換(S) + 刪除(D) 

LAB: 今 天 天 氣 怎 麼 樣
REC: 驚 天 天 氣
# 結果
...
|=============================================================|
|           # Snt |  Corr    Sub    Del    Ins    Err  S. Err |
|-------------------------------------------------------------|
| Sum/Avg |    1  |  42.86  14.29  42.86   0.00  57.14 100.00 |
`-------------------------------------------------------------'
...
SENT: %Correct=0.00 [H=0, S=1, N=1]
WORD: %Corr=42.86, Acc=42.86 [H=3, D=3, S=1, I=0, N=7]
  • SER = 1 - S.Corr = 100 %
  • S.Correct = S.H / S.N = 0.00 %
  • N = 1替 + 3刪 + 3H = 7
  • WER = (S + D + I ) / N = 57.14 %
  • W.Correct = H / N = 42.86 %
  • W.Accuracy = (H - I) / N = 1 - W.Err = 42.86 %

 

»2.3.3 替換(S) + 刪除(D) + 插入(I)

LAB: 今 天     天 氣 怎 麼 樣
REC: 驚 天 田 天 氣
# 結果
...
|=============================================================|
|           # Snt |  Corr    Sub    Del    Ins    Err  S. Err |
|-------------------------------------------------------------|
| Sum/Avg |    1  |  42.86  14.29  42.86  14.29  71.43 100.00 |
`-------------------------------------------------------------'
...
SENT: %Correct=0.00 [H=0, S=1, N=1]
WORD: %Corr=42.86, Acc=28.57 [H=3, D=3, S=1, I=1, N=7]
  • SER = 1 - S.Corr = 100 %
  • S.Correct = S.H / S.N = 0.00 %
  • N = 1S + 3D + 3H = 7
  • WER = (S + D + I) / N = 5/7 = 71.43 %
  • W.Correct = H / N = 42.86 %
  • W.Accuracy = (H - I) / N = 1 - W.Err = 28.57 %

 

»2.3.4 全錯(結果字數<語料字數)

LAB: 今 天 天 氣 好 嗎
REC:             不 知 道
...
|=============================================================| | # Snt | Corr Sub Del Ins Err S. Err | |-------------------------------------------------------------| | Sum/Avg | 1 | 0.00 50.00 50.00 0.00 100.00 100.00 | `-------------------------------------------------------------' ... SENT: %Correct=0.00 [H=0, S=1, N=1] WORD: %Corr=0.00, Acc=0.00 [H=0, D=3, S=3, I=0, N=6]
  • SER = 1 - S.Corr = 100 %
  • S.Correct = S.H / S.N = 0.00 %
  • N = 3S + 3D + 0H = 6

 

  • WER = (S + D + I) / N = 6/6 = 100.00 %
  • W.Correct = H / N = 0.00 %
  • W.Accuracy = (H - I) / N = 1 - W.Err = 0.00 %

 

»2.3.5 全錯(結果字數>語料字數)

LAB:     今 天 天 氣 好 嗎
REC: 驚 田 田 七 豪 嘛 嘛
...
|=============================================================|
|           # Snt |  Corr    Sub    Del    Ins    Err  S. Err |
|-------------------------------------------------------------|
| Sum/Avg |    1  |   0.00 100.00   0.00  16.67 116.67 100.00 |
`-------------------------------------------------------------'
...
SENT: %Correct=0.00 [H=0, S=1, N=1]
WORD: %Corr=0.00, Acc=-16.67 [H=0, D=0, S=6, I=1, N=6]
  • SER = 1 - S.Corr = 100 %
  • S.Correct = S.H / S.N = 0.00 %
  • N = 6S + 0D + 0H = 6
  • WER = (S + D + I) / N = 7/6 = 116.67 %
  • W.Correct = H / N = 0.00 %
  • W.Accuracy = (H - I) / N = 1 - W.Err = -16.67 %

 

 


 

轉載說明

本文爲原創文章,如需轉載,請在開篇顯著位置註明做者Findyou和出處

相關文章
相關標籤/搜索