前 言
近年來,隨著深度學(xué)習(xí)技術(shù)的不斷發(fā)展,語音識別準(zhǔn)確率得到了大幅提升,由此帶來了基于語音交互應(yīng)用的豐富想象力,這些技術(shù)越來越多地影響著人們生產(chǎn)和生活的方方面面。其中,消費級應(yīng)用包括智能音箱、手機語音助理、車載智能座艙、語音輸入法與翻譯機等;企業(yè)級應(yīng)用包括智能客服、語音質(zhì)檢、智慧教育、智慧醫(yī)療等。各類智能語音應(yīng)用的蓬勃發(fā)展使得越來越多的人加入語音領(lǐng)域的研究和落地,共同推動整個語音產(chǎn)業(yè)的發(fā)展。
得益于語音識別技術(shù)的蓬勃發(fā)展和識別率的節(jié)節(jié)攀升,業(yè)界涌現(xiàn)出眾多優(yōu)秀的端到端語音工具包,如Wenet,ESPNet,SpeechBrain等。盡管如此,2009年約翰霍普金斯大學(xué)夏季研討會孵化出的Kaldi工具箱,以其穩(wěn)定的算法效果,活躍的社區(qū)氛圍,得到了廣泛應(yīng)用,極大地降低了語音識別的上手門檻,也培養(yǎng)了大量的相關(guān)人才。目前,仍然有很多公司在使用基于Kaldi的工程方案。
由于語音交互技術(shù)涉及的算法與技術(shù)鏈條較長,因此已有的語音算法相關(guān)圖書主要集中在各類語音算法的原理與訓(xùn)練上,缺乏從語音交互角度出發(fā),介紹語音交互所需的語音前后端各項算法和整體解決方案的相關(guān)圖書。在語音應(yīng)用的落地上,學(xué)術(shù)界也缺乏產(chǎn)業(yè)界的工程應(yīng)用落地經(jīng)驗。本書將致力于拉進學(xué)術(shù)界與產(chǎn)業(yè)界的距離,在系統(tǒng)地介紹語音交互流程中涉及的語音前端處理、語音識別和說話人日志等算法原理的同時,詳細介紹如何基于WebRTC,Kaldi和gRPC,從零構(gòu)建產(chǎn)業(yè)界穩(wěn)定、高性能、可商用的語音服務(wù)。
在前端算法的相關(guān)章節(jié)中,本書系統(tǒng)地介紹了語音活動檢測、語音降噪、回聲消除、波束形成等常用的語音前端處理算法的原理,還針對各種算法在實際場景中的工程實現(xiàn)方法,提供了大量的經(jīng)驗總結(jié)。除了介紹傳統(tǒng)信號的處理方法,本書還介紹了深度學(xué)習(xí)方法在語音前端領(lǐng)域中的發(fā)展和應(yīng)用現(xiàn)狀。
在語音后端算法方面,本書詳細介紹了語音識別中的特征提取、聲學(xué)模型、語言模型、解碼器和端到端語音識別,以及說話人日志中的聲紋Embedding提取和聚類算法。同時,還介紹了如何基于Kaldi訓(xùn)練語音識別及說話人日志模型。針對訓(xùn)練模型時的很多細節(jié)問題,提供了詳細的解釋。
在語音算法工程化方面,本書介紹了如何利用WebRTC和Kaldi優(yōu)化處理流程,形成語音算法SDK。基于流行的用于微服務(wù)構(gòu)建的RPC遠程調(diào)用框架和SDK,進一步介紹了如何實現(xiàn)一套方便用戶快捷接入的語音算法的微服務(wù)。
本書由楊學(xué)銳、晏超、劉雪松合作撰寫。三位作者長期在一線從事語音算法工作,書中內(nèi)容匯集了他們在產(chǎn)業(yè)界模型訓(xùn)練和應(yīng)用落地的思考與經(jīng)驗總結(jié),希望能給學(xué)術(shù)界的研究人員與產(chǎn)業(yè)界的從業(yè)人員帶來一絲啟發(fā)和幫助。其中楊學(xué)銳負責(zé)第1、4、5章的撰寫及全書內(nèi)容的審核校對,晏超負責(zé)第6、7、8章的撰寫及工程代碼的實現(xiàn)調(diào)試,劉雪松負責(zé)第2、3章及第1章部分內(nèi)容的撰寫和校對。
最后,感謝電子工業(yè)出版社李淑麗老師的辛苦工作,感謝吳伯庸和王金超對本書的貢獻,感謝陳勇的審稿與校對,感謝成書過程中給予過幫助的所有相關(guān)人士。
由于作者水平有限,書中如有任何錯誤與不足,懇請廣大讀者批評指正并提出寶貴意見。
作者
2021年11日于上海
目 錄
第1章 語音識別概述 1
1.1 語音識別發(fā)展歷程 2
1.2 語音識別產(chǎn)業(yè)與應(yīng)用 6
1.2.1 消費級市場 7
1.2.2 企業(yè)級市場 8
1.3 常用語音處理工具 10
1.3.1 WebRTC 10
1.3.2 Kaldi 12
1.3.3 端到端語音識別工具包 14
第2章 語音信號基礎(chǔ) 16
2.1 語音信號的聲學(xué)基礎(chǔ) 17
2.1.1 語音產(chǎn)生機理 17
2.1.2 語音信號的產(chǎn)生模型 19
2.1.3 語音信號的感知 20
2.2 語音信號的數(shù)字化和時頻變換 22
2.2.1 語音信號的采樣、量化和編碼 22
2.2.2 語音信號的時頻變換 25
2.3 本章小結(jié) 31
第3章 語音前端算法 32
3.1 語音前端算法概述 33
3.2 VAD 35
3.2.1 基于門限判決的VAD 36
3.2.2 基于高斯混合模型的VAD 38
3.2.3 基于神經(jīng)網(wǎng)絡(luò)的VAD 40
3.3 單通道降噪 43
3.3.1 譜減法 44
3.3.2 維納濾波法 46
3.3.3 音樂噪聲和參數(shù)譜減法 48
3.3.4 貝葉斯準(zhǔn)則下的MMSE 51
3.3.5 噪聲估計 56
3.3.6 基于神經(jīng)網(wǎng)絡(luò)的單通道降噪 61
3.4 回聲消除 65
3.4.1 回聲消除概述 66
3.4.2 線性自適應(yīng)濾波 69
3.4.3 分塊頻域自適應(yīng)濾波器 70
3.4.4 雙講檢測 72
3.4.5 延遲估計 75
3.4.6 殘留回聲消除 76
3.4.7 基于神經(jīng)網(wǎng)絡(luò)的回聲消除 78
3.5 麥克風(fēng)陣列與波束形成 79
3.5.1 麥克風(fēng)陣列概述 80
3.5.2 延遲求和波束形成 86
3.5.3 最小方差無失真響應(yīng)波束形成 89
3.5.4 廣義旁瓣對消波束形成 92
3.5.5 后置濾波 98
3.5.6 基于神經(jīng)網(wǎng)絡(luò)的波束形成 101
3.6 聲源定位 103
3.6.1 GCC-PHAT 104
3.6.2 基于自適應(yīng)濾波的聲源定位 105
3.6.3 SRP-PHAT 108
3.6.4 子空間聲源定位算法 108
3.6.5 基于神經(jīng)網(wǎng)絡(luò)的聲源定位 111
3.7 其他未盡話題 111
3.8 本章小結(jié) 113
第4章 語音識別原理 114
4.1 特征提取 116
4.1.1 特征預(yù)處理 116
4.1.2 常見的語音特征 119
4.2 傳統(tǒng)聲學(xué)模型 124
4.2.1 聲學(xué)建模單元 124
4.2.2 GMM-HMM 126
4.2.3 強制對齊 131
4.3 DNN-HMM 131
4.3.1 語音識別中的神經(jīng)網(wǎng)絡(luò)基礎(chǔ) 132
4.3.2 常見的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu) 137
4.4 語言模型 145
4.4.1 n-gram語言模型 145
4.4.2 語言模型的評價指標(biāo) 148
4.4.3 神經(jīng)語言模型 148
4.5 WFST解碼器 151
4.5.1 WFST原理 151
4.5.2 常見的WFST運算 152
4.5.3 語音識別中的WFST解碼器 155
4.5.4 令牌傳遞算法 157
4.5.5 Beam Search 159
4.6 序列區(qū)分性訓(xùn)練 160
4.6.1 MMI和bMMI 161
4.6.2 MPE和sMBR 161
4.6.3 詞圖 161
4.6.4 LF-MMI 162
4.7 端到端語音識別 163
4.7.1 CTC 163
4.7.2 Seq2Seq 166
4.8 語音識別模型評估 169
4.9 本章小結(jié) 171
第5章 中文普通話模型訓(xùn)練——以multi_cn為例 172
5.1 Kaldi安裝與環(huán)境配置 173
5.2 Kaldi中的數(shù)據(jù)格式與數(shù)據(jù)準(zhǔn)備 174
5.3 語言模型訓(xùn)練 178
5.4 發(fā)音詞典準(zhǔn)備 180
5.5 特征提取 184
5.6 Kaldi中的Transition模型 186
5.7 預(yù)對齊模型訓(xùn)練 187
5.7.1 單音素模型訓(xùn)練 187
5.7.2 delta特征模型訓(xùn)練 190
5.7.3 lda_mllt特征變換模型訓(xùn)練 191
5.7.4 說話人自適應(yīng)訓(xùn)練 192
5.8 數(shù)據(jù)增強 193
5.8.1 數(shù)據(jù)清洗及重分割 194
5.8.2 速度增強和音量增強 194
5.8.3 SpecAugment 196
5.9 I-Vector訓(xùn)練 197
5.9.1 對角UBM 197
5.9.2 I-Vector提取器 198
5.9.3 提取訓(xùn)練數(shù)據(jù)的I-Vector 199
5.10 神經(jīng)網(wǎng)絡(luò)訓(xùn)練 199
5.10.1 Chain模型 200
5.10.2 Chain模型數(shù)據(jù)準(zhǔn)備 202
5.10.3 神經(jīng)網(wǎng)絡(luò)配置與訓(xùn)練 203
5.11 解碼圖生成 209
5.12 本章小結(jié) 210
5.13 附錄 211
5.13.1 xconfig中的描述符及網(wǎng)絡(luò)配置表 211
5.13.2 Chain模型中的egs 215
5.13.3 Kaldi nnet3中迭代次數(shù)和學(xué)習(xí)率調(diào)整 217
第6章 基于Kaldi的說話人日志 219
6.1 說話人日志概述 220
6.1.1 什么是說話人日志 220
6.1.2 說話人日志技術(shù) 220
6.1.3 說話人日志評價指標(biāo) 227
6.2 聲紋模型訓(xùn)練——以CNCeleb為例 229
6.2.1 聲紋數(shù)據(jù)準(zhǔn)備 230
6.2.2 I-Vector訓(xùn)練 240
6.2.3 X-Vector訓(xùn)練 243
6.2.4 LDA/PLDA后端模型訓(xùn)練 248
6.2.5 說話人日志后端模型訓(xùn)練 250
6.3 本章小結(jié) 253
第7章 基于Kaldi的語音SDK實現(xiàn) 254
7.1 語音特征提取 258
7.1.1 音頻讀取 258
7.1.2 音頻特征提取 261
7.2 基于WebRTC的語音活動檢測 268
7.3 說話人日志模塊 273
7.3.1 I-Vector提取 275
7.3.2 X-Vector提取 287
7.3.3 說話人日志算法實現(xiàn) 299
7.4 語音識別解碼 313
7.5 本章小結(jié) 324
第8章 基于gRPC的語音識別服務(wù) 325
8.1 gRPC語音服務(wù) 326
8.2 ProtoBuf協(xié)議定義 327
8.3 基于gRPC的語音服務(wù)實現(xiàn) 329
8.3.1 gRPC Server實現(xiàn) 330
8.3.2 gRPC Client實現(xiàn) 337
8.3.3 gRPC語音服務(wù)的編譯與測試 343
8.4 本章小結(jié) 346
參考文獻 347