Kaldi是目前語音識別領(lǐng)域,廣受歡迎并流行的開源工具包。Kaldi設(shè)計之初對通用性,可拓展性等一系列源代碼層次的考量,大大降低了Kaldi作為語音識別工具包的門檻, 同時擁有非常完整的語音識別系統(tǒng)訓(xùn)練腳本。本書通過對Kaldi已有訓(xùn)練腳本的梳理和引導(dǎo),幫助讀者快速搭建可用的語音識別系統(tǒng)。
陳果果清華大學(xué)本科學(xué)位,約翰霍普金斯大學(xué)博士學(xué)位,主要研究方向是語音識別及關(guān)鍵詞檢索,師從語音識別開源工具Kaldi主要開發(fā)者Daniel Povey,以及約翰霍普金斯大學(xué)語言語音處理中心教授Sanjeev Khudanpur。博士期間為Google開發(fā)了Google的喚醒詞Okay Google的原型,現(xiàn)在已經(jīng)用到數(shù)以億計的安卓設(shè)備及Google智能語音交互設(shè)備上。博士期間同時參與開發(fā)語音識別開源工具Kaldi,以及神經(jīng)網(wǎng)絡(luò)開源工具CNTK。博士畢業(yè)以后聯(lián)合創(chuàng)辦KITT.AI,專注于語音識別及自然語言處理,公司于2017年被百度收購,目前擔(dān)任百度智能生活事業(yè)群組(SLG)主任架構(gòu)師。都家宇本科畢業(yè)于大連理工大學(xué),后于澳大利亞新南威爾士大學(xué)電子信息工程學(xué)院學(xué)習(xí),取得信號處理專業(yè)碩士學(xué)位。研究生期間在導(dǎo)師 Julien Epps 指導(dǎo)下開始進行語音處理、情緒識別方向的研究。畢業(yè)后先后任職于清華大學(xué)語音技術(shù)實驗室、百度語音技術(shù)部,以及阿里巴巴iDST、達(dá)摩院語音組,從事聲學(xué)模型、解碼器、語音喚醒等方面的研發(fā)工作。參與過與 Kaldi 相關(guān)的工作有:Kaldi nnet1神經(jīng)網(wǎng)絡(luò)框架中 lstm 作者;發(fā)起并推動全球最大規(guī)模的中文開源數(shù)據(jù)集語音項目AISHELL-1、AISHELL-2,已服務(wù)于清華大學(xué)、北京大學(xué)、南洋理工大學(xué)、哥倫比亞大學(xué)等近200所國內(nèi)外高校的科研項目。那興宇本科和博士均畢業(yè)于北京理工大學(xué),主要研究方向是語音識別和語音合成。先后任職于中國科學(xué)院聲學(xué)研究所和阿里巴巴機器人,從事語音識別模型訓(xùn)練系統(tǒng)和語音交互系統(tǒng)的開發(fā)。目前就職于微軟,擔(dān)任資深應(yīng)用科學(xué)家,從事語音識別算法和技術(shù)架構(gòu)的開發(fā)及業(yè)務(wù)支持工作。2015年開始在Kaldi開源項目中貢獻(xiàn)代碼,參與了nnet3和chain模型的開發(fā)工作,并維護其中若干示例及OpenSLR的中文語音識別模型。張俊博博士畢業(yè)于中國科學(xué)院聲學(xué)研究所,師從顏永紅研究員。在小米公司從零起主導(dǎo)構(gòu)建了整套語音算法研究框架,包括語音識別、智能設(shè)備語音喚醒、聲紋識別、語音增強、用于語音應(yīng)用的神經(jīng)網(wǎng)絡(luò)部署,均達(dá)到了當(dāng)時的先進水平,并發(fā)表頂會論文若干篇,為后續(xù)的語音研發(fā)工作建立了基礎(chǔ)。近期上線了用于外語學(xué)習(xí)的發(fā)音質(zhì)量評測引擎,并給Kaldi貢獻(xiàn)了發(fā)音良好度評分的代碼。
1 語音識別技術(shù)基礎(chǔ)1
1.1 語音識別極簡史1
1.1.1 語音識別早期探索2
1.1.2 概率模型一統(tǒng)江湖2
1.1.3 神經(jīng)網(wǎng)絡(luò)異軍突起3
1.1.4 商業(yè)應(yīng)用推波助瀾4
1.2 語音識別系統(tǒng)架構(gòu)6
1.2.1 經(jīng)典方法的直觀理解6
1.2.2 概率模型7
1.2.3 端到端語音識別10
1.3 一些其他細(xì)節(jié)11
1.3.1 語音信號處理11
1.3.2 發(fā)音和語言學(xué)12
1.3.3 語音識別系統(tǒng)的評價13
2 Kaldi概要介紹15
2.1 發(fā)展歷史15
2.1.1 名字的由來15
2.1.2 約翰霍普金斯大學(xué)夏季研討會16
2.1.3 Kaldi發(fā)展簡史17
2.2 設(shè)計思想18
2.2.1 初衷18
2.2.2 開源19
2.2.3 訓(xùn)練腳本19
2.3 安裝20
2.3.1 下載Kaldi代碼20
2.3.2 安裝CUDA20
2.3.3 安裝編譯依賴庫21
2.3.4 安裝第三方工具21
2.3.5 選擇其他的矩陣庫23
2.3.6 編譯Kaldi代碼23
2.3.7 配置并行環(huán)境25
2.4 一個簡單的示例26
2.4.1 運行run.sh26
2.4.2 腳本解析28
2.5 示例介紹34
2.5.1 數(shù)據(jù)示例34
2.5.2 競賽示例38
2.5.3 其他示例40
2.5.4 示例結(jié)構(gòu)41
3 數(shù)據(jù)整理44
3.1 數(shù)據(jù)分集44
3.1.1 Librispeech示例的數(shù)據(jù)處理過程45
3.1.2 數(shù)據(jù)下載和解壓46
3.2 數(shù)據(jù)預(yù)處理49
3.2.1 環(huán)境檢查51
3.2.2 生成表單文件52
3.2.3 數(shù)據(jù)檢查55
3.3 輸入和輸出機制56
3.3.1 列表表單57
3.3.2 存檔表單60
3.3.3 讀寫聲明符60
3.3.4 表單屬性64
3.4 常用數(shù)據(jù)表單與處理腳本69
3.4.1 列表類數(shù)據(jù)表單70
3.4.2 存檔類數(shù)據(jù)表單72
3.4.3 數(shù)據(jù)文件夾處理腳本77
3.4.4 表單索引的一致性78
3.5 語言模型相關(guān)文件79
3.5.1 發(fā)音詞典與音素集80
3.5.2 語言文件夾85
3.5.3 生成與使用語言文件夾92
4 經(jīng)典聲學(xué)建模技術(shù)94
4.1 特征提取95
4.1.1 用 Kaldi 提取聲學(xué)特征95
4.1.2 特征在 Kaldi 中的存儲99
4.1.3 特征的使用104
4.1.4 常用特征類型106
4.2 單音子模型的訓(xùn)練107
4.2.1 聲學(xué)模型的基本概念108
4.2.2 將聲學(xué)模型用于語音識別112
4.2.3 模型初始化113
4.2.4 對齊115
4.2.5 Transition 模型118
4.2.6 GMM 模型的迭代124
4.3 三音子模型訓(xùn)練128
4.3.1 單音子模型假設(shè)的問題128
4.3.2 上下文相關(guān)的聲學(xué)模型129
4.3.3 三音子的聚類裁剪130
4.3.4 Kaldi中的三音子模型訓(xùn)練流程130
4.4 特征變換技術(shù)139
4.4.1 無監(jiān)督特征變換139
4.4.2 有監(jiān)督特征變換141
4.5 區(qū)分性訓(xùn)練143
4.5.1 聲學(xué)模型訓(xùn)練流程的變遷143
4.5.2 區(qū)分性目標(biāo)函數(shù)144
4.5.3 分子、分母145
4.5.4 區(qū)分性訓(xùn)練在實踐中的應(yīng)用146
5 構(gòu)圖和解碼147
5.1 N元文法語言模型148
5.2 加權(quán)有限狀態(tài)轉(zhuǎn)錄機151
5.2.1 概述151
5.2.2 OpenFst153
5.3 用WFST表示語言模型156
5.4 狀態(tài)圖的構(gòu)建158
5.4.1 用 WFST 表示發(fā)音詞典158
5.4.2 WFST 的復(fù)合運算163
5.4.3 詞圖的按發(fā)音展開165
5.4.4 LG 圖對上下文展開166
5.4.5 用 WFST 表示 HMM 拓?fù)浣Y(jié)構(gòu)169
5.5 圖的結(jié)構(gòu)優(yōu)化170
5.5.1 確定化170
5.5.2 最小化173
5.5.3 圖的stochastic性質(zhì)174
5.6 最終狀態(tài)圖的生成174
5.7 基于令牌傳遞的維特比搜索176
5.8 SimpleDecoder源碼分析178
5.9 Kaldi 解碼器家族187
5.10 帶詞網(wǎng)格生成的解碼189
5.11 用語言模型重打分提升識別率192
6 深度學(xué)習(xí)聲學(xué)建模技術(shù)195
6.1 基于神經(jīng)網(wǎng)絡(luò)的聲學(xué)模型195
6.1.1 神經(jīng)網(wǎng)絡(luò)基礎(chǔ)196
6.1.2 激活函數(shù)198
6.1.3 參數(shù)更新199
6.2 神經(jīng)網(wǎng)絡(luò)在Kaldi中的實現(xiàn)200
6.2.1 nnet1(nnet)200
6.2.2 nnet2203
6.2.3 nnet3208
6.3 神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練214
6.3.1 輸入特征的處理214
6.3.2 神經(jīng)網(wǎng)絡(luò)的初始化215
6.3.3 訓(xùn)練樣本的分批與隨機化217
6.3.4 學(xué)習(xí)率的調(diào)整222
6.3.5 并行訓(xùn)練224
6.3.6 數(shù)據(jù)擴充227
6.4 神經(jīng)網(wǎng)絡(luò)的區(qū)分性訓(xùn)練228
6.4.1 區(qū)分性訓(xùn)練的基本思想228
6.4.2 區(qū)分性訓(xùn)練的目標(biāo)函數(shù)229
6.4.3 區(qū)分性訓(xùn)練的實用技巧231
6.4.4 Kaldi神經(jīng)網(wǎng)絡(luò)區(qū)分性訓(xùn)練示例232
6.4.5 chain模型234
6.5 與其他深度學(xué)習(xí)框架的結(jié)合242
6.5.1 聲學(xué)模型242
6.5.2 語言模型243
6.5.3 端到端語音識別243
7 關(guān)鍵詞搜索與語音喚醒245
7.1 關(guān)鍵詞搜索技術(shù)介紹245
7.1.1 關(guān)鍵詞搜索技術(shù)的主流方法245
7.1.2 關(guān)鍵詞搜索技術(shù)的主流應(yīng)用247
7.2 語音檢索247
7.2.1 方法描述248
7.2.2 一個簡單的語音檢索系統(tǒng)248
7.2.3 集外詞處理之詞表擴展254
7.2.4 集外詞處理之關(guān)鍵詞擴展255
7.2.5 集外詞處理之音素/音節(jié)系統(tǒng)256
7.2.6 一個實用的語音檢索系統(tǒng)258
7.3 語音喚醒263
7.3.1 語音喚醒經(jīng)典框架264
7.3.2 語音喚醒進階優(yōu)化266
7.3.3 語音喚醒的Kaldi實現(xiàn)思路267
8 說話人識別269
8.1 概述269
8.2 基于i-vector和PLDA的說話人識別技術(shù)271
8.2.1 整體流程271
8.2.2 i-vector 的提取272
8.2.3 基于余弦距離對 i-vector 分類274
8.2.4 基于 PLDA 對 i-vector 分類276
8.3 基于深度學(xué)習(xí)的說話人識別技術(shù)280
8.3.1 概述280
8.3.2 x-vector280
8.3.3 基于 x-vector 的說話人識別示例283
8.4 語種識別288
9 語音識別應(yīng)用實踐292
9.1 語音識別基本應(yīng)用292
9.1.1 離線語音識別與實時在線語音識別292
9.1.2 語音識別應(yīng)用模塊293
9.1.3 小結(jié)296
9.2 話音檢測模塊296
9.2.1 VAD算法296
9.2.2 離線VAD297
9.2.3 流式在線VAD298
9.3 模型的適應(yīng)299
9.3.1 聲學(xué)模型的適應(yīng)299
9.3.2 詞表的擴展300
9.3.3 語言模型的適應(yīng)301
9.3.4 小結(jié)301
9.4 解碼器的選擇及擴展302
9.4.1 Kaldi中的解碼器302
9.4.2 實際應(yīng)用中的常見問題及擴展303
9.4.3 小結(jié)305
附錄A 術(shù)語列表306
附錄B 常見問題解答308
參考文獻(xiàn)313