ASR测试方法---字错率(WER)、句错率(SER)统计
一、基礎概念
1.1、語音識別(ASR)
語音識別(speech recognition)技術,也被稱為自動語音識別(英語:Automatic Speech Recognition,ASR),
狹隘一點白話說:將語音轉換為文字的技術。
維基百科:https://zh.wikipedia.org/wiki/語音識別
Findyou:一般使用ASR縮寫。
1.2、句錯率(SER)
句錯誤率:Sentence Error Rate
解釋:句子識別錯誤的的個數,除以總的句子個數即為SER
計算公式:(所有公式省了* 100%)
SER = 錯誤句數 / 總句數
1.3、句正確率(S.Corr)
句正確率:Sentence Correct
計算公式:
S.Corr = 1 - SER = 正確句數 / 總句數
1.4、字錯率(WER/CER)
WER,Word error rate,詞錯率,但一般稱為字錯率,是語音識別領域的關鍵性評估指標,WER越低表示效果越好!
CER,Character Error Rate,字符錯誤率,中文一般用CER來表示字錯率,原因請見1.4.3。
維基百科:https://en.wikipedia.org/wiki/Word_error_rate
»1.4.1 、計算原理
字符串編輯距離(Levenshtein距離)算法
編輯距離:https://en.wikipedia.org/wiki/Levenshtein_distance
»1.4.2、計算公式(重要)
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.3、問題
問題1:為什么WER會大于100%
因為有插入字(識別多出來的字),所以理論上WER有可能大于100%,在下面實例我會舉例(請見2.3.5),但實際場景,特別是大樣本量的時候,基本太不可能出現。
問題2:說中文應該用CER,即“字符錯誤率”(Character Error Rate)
Findyou舉個栗子:
英文:hello # 算一個Word 中文:你好 # 算兩個字符
啰嗦文字解釋,就是:
英文,因為最小單元是Word,語音識別應該用"字錯誤率"(WER),
中文,因為最小單元是字符,語音識別應該用“字符錯誤率”(CER)。
BUT(就是但是的意思...),他跟我前面那一句一樣,說的都是廢話!
我們計算的時候誰不是按:中文的一個字符 = 英文的一個Word,那這樣用WER的公式有什么問題呢?
誰再跟你咬文嚼字,懟他,使勁懟!
懟完,說回嚴謹的話,建議采用CER表示,哈哈哈哈哈......
1.5、字正確率(W.Corr)
字正確率,Word Correct,一般國內宣傳用的多,識別率(識別正確率)達到多少多少(請見1.7)。
計算公式
W.Corr = ( N - D - S ) / N = H / N
問題:只計算了識別正確的字,沒有管多出來的字(I插入),當然一般情況下不會有什么問題。
1.6、字準確率(W.Acc)
字準確率,WordAccuracy
計算公式
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.7、聊點其他
ASR影響素因
人群:男、女、老人、小孩...
音量)
距離(與拾音設備的距離)
角度(與拾音設備的角度)
設備(拾音設備的硬件)
環境:安靜、嘈雜(自噪、外噪)、家庭、商場...
句長
口音、方言
語速
語言:中文、英語
等等
大概舉例幾個影響因素(懶得放腦圖,文字也方便大家拷貝),
因為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
二、HTK工具
了解了ASR相關的指標,需要有工具來進行結果統計計算,
本次主要介紹HTK工具,python也有Levenshtein的庫,但沒有HResults現成的來的簡單。
2.1、HTK工具簡介
HTK工具,HTK(HMM Toolkit)一款基于HMM模型(隱馬爾可夫模型)的語音處理工具,HTK主要用于語音識別研究,盡管它已被用于許多其他應用,包括語音合成,字符識別和DNA測序的研究。HTK最初是在劍橋大學工程系(CUED)的機器智能實驗室 (以前稱為語音視覺和機器人小組)開發的。后版權輾轉到Microsoft,其保留了原始HTK代碼的版權,具體介紹請移步HTK官網。
HTK官方主頁:http://htk.eng.cam.ac.uk/
最新穩定版:HTK 3.4.1
最新版:HTK 3.5
Findyou:下載你需要先注冊用戶,記住你的密碼,FTP下載的時候需要。
2.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("
".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.3、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 %
總結
以上是生活随笔為你收集整理的ASR测试方法---字错率(WER)、句错率(SER)统计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python视图函数是什么_python
- 下一篇: jmeter吞吐量_深入理解Jmeter