前言html
很久沒發文,看到仍有這麼多關注的小夥伴,以爲不發篇文對不住。確實很久沒有輸出經驗總結相關的文檔,抽了個時間,整理了下筆記,發一篇關於ASR經常使用測試指標。好比字錯率、句錯率指標,以及計算工具HResults的使用篇,後續慢慢找時間輸出一些人工智能領域,小白可理解可用的基礎知識,或者整理一些其餘筆記發一發。node
轉載說明python
本文爲原創文章,如需轉載,請在開篇顯著位置註明做者Findyou和出處算法
語音識別(speech recognition)技術,也被稱爲自動語音識別(英語:Automatic Speech Recognition, ASR),bash
狹隘一點白話說:將語音轉換爲文字的技術。app
Findyou:通常使用ASR縮寫。iphone
計算公式:(全部公式省了 * 100%)工具
計算公式:測試
WER,Word error rate,詞錯率,但通常稱爲字錯率,是語音識別領域的關鍵性評估指標,WER越低表示效果越好!ui
CER,Character Error Rate,字符錯誤率,中文通常用CER來表示字錯率,緣由請見1.4.3。
字符串編輯距離(Levenshtein距離)算法
(公式圖片和文字同樣,僅方便拷貝)
Findyou:
1.正確的字數:維基百科裏用的是C表明,H = N - (S+D) = C,我這邊直接改爲H,減小過多概念與變量。
2.大多數文章都沒有給出N的計算方式,很容易誤覺得是原句總字數或者識別結果總字數。
3.不理解不要緊,下面實例會幫助理解。
由於有插入字(識別多出來的字),因此理論上WER有可能大於100%,在下面實例我會舉例(請見2.3.5),但實際場景,特別是大樣本量的時候,基本太不可能出現。
Findyou舉個栗子:
英文:hello # 算一個Word 中文:你好 # 算兩個字符
囉嗦文字解釋,就是:
英文,由於最小單元是Word,語音識別應該用"字錯誤率"(WER),
中文,由於最小單元是字符,語音識別應該用「字符錯誤率」(CER)。
BUT(就是可是的意思...),他跟我前面那一句同樣,說的都是廢話!
咱們計算的時候誰不是按:中文的一個字符 = 英文的一個Word,那這樣用WER的公式有什麼問題呢?
誰再跟你咬文嚼字,懟他,使勁懟!
懟完,說回嚴謹的話,建議採用CER表示,哈哈哈哈哈......
字正確率,Word Correct,通常國內宣傳用的多,識別率(識別正確率)達到多少多少(請見1.7)。
計算公式
問題:只計算了識別正確的字,沒有管多出來的字(I插入),固然通常狀況下不會有什麼問題。
字準確率,Word Accuracy
計算公式
(圖片和文字同樣,方便拷貝,W.Acc是Findyou本身用的簡寫)
問題:爲何W.Acc會是負數?
同WER,由於有插入字。換個說法,由於字準確率=1 - WER,而WER可能大於1,因此W.Acc會出現負數,但實際狀況基本不存在。
大概舉例幾個影響因素(懶得放腦圖,文字也方便你們拷貝),
由於ASR的識別影響因素過多,因此不少時候會從各類緯度測試,好比:男生字錯率、女生字錯率,或者小孩字錯率、平均字錯率等等,
若是沒有公佈測試數據與方法,不可信,因會存在幾個操做,最大的問題是:
過擬合:訓練數據、測試數據、驗證數據是同一份,打外比方說:要考試的卷子就是你前一天發的老師發的練習卷還帶答案的。
先扯到這,後面找時間再整理一篇ASR測試方法系統講一講,
作爲測試咱們如何去測ASR以及制定各類測試標準。
說明:ICASSP2017上IBM說人類速記員WER是5.1%,通常認爲5.9% 的字錯率是人類速記員的水平。
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
了解了ASR相關的指標,須要有工具來進行結果統計計算,
本次主要介紹HTK工具,python也有Levenshtein的庫,但沒有HResults現成的來的簡單。
HTK工具,HTK(HMM Toolkit)一款基於HMM模型(隱馬爾可夫模型)的語音處理工具,HTK主要用於語音識別研究,儘管它已被用於許多其餘應用,包括語音合成,字符識別和DNA測序的研究。HTK最初是在劍橋大學工程系(CUED)的機器智能實驗室 (之前稱爲語音視覺和機器人小組)開發的。後版權展轉到Microsoft,其保留了原始HTK代碼的版權,具體介紹請移步HTK官網。
Findyou:下載你須要先註冊用戶,記住你的密碼,FTP下載的時候須要。
HTK有一系列工具,但我主要想寫的是HResults。
Centos系統編譯後的HTK3.4.1版本,HResults下載地址
百度網盤: https://pan.baidu.com/s/1gfm9jjqjZzJXU0lyGrLrCA 提取碼: wbfp
$ 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
1 今每天氣怎麼樣
2 明每天氣怎麼樣
Findyou:
1.第一列是數字,主要是爲了與ASR結果一一對應
2.咱們通常會剔除標點符號計算WER,因此注意去標點符號
#!MLF!# "*No1.lab" 今 天 天 氣 怎 麼 樣 . "*No2.lab" 明 天 天 氣 怎 麼 樣 .
Findyou:
1.注意第一行加:#!MLF!#
2.注意"*xxx.lab"
3.注意每句的點
1 驚每天氣
2 明每天氣怎麼樣
Findyou:
1.不少時間是自動化執行,或手工執行獲得識別結果
2.測試結果,第一列應該與src.txt對齊,經過第一列來識別須要對比的語料。
例:HResults 會根據 "*No1.lab" 對應 "*No1.rec" 來找到對應的文本計算WER。
#!MLF!# "*No1.rec" 驚 天 天 氣 . "*No2.rec" 明 天 天 氣 怎 麼 樣 .
Findyou:
1.txt轉換到mlf能夠用腳本轉換,注意雙個mlf文件的不一樣,lab與rec關鍵字。
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.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] ===================================================================
以一句測試用例與測試結果爲例,舉實例讓你們快速瞭解HResults的WER。
# 說明 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] ===================================================================
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]
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]
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]
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]
轉載說明
本文爲原創文章,如需轉載,請在開篇顯著位置註明做者Findyou和出處