(目的:方便自己下次看,有點流水賬)
簡介:
?? 信號處理與特征提取
?? 傳統聲學模型
?? 基于深度學習的聲學模型
?? 端到端的語音識別系統簡介
業界現狀
開源項目
簡介:
?? 語音識別技術所涉及的領域包括:信號處理、模式識別、概率論和信息論、發聲機理和聽覺機理、人工智能等等。
??語音識別的輸入實際上就是一段隨時間播放的信號序列(語音片段),而輸出則是一段文本序列。完整的語音識別系統通常包括信號處理和特征提取、聲學模型、語言模型和解碼搜索四個模塊。
??信號處理和特征提取可以視作音頻數據的預處理部分,一般來說,一段高保真、無噪聲的語言是非常難得的,實際研究中用到的語音片段或多或少都有噪聲存在,所以在正式進入聲學模型之前,我們需要通過消除噪聲和信道增強等預處理技術,將信號從時域轉化到頻域,然后為之后的聲學模型提取有效的特征向量。接下來聲學模型會將預處理部分得到的特征向量轉化為聲學模型得分,與此同時,語言模型,也就是我們前面在自然語言處理中談到的類似 n-gram 和 RNN 等模型,會得到一個語言模型得分,最后解碼搜索階段會針對聲學模型得分和語言模型得分進行綜合,將得分最高的詞序列作為最后的識別結構。這便是語音識別的一般原理。
??因為語音識別相較于一般的自然語言處理任務特殊之處就在于聲學模型,所以語言識別的****關鍵****也就是信號處理預處理技術和聲學模型部分。在深度學習興起應用到語言識別領域之前,聲學模型已經有了非常成熟的模型體系,并且也有了被成功應用到實際系統中的案例。比如說經典的高斯混合模型(GMM)和隱馬爾可夫模型(HMM)等。神經網絡和深度學習興起以后,循環神經網絡、LSTM、編碼-解碼框架、注意力機制等基于深度學習的聲學模型將此前各項基于傳統聲學模型的識別案例錯誤率降低了一個 level,所以基于深度學習的語音識別技術也正在逐漸成為語音識別領域的核心技術。
??語音識別發展到如今,無論是基于傳統聲學模型的語音識別系統還是基于深度學習的識別系統,語音識別的各個模塊都是分開優化的。但是語音識別本質上是一個序列識別問題,如果模型中的所有組件都能夠聯合優化,很可能會獲取更好的識別準確度,因而端到端的自動語音識別是未來語音識別的一個最重要的發展方向
??所以,這一講主要內容的介紹順序就是先給大家介紹聲波信號處理和特征提取等預處理技術,然后介紹 GMM 和 HMM 等傳統的聲學模型,其中重點解釋語音識別的技術原理,之后后對基于深度學習的聲學模型進行一個技術概覽,對當前深度學習在語音識別領域的主要技術進行簡單了解,最后對未來語音識別的發展方向——端到端的語音識別系統進行了解。
信號處理與特征提取
??因為聲波是一種信號,具體我們可以將其稱為音頻信號。原始的音頻信號通常由于人類發聲器官或者語音采集設備所帶來的靜音片段、混疊、噪聲、高次諧波失真等因素,一定程度上會對語音信號質量產生影響。所以在正式使用聲學模型進行語音識別之前,我們必須對音頻信號進行預處理和特征提取。
??最初始的預處理工作就是靜音切除,也叫語音激活檢測(Voice Activity Detection, VAD) 或者語音邊界檢測。目的是從音頻信號流里識別和消除長時間的靜音片段,在截取出來的有效片段上進行后續處理會很大程度上降低靜音片段帶來的干擾。除此之外,還有許多其他的音頻預處理技術,可以找來信號處理相關的資料進行閱讀。
??然后就是特征提取工作。音頻信號中通常包含著非常豐富的特征參數,不同的特征向量表征著不同的聲學意義,從音頻信號中選擇有效的音頻表征的過程就是語音特征提取。常用的語音特征包括線性預測倒譜系數(LPCC)和梅爾頻率倒譜系數(MFCC),其中 LPCC 特征是根據聲管模型建立的特征參數,是對聲道響應的特征表征。而 MFCC 特征是基于人的聽覺特征提取出來的特征參數,是對人耳聽覺的特征表征。所以,在對音頻信號進行特征提取時通常使用 MFCC 特征。
??MFCC 主要由預加重、分幀、加窗、快速傅里葉變換(FFT)、梅爾濾波器組、離散余弦變換幾部分組成,其中FFT與梅爾濾波器組是 MFCC 最重要的部分。一個完整的 MFCC 算法包括如下幾個步驟:
· 快速傅里葉變換(FFT);
· 梅爾頻率尺度轉換;
· 配置三角形濾波器組并計算每一個三角形濾波器對信號幅度譜濾波后的輸出;
· 對所有濾波器輸出作對數運算,再進一步做離散余弦變換(DTC),即可得到MFCC。
??實際的語音研究工作中,也不需要我們再從頭構造一個 MFCC 特征提取方法,Python 為我們提供了 pyaudio 和 librosa 等語音處理工作庫,可以直接調用 MFCC 算法的相關模塊快速實現音頻預處理工作。
??過去在語音識別上所取得成果證明 MFCC 是一種行之有效的特征提取方法。但隨著深度學習的發展,受限的玻爾茲曼機(RBM)、卷積神經網絡(CNN)、CNN-LSTM-DNN(CLDNN)等深度神經網絡模型作為一個直接學習濾波器代替梅爾濾波器組被用于自動學習的語音特征提取中,并取得良好的效果。
[TOC]
傳統聲學模型
??在經過語音特征提取之后,我們就可以將這些音頻特征進行進一步的處理,處理的目的是找到語音來自于某個聲學符號(音素)的概率。這種通過音頻特征找概率的模型就稱之為聲學模型。在深度學習興起之前,混合高斯模型(GMM)和隱馬爾可夫模型(HMM)一直作為非常有效的聲學模型而被廣泛使用,當然即使是在深度學習高速發展的今天,這些傳統的聲學模型在語音識別領域仍然有著一席之地。所以,作為傳統聲學模型的代表,我們就簡單介紹下 GMM 和 HMM 模型。
??所謂高斯混合模型(Gaussian mixture model,GMM),就是用混合的高斯隨機變量的分布來擬合訓練數據(音頻特征)時形成的模型。原始的音頻數據經過短時傅里葉變換或者取倒譜后會變成特征序列,在忽略時序信息的條件下,這種序列非常適用于使用 GMM 進行建模。
??在實際的 GMM 訓練中,通常采用 EM 算法來進行迭代優化,以求取GMM中的加權系數及各個高斯函數的均值與方差等參數。
??GMM 作為一種基于傅里葉頻譜語音特征的統計模型,在傳統語音識別系統的聲學模型中發揮了重要的作用。其劣勢在于不能考慮語音順序信息,高斯混合分布也難以擬合非線性或近似非線性的數據特征。所以,當狀態這個概念引入到聲學模型的時候,就有了一種新的聲學模型——隱馬爾可夫模型(Hidden Markov model,HMM)。
??在隨機過程領域,馬爾可夫過程和馬爾可夫鏈向來有著一席之地。當一個馬爾可夫過程含有隱含未知參數時,這樣的模型就稱之為隱馬爾可夫模型。HMM 的核心概念是狀態,狀態本身作為一個離散隨機變量,馬爾可夫鏈的每一個狀態上都增加了不確定性或者統計分布使得 HMM 成為了一種雙隨機過程。
??HMM 的主要內容包括參數特征、仿真方法、參數的極大似然估計、EM估計算法以及維特比狀態解碼算法等細節知識,筆者將在手動實現機器學習算法系列中詳細介紹,本篇作為綜述這里不做詳細的展開。
基于深度學習的聲學模型
??一提到神經網絡和深度學習在語音識別領域的應用,可能我們的第一反應就是循環神經網絡 RNN 模型以及長短期記憶網絡 LSTM 等等。實際上,在語音識別發展的前期,就有很多將神經網絡應用于語音識別和聲學模型的應用了。
??在上圖這個框架中,HMM 用來描述語音信號的動態變化,DNN 則是用來估計觀察特征的概率。在給定聲學觀察特征的條件下,我們可以用 DNN 的每個輸出節點來估計 HMM 某個狀態的后驗概率。由于 DNN-HMM 訓練成本不高而且相對較高的識別概率,所以即使是到現在在語音識別領域仍然是較為常用的聲學模型。
??除了 DNN 之外,經常用于計算機視覺的 CNN 也可以拿來構建語音聲學模型。當然,CNN 也是經常會與其他模型結合使用。CNN 用于聲學模型方面主要包括 TDNN、CNN-DNN 框架、DFCNN、CNN-LSTM-DNN(CLDNN)框架、CNN-DNN-LSTM(CDL)框架、逐層語境擴展和注意 CNN 框架(LACE)等等。這么多基于 CNN 的混合模型框架都在聲學模型上取得了很多成果,這里小編僅挑兩個進行簡單闡述。
??TDNN是最早基于 CNN 的語音識別方法,TDNN 會沿頻率軸和時間軸同時進行卷積,因此能夠利用可變長度的語境信息。TDNN 用于語音識別分為兩種情況,第一種情況下:只有TDNN,很難用于大詞匯量連續性語音識別(LVCSR),原因在于可變長度的表述(utterance)與可變長度的語境信息是兩回事,在 LVCSR 中需要處理可變長度表述問題,而 TDNN 只能處理可變長度語境信息;第二種情況:TDNN-HMM 混合模型,由于HMM能夠處理可變長度表述問題,因而該模型能夠有效地處理 LVCSR 問題。下圖DTNN模型
??最后就是循環神經網絡 RNN,其中更多是 LSTM 網絡。音頻信號具有明顯的協同發音現象,因此必須考慮長時相關性。由于循環神經網絡RNN具有更強的長時建模能力,使得 RNN 也逐漸替代 DNN 和 CNN 成為語音識別主流的建模方案。比如說常見的基于 seq2seq 的編碼-解碼框架就是一種基于 RNN 的模型。關于 RNN 在語音識別和聲學模型中的應用小編不做過多解釋,感興趣的朋友可以自行查找相關資料了解。
??長期的研究和實踐證明:基于深度學習的聲學模型要比傳統的基于淺層模型的聲學模型更適合語音處理任務。語音識別的應用環境常常比較復雜,選擇能夠應對各種情況的模型建模聲學模型是工業界及學術界常用的建模方式。但單一模型都有局限性。HMM能夠處理可變長度的表述,CNN能夠處理可變聲道,RNN/CNN能夠處理可變語境信息。聲學模型建模中,混合模型由于能夠結合各個模型的優勢,是目前乃至今后一段時間內聲學建模的主流方式。
端到端的語音識別系統簡介
??無論是 GMM 和 HMM 這樣的傳統聲學模型,還是基于深度學習的聲學模型,它們對于整個語音識別系統都是分開優化的,但是語音識別本質上是一個序列識別問題,如果模型中的所有組件都能夠聯合優化,很可能會獲取更好的識別準確度,所以我們需要一種端到端(End2End)的語音識別處理系統。
業界現狀
??一個成功的語音識別系統真的是很難離開一眾優秀開源框架的支撐,比如:HTK,Julius,CMU-Sphinx,PWTH-ASR,LIA-ASR 以及 Kaldi。后來居上的 Kaldi 獨領風騷,擁有活躍的技術社區,被廣泛的應用在語音識別技術的研究和系統開發中。據了解,很多國內語音公司的語音識別系統也有著對 Kaldi 或多或少的依賴。但是,Kaldi 也有不盡如人意的地方,它依賴大量的腳本語言,而且核心算法使用 C++編寫的,對聲學模型的更新就不是一件容易的事情了,尤其是在需要改變各種神經網絡的結構時。即便是擁有豐富經驗的工程師,在調試的時候也會經歷巨大的痛苦。當然,盡管如此,Kaldi 還是一項偉大的工作。
??有問題存在,便有了改進的需要。Yoshua Bengio 團隊成員 Mirco Ravanelli 等人開發了一個試圖繼承 Kaldi 的效率和 PyTorch 的靈活性的開源框架——PyTorch-Kaldi。相關的論文已經在 ICASSP 2019 上發表。PyTorch-Kaldi 就是為了彌補 PyTorch 和 Kaldi 之間的鴻溝。在 PyTorch 中實現聲學模型,在l Kaldi 中執行特征提取、標簽/對齊計算和解碼。
開源項目:
- 阿里開源自研語音識別模型 DFSMN,準確率高達96.04%:<u>https://www.oschina.net/news/96897/ali-open-source-dfsmn</u>;<u>https://github.com/tramphero/kaldi</u>
image.png - 語音識別開源工具PyTorch-Kaldi:兼顧Kaldi效率與PyTorch靈活性
<u>https://baijiahao.baidu.com/s?id=1640464401989944651&wfr=spider&for=pc</u>
<u>https://github.com/mravanelli/pytorch-kaldi</u>
沒有找到訓練好的模型 - ASRT 是一套基于深度學習實現的語音識別系統,全稱為 Auto Speech Recognition Tool。項目聲學模型通過采用卷積神經網絡(CNN)和連接性時序分類(CTC)方法
必須遵循GPL 協議,所以最好不要用
是socket通信,沒有用flask搭建服務,舍棄
<u>https://baijiahao.baidu.com/s?id=1625146460946766055&wfr=spider&for=pc</u>
<u>https://github.com/nl8590687/ASRT_SpeechRecognition</u>
只能識別中文,不能有英文,因為沒有包含英文詞典 - 適用于Python的語音識別模塊,支持在線和離線的多個引擎和API <u>https://github.com/Uberi/speech_recognition</u>
IBM的識別機制是按照這樣來的:先是將你的音頻傳到IBM的服務器,然后是打開音頻實時識別,聽起來很拗口,意思就是將音頻放一遍,服務器邊放邊識別,最后將所有的識別以文本的形式(貌似是JSON格式,但是在speechrecognition模塊中,已經轉為文本)返回給你; 3、看完上面的識別機制,你可能會產生疑問:如果音頻時間比較長,中間出現網絡中斷,之前識別的內容不就沒了么。因此最好采取分段的方法,將音頻分割為較短的幾段,等效于實時的返回,減少丟失的問題; 4、經過測試,又有新問題,如果分段的話,超過10段以上,遠程服務器會中斷服務,也就是說:不能頻繁的調接口,跟網站的發爬蟲一樣。多進程就別想了。最后部門石經理提供的解決辦法是:識別一段后。等個5秒左右再循環下一個,照此方法可行。由于我自己的視頻不長,數量也不多,就沒做等待處理
問題:上傳到IBM服務器,應該是不行 - MASR 中文語音識別<u>https://github.com/libai3/masr</u>
在子系統能運行,在VM不可以
MASR使用的是門控卷積神經網絡(Gated Convolutional Network),網絡結構類似于Facebook在2016年提出的Wav2letter。但是使用的激活函數不是ReLU或者是HardTanh,而是GLU(門控線性單元)。因此稱作門控卷積網絡。+++CTCBeamDecoder
識別效果還可以吧 但沒能自己錄音---》2月2日可以錄音,搭建好了服務 - 使用deepspeech的語音識別<u>https://github.com/SeanNaren/deepspeech.pytorch</u>
下載下來了模型an4_pretrained_v2.pth,但沒下載數據 - JavaScipt<u>https://github.com/TalAter/annyang</u>
- 語音識別——基于深度學習的中文語音識別系統框架<u>https://github.com/audier/DeepSpeechRecognition</u>學習使用語音識別開源工具,搭建語音識別模型 模型只訓練少數數據,效果不是很好
- CASRDemo使用百度語音識別接口,在本地搭建環境實現語音識別功能。
基本能達到80%的漢語拼音正確率
<u>https://github.com/lihanghang/CASR-DEMO</u> - 博客及其模型都有<u>https://blog.csdn.net/rookie_wei/article/details/84527839</u>
CTC(Connectionist Temporal Classification)是語音識別中的一個關鍵技術,通過增加一個額外的Symbol代表NULL來解決疊字的問題。
在基于連續的時間序列分類任務中,常用CTC的方法。
該方法主要體現在處理loss值上,通過對序列對不上的label添加blank(空)的方式,將預測的輸出值與給定的label值在時間序列上對齊,再求出具體損失。
訓練的是沒有雜音的,對于有雜音的比如test里的數據識別效果很不好;無需在虛擬機下運行,因為沒有封裝 - 非常好的博客教程,語音模型用的transforer,但是模型需要自己去訓練,可以后續嘗試<u>https://blog.csdn.net/chinatelecom08/article/details/85013535</u>
總結:
語音識別太難了
?模型速度:最重要,硬件層面,包括麥克風轉換速度,聲卡轉化速度和搭載模型的運算器速度。其次,模型層面,針對深度學習模型,合理簡化模型結構,特別是卷積運算部分。
第三是網絡速度,主要體現在bs架構的web應用中,需要在網絡中傳輸語音流以及字符流,受網絡因素影響。
設備影響很大,我在自己高性能電腦上比普通電腦快,能感知到速度變化;模型層面,減少卷積運算可以提速,但是明顯影響質量,不可取。
模型準確率受環境和情感的影響,強噪音,回響等
?準確率提升方法總結:
1.在選擇聲源數據時 利用麥克風陣列束形成、語音增強、回聲消除、聲源定位等方法提高準確率
2.前饋型序列記憶神經網絡FSMN,增加了一個“記憶塊”的模塊來存儲對判斷當前語音幀有用的歷史信息和未來信息,實現語音識別中的“端到端”建模。
長段音頻識別方法:
1.長音頻識別方法構建深度學習神經網絡聲學模型,通過特征提取來獲取語音信息,利用反映識別對象語言的結構特性,從語音本質出發去提取特征信息,通過學習數據獲取部、目標標簽構成部和聲學模型構建部、語音輸入部、目標標簽預測部和解碼部
2.LSTM + CTC:對語音進行幀切割,然后進行特征提取,比如線性預測方法LPC,把一震波形變成一個多維向量。用LSTM + CTC將聲學特征轉換為音素,即聲學模型部分。然后通過語言模型等解碼技術轉換為可以識別的文字。