轉自:http://www.javashuo.com/article/p-bqgujjji-bc.htmlgit
阿里巴巴 2018 年開源的語音識別模型 DFSMN,將全球語音識別準確率紀錄提升至 96.04%。DFSMN 模型,是阿里巴巴的高效工業級實現,相對於傳統的 LSTM、BLSTM 等聲學模型,該模型具有訓練速度更快、識別更高效、識別準確率更高和模型大小壓縮等效果。github
本場 Chat 的主要內容包括:算法
- 語音識別流程簡介
- Kaldi 的部署使用
- 如何訓練基於中文的 DFSMN 聲學模型
- 語音特徵提取 MFCC 算法源碼解讀
- 語音識別工具對比
語音識別流程簡介
語音識別,通俗來說,就是將一段語音信號轉換成對應的文本信息。具體來講,語音識別是從一段連續聲波中採樣,將每一個採樣值量化;而後對量化的採樣音頻進行分幀,對於每一幀,抽取出一個描述頻譜內容的特徵向量;最後根據語音信號的特徵識別語音所表明的單詞。編程
下圖展現了語音識別的整個流程:服務器
經過上圖能夠看到,語音識別的整個流程,主要包含特徵提取和解碼(聲學模型、字典、語言模型)部分。網絡
- 特徵提取:從語音波形中提取出隨時間變化的語音特徵序列(即將聲音信號從時域轉換到頻域),爲聲學模型提供合適的特徵向量。主要算法有線性預測倒譜系數(LPCC)和梅爾頻率倒譜系數(MFCC)。
- 聲學模型:根據聲學特性計算每個特徵向量在聲學特徵上的得分,輸入是特徵向量,輸出爲音素信息。最經常使用的聲學建模方式是隱馬爾科夫模型(HMM),基於深度學習的發展,深度神經網絡(DNN)、卷積神經網絡(CNN)、循環神經網絡(RNN)等模型在觀測機率的建模中取得了很是好的效果。
- 字典:字或者詞與音素的對應,中文就是拼音和漢字的對應,英文就是音標與單詞的對應。(音素,單詞的發音由音素構成。對英語來講,一種經常使用的音素集是卡內基梅隆大學的一套由 39 個音素構成的音素集,漢語通常直接用所有聲母和韻母做爲音素集)。
- 語言模型:經過對大量文本信息進行訓練,獲得單個字或者詞相互關聯的機率。語音識別中,最多見的語言模型是 N-Gram。近年,深度神經網絡的建模方式也被應用到語言模型中,好比基於 CNN 及 RNN 的語言模型。
- 解碼:經過聲學模型、字典、語言模型對提取特徵後的音頻數據進行文字輸出。
在語音識別整個流程中,聲學模型做爲識別系統的底層模型,聲學模型的任務是計算 P(O|W)P(O|W)(即模型生成觀察序列的機率),它佔據着語音識別大部分的計算開銷,決定着語音識別系統的性能。因此,聲學模型是語音識別系統中最關鍵的一部分。app
本次 Chat 主講的阿里巴巴的 DFSMN 聲學模型,是創建在另外一個開源的語音識別工具 Kaldi 基礎之上的,或者如官網所說的:編程語言
DFSMN 是 Kaldi 的一個補丁文件,因此,爲了使用 DFSMN 模型,咱們必須先部署 Kaldi 語音識別工具。函數
Kaldi 的部署使用
Kaldi 是一個開源的語音識別工具庫,隸屬於 Apache 基金會,主要由 Daniel Povey 開發和維護。Kaldi 內置功能強大,支持 GMM-HMM、SGMM-HMM、DNN-HMM 等多種語音識別模型的訓練和預測。隨着深度學習的影響愈來愈大,Kaldi 目前對 DNN、CNN、LSTM 以及 Bidirectional-LSTM 等神經網絡結構均提供模型訓練支持。工具
目前在 GitHub 上這個項目依舊很是活躍,能夠在 https://github.com/kaldi-asr/kaldi 下載代碼,以及在 http://kaldi-asr.org/ 查看它的官方文檔。
筆者根據官方文檔實現 Kaldi 的安裝,並將阿里的 DFSMN 補丁加載到 Kaldi。如下是部署的完整步驟。
1. 下載 Kaldi 源碼
[zss@gpu-1-0 ~]$ git clone https://github.com/kaldi-asr/kaldi.git kaldi-trunk --origin golden
2. 切換到 kaldi-trunk 目錄,下載補丁源碼
-
[zss@gpu-1-0 ~]$ cd kaldi-trunk/
-
[zss@gpu-1-0 kaldi-trunk]$ git clone https://github.com/alibaba/Alibaba-MIT-Speech
3. 檢查補丁
[zss@gpu-1-0 kaldi-trunk]$ git checkout 04b1f7d6658bc035df93d53cb424edc127fab819
4. 將補丁加載到 Kaldi 分支
看看補丁中有什麼變化:
[zss@gpu-1-0 kaldi-trunk]$ git apply --stat Alibaba-MIT-Speech/Alibaba_MIT_Speech_DFSMN.patch
測試補丁:
[zss@gpu-1-0 kaldi-trunk]$ git apply --check Alibaba-MIT-Speech/Alibaba_MIT_Speech_DFSMN.patch
添加 Git 帳戶郵箱和用戶名,不然沒法應用補丁。
-
[zss@gpu-1-0 kaldi-trunk]$ git config --global user.email "userEmail"
-
[zss@gpu-1-0 kaldi-trunk]$ git config --global user.name "username"
應用補丁:
[zss@gpu-1-0 kaldi-trunk]$ git am --signoff < Alibaba-MIT-Speech/Alibaba_MIT_Speech_DFSMN.patch
5. 安裝 Kaldi
切換到 tools 目錄中,自動檢測並安裝缺乏的依賴包,直到出現 all OK
爲止。
[zss@gpu-1-0 tools]$ extras/check_dependencies.sh
編譯 –j
參數表示內核數,根據本身環境設定運用多少內核工做。
[zss@gpu-1-0 tools]$ make -j 24
切換到 src 目錄下,進行安裝。
-
[zss@gpu-1-0 src]$cd ../src
-
[zss@gpu-1-0 src]$ ./configure –shared
繼續安裝,執行如下命令,最後一行是 SUCCESS
代表成功。
[zss@gpu-1-0 src]$ make depend -j 24
繼續安裝,執行如下命令,若最後一行是 Done
則安裝成功。
[zss@gpu-1-0 src]$ make -j 24
自動安裝其它擴展包,執行如下命令:
[zss@gpu-1-0 src]$ make ext
運行自帶的 demo,檢測是否成功。
切換到 /kaldi-trunk/egs/yesno/s5 目錄下,運行程序。
-
[zss@gpu-1-0 src]$ cd ../egs/yesno/s5/
-
[zss@gpu-1-0 s5]$ ./run.sh
經過運算 WER 爲 0,在運算過程當中,WER 越小,表明錯誤率越低。
至此,咱們已經在服務器成功部署了 Kaldi 工具,並把 DFSMN 補丁打到該工具中。接下來,咱們將利用該工具訓練聲學模型。
訓練基於中文的 DFSMN 聲學模型
數據準備階段
本次模型訓練使用的是清華大學提供的 30 個小時的語料庫,下載地址以下:http://www.openslr.org/18/。
數據集包含以下內容:
下載數據集到服務器指定位置,進入到 ../thchs30-openslr/data_thchs30 位置,咱們能夠看到以下目錄內容:
其中 data 目錄下包含全部訓練的語音以及標註文件,咱們隨機打開一個語音標註文件,能夠看到:
語音標註文件主要包含三部分:
- 分詞後的語音文字
- 文字對應的拼音(含音調)
- 文字對應的音素(中文爲聲母、韻母)
準備完語料集,接下來咱們將看一下如何修改腳本,訓練 DFSMN 聲學模型。
修改腳本階段
進入到 Kaldi 的中文模型訓練路徑 ../kaldi-trunk/egs/thchs30/s5,咱們能夠看到以下內容:
首先,修改 cmd.sh 腳本,把原腳本註釋掉,修改成本地運行:
而後,修改 run.sh 腳本,主要修改以下:
-
n=8 #指定並行任務數
-
thchs=../chinese-data/thchs30-openslr #設定數據集位置
選定阿里巴巴 DFSMN 模型類型,添加以下內容到 run.sh 腳本最後:
-
# ## Traing FSMN models on the cleaned-up data
-
# ## Three configurations of DFSMN with different model size: DFSMN_S, DFSMN_M, DFSMN_L
-
local/nnet/run_fsmn_ivector.sh DFSMN_S
-
# local/nnet/run_fsmn_ivector.sh DFSMN_M
-
# local/nnet/run_fsmn_ivector.sh DFSMN_L
訓練模型階段
執行 ./run.sh,開始訓練模型,整個模型的訓練過程大約 2 天左右。
模型使用階段
最終訓練完畢的文件目錄以下:
進入到 exp 目錄,咱們會看到訓練出來的模型:
run.sh 腳本會訓練出 5 種模型:
- monophone 單音素模型是訓練單音子隱馬爾科夫模型,一共進行 40 次迭代;
- tri1 三音素模型是訓練與上下文相關的三音子模型;
- tri2b 模型用來進行線性判別分析和最大似然線性轉換;
- tri3b 模型用來訓練發音人自適應,基於特徵空間最大似然線性迴歸;
- tri4b 模型用來在現有特徵上訓練模型,它基於樹統計中的計數的重疊判斷的類似性來選擇舊模型中最接近的狀態。
注:筆者使用 GPU 訓練的模型,若是不使用 GPU,最終訓練不出 DNN 模型。
接下來咱們將使用 tri4b 模型,識別咱們提供的語音文件內容。
首先,拷貝 kaldi-trunk/egs/voxforge/online_demo 到 thchs30 下並重命名 online_demo_tri4b_ali,和 s5 同級;online_demo_tri4b_ali 新建 online-data 和 work 兩個文件夾;online-data 下新建 audio 和 models,audio 放要識別的 wav,models 新建 tri4b,最終目錄結構以下:
而後,將 s5/exp/tri4b 下的 final.alimdl、12.mat、final.mat、20.mdl拷貝到 models/tri4b,把 s5/exp/tri4/graph_word 裏面的 words.txt 和 HCLG.fst 也拷過去。
最終目錄結構:
最後,修改 run.sh 腳本,主要修改如下三部份內容:
-
ac_model_type=tri4b #使用的模型類型
-
online-gmm-decode-faster --rt-min=0.5 --rt-max=0.7 --max-active=4000 --beam=12.0 --acoustic-scale=0.0769 --left-context=3 --right-context=3 `$ac_model/final.alimdl $ac_model/HCLG.fst $ac_model/words.txt '1:2:3:4:5' $`trans_matrix;;
-
online-wav-gmm-decode-faster --verbose=1 --rt-min=0.8 --rt-max=0.85 --max-active=4000 --beam=12.0 --acoustic-scale=0.0769 --left-context=3 --right-context=3 scp:`$decode_dir/input.scp $ac_model/final.alimdl $ac_model/HCLG.fst $ac_model/words.txt '1:2:3:4:5' ark,t:$decode_dir/trans.txt ark,t:$decode_dir/ali.txt $`trans_matrix;;
修改完畢,上傳一段本身錄製的音頻到 online-data/audio 目錄,執行 ./run.sh,識別語音結果以下:
經過與語音源文對比後,發現準確率並無阿里說的 96.04%,這是爲何?
筆者從新研究了一下 DFSMN 模型的論文,以及到 GitHub 深扒了一下 DFSMN 源碼文件,發現阿里所說的準確率高到 96.04% 是創建在 5000 個小時訓練集基礎之上的,而咱們僅用了 30 個小時的訓練集。
因此,若是咱們想提升準確率,必須標註更多的語音文件,加大訓練集。
若是咱們已經成功地訓練出了模型,可進入到 s5/data/mfcc/train 目錄,查看 spk2utt 文件,以下:
紅色方框是不一樣說話人的標號,右邊的每行對應由該說話人錄音的文件。經過上圖,咱們能夠知道 Kaldi 工具不只幫咱們訓練了模型,還幫咱們識別出了有多少個錄音人,即說話人識別技術。
那 Kaldi 是怎麼作到的?接下來將從算法角度爲你們分享一下 Kaldi 的特徵提取技術。
語音特徵提取 MFCC 算法源碼解讀
MFCC(MeI-Freguency CeptraI Coefficients)是語音特徵參數提取方法之一,因其獨特的基於倒譜的提取方式,更加符合人類的聽覺原理,於是也是最爲廣泛、最有效的語音特徵提取算法。經過 MFCC,咱們能夠有效地區分出不一樣的人聲,識別不一樣的說話人。
MFCC 語音特徵的提取過程,以下圖:
預加劇
預加劇其實就是將語音信號經過一個高通濾波器,來加強語音信號中的高頻部分,並保持在低頻到高頻的整個頻段中,可以使用一樣的信噪比求頻譜。在本實驗中,選取的高通濾波器傳遞函數爲:
y(n)=x(n)−a∗x(n−1)y(n)=x(n)−a∗x(n−1)
aa 爲預加劇係數,咱們一般取 aa=0.97。預加劇部分源碼:
-
def pre_emphasis(signal, coefficient=0.97):
-
'''對信號進行預加劇'''
-
return numpy.append(signal[0], signal[1:] - coefficient * signal[:-1])
分幀
分幀是指在給定的音頻樣本文件中,按照某一個固定的時間長度分割,分割後的每一片樣本,稱之爲一幀。
分幀部分對應的源碼:
-
def audio2frame(signal, frame_length, frame_step, winfunc=lambda x: numpy.ones((x,))):
-
'''分幀'''
-
signal_length = len(signal)
-
frame_length = int(round(frame_length))
-
frame_step = int(round(frame_step))
-
if signal_length <= frame_length:
-
frames_num = 1
-
else:
-
frames_num = 1 + int(math.ceil((1.0 * signal_length - frame_length) / frame_step))
-
pad_length = int((frames_num - 1) * frame_step + frame_length)
-
zeros = numpy.zeros((pad_length - signal_length,))
-
pad_signal = numpy.concatenate((signal, zeros))
-
indices = numpy.tile(numpy.arange(0, frame_length), (frames_num, 1)) + numpy.tile(numpy.arange(0, frames_num * frame_step, frame_step),(frame_length, 1)).T
-
indices = numpy.array(indices, dtype=numpy.int32)
-
frames = pad_signal[indices]
-
win = numpy.tile(winfunc(frame_length), (frames_num, 1))
-
return frames * win
分幀是先將 N 個採樣點集合成一個觀測單位,也就是分割後的幀。一般狀況下 N 的取值爲 512 或 256,涵蓋的時間約爲 20~30ms。N 值和窗口間隔可動態調整。爲避免相鄰兩幀的變化過大,會讓兩相鄰幀之間有一段重疊區域,此重疊區域包含了 M 個取樣點,通常 M 的值約爲 N 的 1/2 或 1/3。
語音識別中所採用的信號採樣頻率通常爲 8kHz 或 16kHz。以 8kHz 來講,若幀長度爲 256 個採樣點,則對應的時間長度是 256/8000*1000=32ms。本次測試中所使用的採樣率爲 16kHz,窗長 37.5ms(600 個採樣點),窗間隔爲 10ms(160 個採樣點)。
加窗
在對音頻進行分幀以後,須要對每一幀進行加窗,以增長幀左端和右端的連續性,減小頻譜泄漏。比較經常使用的窗口函數爲 Hamming 窗。
假設分幀後的信號爲 S(n),n=0,1,2…,N−1S(n),n=0,1,2…,N−1,其中 NN 爲幀的大小,那麼進行加窗的處理爲:
W(n)W(n) 的形式以下:
不一樣的 aa 值會產生不一樣的漢明窗,通常狀況下 aa 取值 0.46。
加窗部分的源碼:
-
def deframesignal(frames, signal_length, frame_length, frame_step, winfunc=lambda x: numpy.ones((x,))):
-
'''加窗'''
-
signal_length = round(signal_length)
-
frame_length = round(frame_length)
-
frames_num = numpy.shape(frames)[0]
-
assert numpy.shape(frames)[1] == frame_length, '"frames"矩陣大小不正確,它的列數應該等於一幀長度'
-
indices = numpy.tile(numpy.arange(0, frame_length), (frames_num, 1)) + numpy.tile(numpy.arange(0, frames_num * frame_step, frame_step),(frame_length, 1)).T
-
indices = numpy.array(indices, dtype=numpy.int32)
-
pad_length = (frames_num - 1) * frame_step + frame_length
-
if signal_length <= 0:
-
signal_length = pad_length
-
recalc_signal = numpy.zeros((pad_length,))
-
window_correction = numpy.zeros((pad_length, 1))
-
win = winfunc(frame_length)
-
for i in range(0, frames_num):
-
window_correction[indices[i, :]] = window_correction[indices[i, :]] + win + 1e-15
-
recalc_signal[indices[i, :]] = recalc_signal[indices[i, :]] + frames[i, :]
-
recalc_signal = recalc_signal / window_correction
-
return recalc_signal[0:signal_length]
對信號進行離散傅立葉變換(DFT)
因爲信號在時域上的變換一般很難看出信號的特性,因此一般將它轉換爲頻域上的能量分佈來觀察,不一樣的能量分佈,表明不一樣語音的特性。因此在進行了加窗處理後,還須要再通過離散傅里葉變換以獲得頻譜上的能量分佈。對分幀加窗後的各幀信號進行快速傅里葉變換 FFT 獲得各幀的頻譜。並對語音信號的頻譜取模平方獲得語音信號的功率譜。
設語音信號的 DFT 爲:
能量的分佈爲:
在本次測試中,採用 DFT 長度 NN=512,結果值保留前 257 個係數。對應源碼以下:
-
def spectrum_magnitude(frames, NFFT = 512):
-
'''計算每一幀通過FFT變幻之後的頻譜的幅度,若frames的大小爲N*L,則返回矩陣的大小爲N*NFFT'''
-
complex_spectrum = numpy.fft.rfft(frames, NFFT)
-
return numpy.absolute(complex_spectrum)
-
def spectrum_power(frames, NFFT):
-
'''計算每一幀傅立葉變換之後的功率譜'''
-
return 1.0 / NFFT * numpy.square(spectrum_magnitude(frames, NFFT))
Mel 濾波器組
MFCC 考慮人類的聽覺特徵,先將線性頻譜映射到基於聽覺感知的 Mel 非線性頻譜中,而後轉換到倒譜上。在 Mel 頻域內,人對音調的感知度爲線性關係。舉例來講,若是兩段語音的 Mel 頻率相差兩倍,則人耳聽起來二者的音調也相差兩倍。Mel 濾波器的本質實際上是一個尺度規則:一般是將能量經過一組 Mel 尺度的三角形濾波器組,如定義有 MM 個濾波器的濾波器組,採用的濾波器爲三角濾波器,中心頻率爲 f(m),m=1,2…Mf(m),m=1,2…M,MM 一般取 22~26。f(m)f(m)之間的間隔隨着 mm 值的減少而縮小,隨着 mm 值的增大而增寬,如圖所示:
從頻率到 Mel 頻率的轉換公式爲:
其中 ff 爲語音信號的頻率,單位赫茲(Hz)。
-
def hz2mel(hz):
-
'''把頻率 hz 轉化爲梅爾頻率'''
-
return 2595 * numpy.log10(1 + hz / 700.0)
-
def mel2hz(mel):
-
'''把梅爾頻率轉化爲 hz'''
-
return 700 * (10 ** (mel / 2595.0) - 1)
將頻率映射到最接近的 DFT 頻率:
對應源碼以下:
-
def get_filter_banks(filters_num=20, NFFT=512, samplerate=16000, low_freq=0, high_freq=None):
-
'''計算梅爾三角間距濾波器,該濾波器在第一個頻率和第三個頻率處爲 0,在第二個頻率處爲 1'''
-
low_mel = hz2mel(low_freq)
-
high_mel = hz2mel(high_freq)
-
mel_points = numpy.linspace(low_mel, high_mel, filters_num + 2)
-
hz_points = mel2hz(mel_points)
-
bin = numpy.floor((NFFT + 1) * hz_points / samplerate)
-
fbank = numpy.zeros([filters_num, NFFT / 2 + 1])
-
for j in xrange(0, filters_num):
-
for i in xrange(int(bin[j]), int(bin[j + 1])):
-
fbank[j, i] = (i - bin[j]) / (bin[j + 1] - bin[j])
-
for i in xrange(int(bin[j + 1]), int(bin[j + 2])):
-
fbank[j, i] = (bin[j + 2] - i) / (bin[j + 2] - bin[j + 1])
-
return fbank
對頻譜進行離散餘弦變換(DCT)
使⽤離散餘弦變換,進⾏⼀個傅⽴葉變換的逆變換,獲得倒譜系數。
由此能夠獲得 26 個倒譜系數。只取其 [2:13] 個係數,第 1 個用能量的對數替代,這 13 個值即爲所需的 13 個 MFCC 倒譜系數。
-
def lifter(cepstra, L=22):
-
'''升倒譜函數'''
-
if L > 0:
-
nframes, ncoeff = numpy.shape(cepstra)
-
n = numpy.arange(ncoeff)
-
lift = 1 + (L / 2) * numpy.sin(numpy.pi * n / L)
-
return lift * cepstra
-
else:
-
return cepstra
動態差分參數的提取(包括一階差分和二階差分)
標準的倒譜參數 MFCC 只反映了語音參數的靜態特性,語音的動態特性能夠用這些靜態特徵的差分譜來描述。實驗證實:把動、靜態特徵結合起來纔能有效提升系統的識別性能。
差分參數的計算能夠採用下面的公式:
上式中,dtdt 表示第 tt 個一階差分,CtCt 表示第 tt 個倒譜系數,QQ 表示倒譜系數的階數,KK 表示一階導數的時間差,可取 1 或 2。
對應源碼:
-
def derivate(feat, big_theta=2, cep_num=13):
-
'''計算一階係數或者加速係數的通常變換公式'''
-
result = numpy.zeros(feat.shape)
-
denominator = 0
-
for theta in numpy.linspace(1, big_theta, big_theta):
-
denominator = denominator + theta ** 2
-
denominator = denominator * 2
-
for row in numpy.linspace(0, feat.shape[0] - 1, feat.shape[0]):
-
tmp = numpy.zeros((cep_num,))
-
numerator = numpy.zeros((cep_num,))
-
for t in numpy.linspace(1, cep_num, cep_num):
-
a = 0
-
b = 0
-
s = 0
-
for theta in numpy.linspace(1, big_theta, big_theta):
-
if (t + theta) > cep_num:
-
a = 0
-
else:
-
a = feat[row][t + theta - 1]
-
if (t - theta) < 1:
-
b = 0
-
else:
-
b = feat[row][t - theta - 1]
-
s += theta * (a - b)
-
numerator[t - 1] = s
-
tmp = numerator * 1.0 / denominator
-
result[row] = tmp
-
return result
⾄此,咱們計算獲得了⾳頻⽂件每⼀幀的 39 個 Mel 頻率倒譜系數(13 個 MFCC + 13 個一階微分系數 + 13 個加速係數),這些做爲語音文件的特徵數據,能夠運用在以後的分類中。
語音識別工具對比
隨着近幾年國內、國外語音識別技術的發展,脫穎而出幾款十分受歡迎的開源語音識別工具,這其中包括 CMUSphinx、HTK、Julius、Kaldi 和 RWTH ASR。
- CMUSphinx 是卡內基梅隆大學開發的一組語音識別系統的總稱,包括一系列語音識別器(Sphinx 2~4)和聲學模型訓練器(SphinxTrain)。在 GitHub 平臺有 C 和 Java 兩個版本,下載地址:https://github.com/cmusphinx。
- HTK 最初是在劍橋大學工程系(CUED)的機器智能實驗室(之前稱爲語音視覺和機器人小組)開發的,HTK 除了做爲處理 HMM 的專有軟件工具包,還可做爲語音合成,字符識別和 DNA 測序。HTK 如今並非一款嚴格意義的開源工具,以前一直做爲商業化軟件,後來又迴歸到劍橋大學。HTK 工具更新緩慢,官方文檔地址:http://htk.eng.cam.ac.uk/。
- Julius 起源於 1997 年,一開始做爲日本 LVCSR 研究的免費軟件工具包的一部分而開發,目前 GitHub 平臺由 3 位開發人員維護,最近一次更新在 2 年前,地址: https://github.com/julius-speech/julius。
- RWTH ASR 由 RWTH Aachen University 人類語言技術和模式識別小組開發,包括用於開發聲學模型和解碼器的工具,以及用於說話者適應、說話者自適應訓練、無監督訓練、判別訓練和字格處理的組件。RWTH ASR 項目並無掛載到 GitHub,而是放在了學校本身的平臺,下載地址:http://www-i6.informatik.rwth-aachen.de/rwth-asr/。
接下來,讓咱們看一下維基百科對幾款主流開源工具(HTK 非開源)的對比圖:
經過對比圖咱們能夠發現, 這些工具大多都是以隱馬爾可夫模型(HMM)和神經網絡(Neural net)模型爲核心,底層編程語言以 C、C++ 爲主,實現語音轉文本功能。
咱們本次 Chat 講的 Kaldi 基於 Neural net,隸屬於 Apache 基金會,可部署在 Windows、Linux、MacOS 平臺。Kaldi 工具底層經過 C++ 編程語言實現,目前對外也提供了 Python 接口,支持在線、離線兩種狀態的語音識別。
接下來,咱們從 GitHub 社區活躍度橫向對比 CMUSphinx、Julius、Kaldi 這三款受歡迎程度。
- star:關注別人項目人數
- fork:建立源項目代碼庫的分支並拷貝到本身的帳號的人數
經過這兩項指標的對比,咱們能夠很明顯地發現,Kaldi 的社區活躍度明顯高於其它的項目,受到了廣大開發者的喜好。另外,Kaldi 官方提供了完整的開發文檔(可看前文有連接)並不按期地更新,爲開發者提供更大的自由度以及更低的開發成本,所以在開發圈始終保持着強大的生命力。
【彩蛋】目前國內免費已經標註好的中文語料集(音頻 + 含音調、音素的文本數據)也僅限於清華大學標註的 30 個小時語料集。筆者在業餘時間,本身標註了一批關於高校信息的語料集,下載地址以下:https://pan.baidu.com/s/1e63akjTgk0Ef7oXNRHtc4w,密碼 g6af。