語音識別 (ASR) 模型測試 之 評估指標探索

iTestOps發表於2020-12-22

如上圖,我們通過微信傳送了一段語音,在對語音進行轉文字時。語音識別引擎首先會將把這段語音進行分幀(切分成若干小段),然後利用聲學模型將提取的每一幀的聲學特徵識別為一個個“狀態”,多個狀態會組合成一個音素(語音中的最小的單位),音素構成了諸多同音字,再利用 語言模型 從諸多同音字中挑選出可以使 語義完整的字(例如 不會把“吃飯”識別成“痴泛”),最後將文字展示出來。

語音識別(ASR) 過程

自動語音識別技術(Automatic Speech Recognition)是一種將人的語音轉換為文字的技術。

所謂語音識別,就是將一段語音訊號轉換成相對應的文字資訊,系統主要包含特徵提取、聲學模型,語言模型以及字典與解碼四大部分。

此外為了更有效地提取特徵往往還需要對所採集到的聲音訊號進行濾波、分幀等音訊資料預處理工作,將需要分析的音訊訊號從原始訊號中合適地提取出來。

特徵提取工作將聲音訊號從時域轉換到頻域,為聲學模型提供合適的特徵向量。

聲學模型中再根據聲學特性計算每一個特徵向量在聲學特徵上的得分,而語言模型則根據語言學相關的理論,計算該聲音訊號對應可能片語序列的概率。

最後根據已有的字典,對片語序列進行解碼,得到最後可能的文字表示。

其中大致過程梳理如下(為方便理解忽略部分嚴謹性):

預處理:

  • 首尾端的靜音切除,降低干擾,靜音切除的操作一般稱為VAD。
  • 聲音分幀,也就是把聲音切開成一小段一小段,每小段稱為一幀,使用移動窗函式來實現,不是簡單的切開,各幀之間一般是有交疊的。

特徵提取

  • 主要演算法有線性預測倒譜系數(LPCC)和Mel 倒譜系數(MFCC),目的是把每一幀波形變成一個包含聲音資訊的多維向量。

聲學模型(AM)

  • 通過對語音資料進行訓練獲得,輸入是特徵向量,輸出為音素資訊。

字典

  • 字或者詞與音素的對應, 簡單來說, 中文就是拼音和漢字的對應,英文就是音標與單詞的對應。

語言模型(LM)

  • 通過對大量文字資訊進行訓練,得到單個字或者詞相互關聯的概率。

解碼

  • 就是通過聲學模型,字典,語言模型對提取特徵後的音訊資料進行文字輸出。

語音識別流程的示例(為方便理解忽略部分嚴謹性):

1語音訊號

今天又是美好的一天呀

*2特徵提取 *

今天又是美好的一天呀 → [[123456],[],[]]

*3聲學模型 *

[[123456],[],[]] → j i n t i a n y o u s h i m e i h a o d e y i t i a n

*4字典 *

今:j īn ; 進:j ìn ; 天:t i ān; 填:t i án ; 又:y òu; 佑:y òu;是:sh ì; 美:m ěi ; 妹:m èi; 好:h ǎo; 的:d e; 一:y ī; 甜:t i án;

5語言模型(概率)

今天:0.7456; 又:0.6524;是:0.9301;又是:0.6012;美好:0.7621,沒好:0.5049,的:0.9871,;一:0.9123,天:0.6785,一天:0.9043;呀:0.7849,壓:0.4356

6輸出文字

今天又是美好的一天呀

語音識別(ASR) 評估指標

句錯誤率(SER)

識別錯誤的句子個數 除以總的句子個數,即為SER。

計算公式

SER = 錯誤句數 / 總句數 * 100%

可以理解為以下幾種情況會導致句子錯誤:

  • 由於字多而導致句子不對。如:你好呀。被識別為:你丫 好呀。
  • 由於字少而導致句子不對。如:你好呀。被識別為:你好。
  • 由於字不對應而導致句子不對。如:你好呀。被識別為:你好丫。

句正確率(S.Corr)

識別正確的句子個數 除以總的句子個數,即為S.Corr。

計算公式

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

字錯誤率(WER/CER)

為了使識別出來的詞序列(實際識別結果)和標準的詞序列(期望識別結果)之間保持一致,需要進行替換、刪除或者插入某些詞,這些插入、替換或刪除的詞的總個數,除以標準的詞序列中詞的總個數的百分比,即為WER。

WER是語音識別領域的關鍵性評估指標,WER越低表示效果越好。

  • WER(Word Error Rate),詞錯誤率,但一般稱為字錯誤率。
  • CER(Character Error Rate),字元錯誤率,中文一般用CER來表示 字錯誤率。

為什麼存在這兩種表示方式,原因如下:

  • 英文: Today # 1個單詞
  • 中文: 你好 # 2個字元

通俗點的解釋就是:

  • 英文,最小單元是單詞,語音識別應該用"字錯誤率"(WER)。
  • 中文,最小單元是字元,語音識別應該用“字元錯誤率”(CER)。 計算公式

WER = (S + D + I ) / N = (S + D + I ) / (S + D + C) * 100%

公式註解

  • S: 替換的字數,如 你好呀。被識別為:你好丫。
  • D: 刪除的字數,如 你好呀。被識別為:你好。
  • I: 插入的字數,如 你好呀。被識別為:你丫 好呀。
  • C: 正確的字數.
  • N: 為(S替換 + D刪除 + C正確)的字數,需要注意的是這並不等於原句總字數或者識別結果字數。

同時,在計算公式中因為有插入字數的計算,所以理論上WER/CER存在大於100%的可能。但實際場景,特別是大樣本量的時候,基本太不可能出現。,否則就太差了,不可能被商用。

字準確率(W.Acc)

字準確率(Word Accuracy),就是1-字錯誤率的結果。

計算公式

W.Acc = 1 - WER(或CER) = (N - D - S - I) / N = (C - I) / (S + D + C) * 100%

公式註解

  • S: 替換的字數,如 你好呀。被識別為:你好丫。
  • D: 刪除的字數,如 你好呀。被識別為:你好。
  • I: 插入的字數,如 你好呀。被識別為:你丫 好呀。
  • C: 正確的字數.
  • N: 為(S替換 + D刪除 + C正確)的字數,需要注意的是這並不等於原句總字數或者識別結果字數。

字正確率(W.Corr)

字正確率(Word Correct),通常說的某某ASR識別率(識別正確率) 達到97%,就是指的字正確率,計算中忽略了插入的字數。

計算公式

W.Corr = ( N - D - S ) / N = C/ (S + D + C) * 100%

公式註解

  • S: 替換的字數,如 你好呀。被識別為:你好丫。​
  • D: 刪除的字數,如 你好呀。被識別為:你好。
  • I: 插入的字數,如 你好呀。被識別為:你丫 好呀。
  • C: 正確的字數.
  • N: 為(S替換 + D刪除 + C正確)的字數,需要注意的是這並不等於原句總字數或者識別結果字數。

語音識別(ASR)評估指標計算示例

識別結果僅存在刪除(D)情況

示例:

語音輸入: 今 天 又 是 美 好 的 一 天 呀
文字輸出: 今 天 又 是 美 好

ASR 各指標計算結果,如下:

  • SER(句錯誤率) = 1 / 1 * 100%= 100 % ​
  • S.Corr(句正確率) = 1 - 1 * 100% = 0 % ​
  • WER/CER(字錯誤率) = (S + D + I ) / (S + D + C) = (0 + 4 + 0) / (0 + 4 + 6) = 40 % ​
  • W.Acc(字準確率) = (C - I) / (S + D + C) = (6 - 0) / (0 + 4 + 6) = 60 % ​
  • W.Corr(字正確率) = C/ (S + D + C) = 6 / (0 + 4 + 6) = 60 %

識別結果僅存在刪除(S)、替換(D)的情況

示例:

語音輸入: 今 天 又 是 美 好 的 一 天 呀
文字輸出: 今 天 有 是 美 好

ASR 各指標計算結果,如下:

  • SER(句錯誤率) = (1 / 1) * 100%= 100 % ​
  • S.Corr(句正確率) = (1 - 1) * 100% = 0 % ​
  • WER/CER(字錯誤率) = (S + D + I ) / (S + D + C) * 100% = (1 + 4 + 0) / (1 + 4 + 5) * 100% = 50 % ​
  • W.Acc(字準確率) = (C - I) / (S + D + C) * 100% = (5 - 0) / (1 + 4 + 5) * 100% = 50 % ​
  • W.Corr(字正確率) = C/ (S + D + C) * 100% = 5 / (1 + 4 + 5) * 100% = 50 %

識別結果存在刪除(S)、替換(D)、插入(I)的情況

示例:

語音輸入: 今 天 又 是 美 好 的 一 天 呀
文字輸出: 今 天 有 是 更 美 好

ASR 各指標計算結果,如下:

  • SER(句錯誤率) = (1 / 1) * 100%= 100 % ​
  • S.Corr(句正確率) = (1 - 1) * 100% = 0 % ​
  • WER/CER(字錯誤率) = (S + D + I ) / (S + D + C) * 100% = (1 + 4 + 1) / (1 + 4 + 5) * 100% = 60 % ​
  • W.Acc(字準確率) = (C - I) / (S + D + C) * 100% = (5 - 1) / (1 + 4 + 5) * 100% = 40 % ​
  • W.Corr(字正確率) = C / (S + D + C) * 100% = 5 / (1 + 4 + 5) * 100% = 50 %

識別結果字數小於語料字數,且全錯的情況

示例:

語音輸入: 今 天 又 是 美 好 的 一 天 呀
文字輸出: 上 山 打 老 虎

ASR 各指標計算結果,如下:

  • SER(句錯誤率) = (1 / 1) * 100%= 100 % ​
  • S.Corr(句正確率) = (1 - 1) * 100% = 0 % ​
  • WER/CER(字錯誤率) = (S + D + I ) / (S + D + C) * 100% = (5 + 5 + 0) / (5 + 5 + 0) * 100% = 100 % ​
  • W.Acc(字準確率) = (C - I) / (S + D + C) * 100% = (0 - 0) / (5 + 5 + 0) * 100% = 0 % ​
  • W.Corr(字正確率) = C / (S + D + C) * 100% = 0 / (5 + 5 + 0) * 100% = 0 %

識別結果字數大於語料字數,且全錯的情況
示例:

語音輸入: 今 天 又 是 美 好 的 一 天 呀
文字輸出: 景 甜 有 時 妹 號 得 億 田 丫 上 山 打 老 虎

ASR 各指標計算結果,如下:

  • SER(句錯誤率) = (1 / 1) * 100%= 100 % ​
  • S.Corr(句正確率) = (1 - 1) * 100% = 0 % ​
  • WER/CER(字錯誤率) = (S + D + I ) / (S + D + C) * 100% = (10 + 0 + 5) / (10 + 0 + 0) * 100% = 150 % ​
  • W.Acc(字準確率) = (C - I) / (S + D + C) * 100% = (0 - 5) / (10 + 0 + 0) * 100% = -50 % ​
  • W.Corr(字正確率) = C / (S + D + C) * 100% = 0 / (10 + 0 + 0) * 100% = 0 %

最後

後續抽時間分享下,測試中技術難點,即如何基於編輯距離實現對 WER的計算,包括精確的解析出 “C\S\D\I” 資料。大致輸出如下 對於每個音訊樣本的識別結果。


{
# 音訊標註文字
"ref": "五六七八九十",
# 音訊預測文字
"hyp": "五七捌九玖十",
"result_detail": {
# 所有對的字列表
"C": [
{ "ref_value": "五", # ref的值
"hyp_value": "五", # hyp的值
"ref_index": 0, # 該值在ref的索引位置
"hyp_index": 0, # 該值在hyp的索引位置
"ref_syllable": "wu", # ref中該值的音節
"hyp_syllable": "wu", # hyp中該值的音節
"ref_tones": "3", # ref中該值的音調
"hyp_tones": "3" # hyp中該值的音調
},{……} ],
# 所有編輯的字列表
"S": [{……}, ],
# 所有刪除的字列表
"D": [{……}, ],
# 所有插入的字列表
"I": [{……}, ]
},
# 字句的指標
"result_indicator": {
# 字錯率wer指標
"wer": 0.500,
# 句錯率ser指標
"ser": 1
},
# 編輯距離計算出的各項值
"result_count": {
# 全部的數量 N = S + I + D + C
"N": 6,
# 正確的的數量
"C": 4,
# 錯誤的的數量 W = S + I + D
"W": 3,
# 插入的數量
"I": 1,
# 刪除的數量
"D": 1,
# 編輯的數量
"S": 1
},
# ref hpy 建立相對索引,對齊後的字典,方便展示輸出
"relative_index_value": {
# 索引 1
"1": {
"ref_value": "五", # ref的值
"ref_index": 0, # 該值在ref的索引位置
"hyp_value": "五", # hyp的值
"hyp_index": 0, # 該值在hyp的索引位置
"syllable_type": "C", # 音節比對結果,C=正確 S=錯誤
"hyp_syllable": "wu", # hyp中該值的音節
"ref_syllable": "wu", # ref中該值的音節
"tones_type": "C", # 音調比對結果,C=正確 S=錯誤
"hyp_tones": "3", # hyp中該值的音調
"ref_tones": "3", # ref中該值的音調
"type": "C" # 字元比對結果,C=正確 S=編輯 I=插入 D=刪除
},
# 索引二
"2": {{……},}
}
}

相關文章