如上圖,我們通過微信發送了一段語音,在對語音進行轉文字時。語音識別引擎首先會將把這段語音進行分幀(切分成若干小段),然後利用聲學模型將提取的每一幀的聲學特徵識別為一個個「狀態」,多個狀態會組合成一個音素(語音中的最小的單位),音素構成了諸多同音字,再利用 語言模型 從諸多同音字中挑選出可以使 語義完整的字(例如 不會把「吃飯」識別成「痴泛」),最後將文本展示出來。
自動語音識別技術(Automatic Speech Recognition)是一種將人的語音轉換為文本的技術。
所謂語音識別,就是將一段語音信號轉換成相對應的文本信息,系統主要包含特徵提取、聲學模型,語言模型以及字典與解碼四大部分。
此外為了更有效地提取特徵往往還需要對所採集到的聲音信號進行濾波、分幀等音頻數據預處理工作,將需要分析的音頻信號從原始信號中合適地提取出來。
特徵提取工作將聲音信號從時域轉換到頻域,為聲學模型提供合適的特徵向量。
聲學模型中再根據聲學特性計算每一個特徵向量在聲學特徵上的得分,而語言模型則根據語言學相關的理論,計算該聲音信號對應可能詞組序列的概率。
最後根據已有的字典,對詞組序列進行解碼,得到最後可能的文本表示。
其中大致過程梳理如下(為方便理解忽略部分嚴謹性):
預處理:
特徵提取:主要算法有線性預測倒譜係數(LPCC)和Mel 倒譜係數(MFCC),目的是把每一幀波形變成一個包含聲音信息的多維向量。
聲學模型(AM):通過對語音數據進行訓練獲得,輸入是特徵向量,輸出為音素信息。
字典:字或者詞與音素的對應, 簡單來說, 中文就是拼音和漢字的對應,英文就是音標與單詞的對應。
語言模型(LM):通過對大量文本信息進行訓練,得到單個字或者詞相互關聯的概率。
解碼:就是通過聲學模型,字典,語言模型對提取特徵後的音頻數據進行文字輸出。
語音識別流程的示例(為方便理解忽略部分嚴謹性):
語音信號
今天又是美好的一天呀
特徵提取
今天又是美好的一天呀 → [[123456],[],[]]
聲學模型
[[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
字典
今: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;
語言模型(概率)
今天:0.7456; 又:0.6524;是:0.9301;又是:0.6012;美好:0.7621,沒好:0.5049,的:0.9871,;一:0.9123,天:0.6785,一天:0.9043;呀:0.7849,壓:0.4356
輸出文字
今天又是美好的一天呀
識別錯誤的句子個數 除以總的句子個數,即為SER。
計算公式
SER = 錯誤句數 / 總句數 * 100%
可以理解為以下幾種情況會導致句子錯誤:
識別正確的句子個數 除以總的句子個數,即為S.Corr。
計算公式
S.Corr = 1 - SER = 正確句數 / 總句數 * 100%
為了使識別出來的詞序列(實際識別結果)和標準的詞序列(期望識別結果)之間保持一致,需要進行替換、刪除或者插入某些詞,這些插入、替換或刪除的詞的總個數,除以標準的詞序列中詞的總個數的百分比,即為WER。
WER是語音識別領域的關鍵性評估指標,WER越低表示效果越好。
為什麼存在這兩種表示方式,原因如下:
英文: Today 2個字符
通俗點的解釋就是:
計算公式
WER = (S + D + I ) / N = (S + D + I ) / (S + D + C) * 100%
公式註解
S: 替換的字數,如 你好呀。被識別為:你好丫。D: 刪除的字數,如 你好呀。被識別為:你好。 I: 插入的字數,如 你好呀。被識別為:你丫 好呀。 C: 正確的字數.N: 為(S替換 + D刪除 + C正確)的字數,需要注意的是這並不等於原句總字數或者識別結果字數。
同時,在計算公式中因為有插入字數的計算,所以理論上WER/CER存在大於100%的可能。但實際場景,特別是大樣本量的時候,基本太不可能出現。,否則就太差了,不可能被商用。
字準確率(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正確)的字數,需要注意的是這並不等於原句總字數或者識別結果字數。
字正確率(Word Correct),通常說的某某ASR識別率(識別正確率) 達到97%,就是指的字正確率,計算中忽略了插入的字數。
計算公式
W.Corr = ( N - D - S ) / N = C/ (S + D + C) * 100%
公式註解
S: 替換的字數,如 你好呀。被識別為:你好丫。D: 刪除的字數,如 你好呀。被識別為:你好。 I: 插入的字數,如 你好呀。被識別為:你丫 好呀。 C: 正確的字數.N: 為(S替換 + D刪除 + C正確)的字數,需要注意的是這並不等於原句總字數或者識別結果字數。
示例:語音輸入: 今 天 又 是 美 好 的 一 天 呀文本輸出: 今 天 又 是 美 好
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 %
示例:語音輸入: 今 天 又 是 美 好 的 一 天 呀文本輸出: 今 天 有 是 美 好
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% = 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 %
示例:語音輸入: 今 天 又 是 美 好 的 一 天 呀文本輸出: 今 天 有 是 更 美 好
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 %