前 言
近年來,隨著深度學習技術(shù)的不斷發(fā)展,語音識別準確率得到了大幅提升,由此帶來了基于語音交互應用的豐富想象力,這些技術(shù)越來越多地影響著人們生產(chǎn)和生活的方方面面。其中,消費級應用包括智能音箱、手機語音助理、車載智能座艙、語音輸入法與翻譯機等;企業(yè)級應用包括智能客服、語音質(zhì)檢、智慧教育、智慧醫(yī)療等。各類智能語音應用的蓬勃發(fā)展使得越來越多的人加入語音領(lǐng)域的研究和落地,共同推動整個語音產(chǎn)業(yè)的發(fā)展。
得益于語音識別技術(shù)的蓬勃發(fā)展和識別率的節(jié)節(jié)攀升,業(yè)界涌現(xiàn)出眾多優(yōu)秀的端到端語音工具包,如Wenet,ESPNet,SpeechBrain等。盡管如此,2009年約翰霍普金斯大學夏季研討會孵化出的Kaldi工具箱,以其穩(wěn)定的算法效果,活躍的社區(qū)氛圍,得到了廣泛應用,極大地降低了語音識別的上手門檻,也培養(yǎng)了大量的相關(guān)人才。目前,仍然有很多公司在使用基于Kaldi的工程方案。
由于語音交互技術(shù)涉及的算法與技術(shù)鏈條較長,因此已有的語音算法相關(guān)圖書主要集中在各類語音算法的原理與訓練上,缺乏從語音交互角度出發(fā),介紹語音交互所需的語音前后端各項算法和整體解決方案的相關(guān)圖書。在語音應用的落地上,學術(shù)界也缺乏產(chǎn)業(yè)界的工程應用落地經(jīng)驗。本書將致力于拉進學術(shù)界與產(chǎn)業(yè)界的距離,在系統(tǒng)地介紹語音交互流程中涉及的語音前端處理、語音識別和說話人日志等算法原理的同時,詳細介紹如何基于WebRTC,Kaldi和gRPC,從零構(gòu)建產(chǎn)業(yè)界穩(wěn)定、高性能、可商用的語音服務。
在前端算法的相關(guān)章節(jié)中,本書系統(tǒng)地介紹了語音活動檢測、語音降噪、回聲消除、波束形成等常用的語音前端處理算法的原理,還針對各種算法在實際場景中的工程實現(xiàn)方法,提供了大量的經(jīng)驗總結(jié)。除了介紹傳統(tǒng)信號的處理方法,本書還介紹了深度學習方法在語音前端領(lǐng)域中的發(fā)展和應用現(xiàn)狀。
在語音后端算法方面,本書詳細介紹了語音識別中的特征提取、聲學模型、語言模型、解碼器和端到端語音識別,以及說話人日志中的聲紋Embedding提取和聚類算法。同時,還介紹了如何基于Kaldi訓練語音識別及說話人日志模型。針對訓練模型時的很多細節(jié)問題,提供了詳細的解釋。
在語音算法工程化方面,本書介紹了如何利用WebRTC和Kaldi優(yōu)化處理流程,形成語音算法SDK;诹餍械挠糜谖⒎⻊諛(gòu)建的RPC遠程調(diào)用框架和SDK,進一步介紹了如何實現(xiàn)一套方便用戶快捷接入的語音算法的微服務。
本書由楊學銳、晏超、劉雪松合作撰寫。三位作者長期在一線從事語音算法工作,書中內(nèi)容匯集了他們在產(chǎn)業(yè)界模型訓練和應用落地的思考與經(jīng)驗總結(jié),希望能給學術(shù)界的研究人員與產(chǎn)業(yè)界的從業(yè)人員帶來一絲啟發(fā)和幫助。其中楊學銳負責第1、4、5章的撰寫及全書內(nèi)容的審核校對,晏超負責第6、7、8章的撰寫及工程代碼的實現(xiàn)調(diào)試,劉雪松負責第2、3章及第1章部分內(nèi)容的撰寫和校對。
最后,感謝電子工業(yè)出版社李淑麗老師的辛苦工作,感謝吳伯庸和王金超對本書的貢獻,感謝陳勇的審稿與校對,感謝成書過程中給予過幫助的所有相關(guān)人士。
由于作者水平有限,書中如有任何錯誤與不足,懇請廣大讀者批評指正并提出寶貴意見。
作者
2021年11日于上海
楊學銳
大疆創(chuàng)新語音交互算法負責人,復旦大學及Turku大學碩士,長期從事語音算法、深度學習、人工智能等領(lǐng)域的研究與商業(yè)落地,在相關(guān)領(lǐng)域發(fā)表多篇論文及專利。
晏超
北京郵電大學碩士,曾任職于HP Labs, Cisco, Technicolor等公司,F(xiàn)為云從科技語音算法負責人,從事語音識別、聲紋識別、說話人日志、語音合成等方向的算法研發(fā)工作,構(gòu)建了云從科技整套語音算法引擎與應用服務平臺。
劉雪松
OPPO音頻算法專家,復旦大學碩士,曾任職于美國國家儀器、聲網(wǎng)、云從科技等公司。在信號處理、音頻算法和語音算法等領(lǐng)域有豐富的實戰(zhàn)經(jīng)驗,在相關(guān)領(lǐng)域發(fā)表多篇論文及專利。
目 錄
第1章 語音識別概述 1
1.1 語音識別發(fā)展歷程 2
1.2 語音識別產(chǎn)業(yè)與應用 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 語音信號的聲學基礎(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 貝葉斯準則下的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 線性自適應濾波 69
3.4.3 分塊頻域自適應濾波器 70
3.4.4 雙講檢測 72
3.4.5 延遲估計 75
3.4.6 殘留回聲消除 76
3.4.7 基于神經(jīng)網(wǎng)絡(luò)的回聲消除 78
3.5 麥克風陣列與波束形成 79
3.5.1 麥克風陣列概述 80
3.5.2 延遲求和波束形成 86
3.5.3 最小方差無失真響應波束形成 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 基于自適應濾波的聲源定位 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 特征預處理 116
4.1.2 常見的語音特征 119
4.2 傳統(tǒng)聲學模型 124
4.2.1 聲學建模單元 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 語言模型的評價指標 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ū)分性訓練 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章 中文普通話模型訓練——以multi_cn為例 172
5.1 Kaldi安裝與環(huán)境配置 173
5.2 Kaldi中的數(shù)據(jù)格式與數(shù)據(jù)準備 174
5.3 語言模型訓練 178
5.4 發(fā)音詞典準備 180
5.5 特征提取 184
5.6 Kaldi中的Transition模型 186
5.7 預對齊模型訓練 187
5.7.1 單音素模型訓練 187
5.7.2 delta特征模型訓練 190
5.7.3 lda_mllt特征變換模型訓練 191
5.7.4 說話人自適應訓練 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訓練 197
5.9.1 對角UBM 197
5.9.2 I-Vector提取器 198
5.9.3 提取訓練數(shù)據(jù)的I-Vector 199
5.10 神經(jīng)網(wǎng)絡(luò)訓練 199
5.10.1 Chain模型 200
5.10.2 Chain模型數(shù)據(jù)準備 202
5.10.3 神經(jīng)網(wǎng)絡(luò)配置與訓練 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ù)和學習率調(diào)整 217
第6章 基于Kaldi的說話人日志 219
6.1 說話人日志概述 220
6.1.1 什么是說話人日志 220
6.1.2 說話人日志技術(shù) 220
6.1.3 說話人日志評價指標 227
6.2 聲紋模型訓練——以CNCeleb為例 229
6.2.1 聲紋數(shù)據(jù)準備 230
6.2.2 I-Vector訓練 240
6.2.3 X-Vector訓練 243
6.2.4 LDA/PLDA后端模型訓練 248
6.2.5 說話人日志后端模型訓練 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的語音識別服務 325
8.1 gRPC語音服務 326
8.2 ProtoBuf協(xié)議定義 327
8.3 基于gRPC的語音服務實現(xiàn) 329
8.3.1 gRPC Server實現(xiàn) 330
8.3.2 gRPC Client實現(xiàn) 337
8.3.3 gRPC語音服務的編譯與測試 343
8.4 本章小結(jié) 346
參考文獻 347