CSND已永久停更,最新版唯一來源點擊下面鏈接跳轉:
語音增強和語音識別網頁書
##可能遇到的工具問題
gsc@X250:~/kaldi/egs/timit/s5$ ./run.sh
==============================
Data & Lexicon & Language Preparation
==============================
wav-to-duration --read-entire-file=true scp:train_wav.scp ark,t:train_dur.ark
LOG (wav-to-duration[5.2.18~1-7fa5f]:main():wav-to-duration.cc:92) Printed duration for 3696 audio files.
LOG (wav-to-duration[5.2.18~1-7fa5f]:main():wav-to-duration.cc:94) Mean duration was 3.06336, min and max durations were 0.91525, 7.78881
awk: line 12: function gensub never defined
gsc@X250:~/kaldi/egs/timit/s5$ sudo apt-get install gawk
local/timit_prepare_dict.sh: Error: the IRSTLM is not available or compiled
圖1
然後將當前目錄生成的env.sh
拷貝到/kaldi/tools/
,這麼做是可以看path.sh
文件裏指明瞭irstlm工具的路徑。
如果是單機訓練,則cmd.sh
按如下方式修改:
圖2
run.sh也要進行修改,修改timit數據所在目錄,和jobs數量
##聲學模型參數
numLeavesTri1=2500
numGaussTri1=15000
numLeavesMLLT=2500
numGaussMLLT=15000
numLeavesSAT=2500
numGaussSAT=15000
numGaussUBM=400
numLeavesSGMM=7000
numGaussSGMM=9000
kaldi聲學模型代碼的設計哲學是,支持傳統的聲學模型(如, diagonal GMMs 和Subspace Gaussian Mixture Models),但是也容易擴展到新的聲學模型,如DNN。
###高斯模型
####協方差矩陣
均值爲,方差爲的概率密度函數分佈特徵如下圖:
圖 3高斯概率密度函數
單高斯分佈的方差爲
方差可用於解釋對應特徵空間軸上數據分佈。如下圖:
圖4協方差數據的座標表示
可以計算沿着軸的方差和軸的方差。然而沿着x軸或者y軸並不能很好的描述對角互相關關係。上圖中,x和y是有關係的,當x增大時,y也增大,這以關係可以由協方差來表示:
對於二維數據,可以得到,這四個值可以使用矩陣來表示:
如果x,y互爲正相關,也就是。這協方差矩陣關於主對角線對稱。
圖5協方差矩陣決定了數據的形狀,對角範圍有協方差決定,軸向範圍由方差決定
如上圖可以知道,協方差矩陣定義了範圍(方差)和方向(協方差),所以可以使用向量來表示數據關係。根據特徵值和特徵相關的關係:
其中是特徵向量,是對應的特徵向量。紅色和綠色是特徵向量。
圖6協方差矩陣的特徵向量
如果非對角協方差矩陣,則有:
圖7協方差和方差對比圖
####協方差矩陣做爲線性變換
圖5可以看成是圖8的變換。
圖8單位協方差矩陣稱爲白數據。
設圖8中的協方差是,則圖5中的矩陣可以通過線性變換得到:
其中是旋轉矩陣和縮放矩陣的組合。
是旋轉角度,
和分別是x和y軸的縮放因子。
####單高斯多維分佈(single GaussianModel, SGM)
其中,是維度爲的樣本向量,是期望,是協方差。
。對一段語音將使用25ms窗長,以10ms爲滑動窗長,那麼按時間將得到一系列的數據:$(0-10ms), (10ms-20ms),(20ms-30ms)… $,對於元音頻域(STFT)裏其共振峯可以做爲有效的信息,這樣可以降低高斯分佈的維度,對上述的每段語音使用MFCC方法來表徵語音的特徵。
MFCC
設輸入語音數據是8KHz或者16KHz,對信號進行與加重(-6dB/十倍頻衰減),對信號加小噪聲(dither算法)。取25ms窗長,以10ms滑動一次,乘以窗函數(如hamming),做傅里葉變換,爲每一個拼點取對數,按頻率軸做梅爾縮放,做離散餘弦變換獲得“導譜”,每個頻率成分按三角窗窗平滑,保留導譜的前13個係數,
將某一個觀測樣本的觀測值帶入上式後,可以認爲概率最高的,就是那個類,也就是對應的發音。
對於同一段語音,同一個人說幾次,每次發音都有細微的差別,但是是趨於高斯分佈的,也就是在範圍內是絕大多數發音情況,這時就可以使用高斯分佈來描述這一分佈特徵了,也就是前文提到的SGM模型,然而當要對多個說話人識別時,比如,男人,女人,小孩,他們的發音特徵均值是不一樣的,這時使用SGM並不合適,如果給每個類型語音分配一個SGM。然後根據訓練語料給每個SGM分配一個權重再將其混合,就會得到使用高斯混合模型來描述語音。
####高斯混合模型(Gaussian Mixture Model,GMM)
圖3給出的高斯模型有一個峯值,然而實際中要分類的特徵並不一定是單峯值的,(如,人的發音就有諧振峯存在),那怎麼模擬這麼多的峯值呢?使用高斯混合模型,將多個單高斯模型加在一起,(通常3~5個),這樣就可以表示具有多個峯值分佈的特徵問題了。
其是M個單高斯多維分佈的加權和,第j個SGN的權重爲。
令,GMM共有M個SGM,則需要根據樣本集來估計GMM的所有參數,
通常使用EM(expactation maximum)算法對GMM參數估計。
1.初始化
協方差矩陣設爲單位矩陣,每個模型比例的鮮豔概率;均值設爲隨機數。由於期望EM迭代過程對初始值敏感,通常採用k均值聚類算法進行初始化。
2.估計步驟
則數據集上參數的估計如下:
根據貝葉斯準則,使用後驗概率進行估計參數:
令的後驗概率爲:
3.最大化步驟
更新權值
更新方差
4.收斂條件
重複2,3,直到
####如何根據音頻文件,轉換成對應的文本
將使用統計模型,根據給定的訓練數據集,訓練該數據集對應的統計模型,該模型將爲句子-發音對分配概率,這樣當給定發音文件時,就可以譯碼成最有可能的句子。
數據準備
訓練數據集要求是經過標註過的,訓練數據集合要包括測試集合的所有發音。還要準備對應的發音字典,發音字典每個條目都是單詞-音素序列對,音素序列表示的是單詞的發音,這裏的音素只是一種記號。此外,還需要一些文本進行語言模型訓練。
訓練數據
LDC數據集合需要錢,發音字典有免費的,如CMUDict。如果是數百小時的語音數據訓練集合,則最好在集羣服務器上訓練。
##生成MFCC特徵
gsc@X250:~/kaldi/egs/yesno/s5$ head -5 exp/make_mfcc/train_yesno/make_mfcc_train_yesno.1.log
# compute-mfcc-feats --verbose=2 --config=conf/mfcc.conf scp,p:exp/make_mfcc/train_yesno/wav_train_yesno.1.scp ark:- | copy-feats --compress=true ark:- ark,scp:/home/gsc/kaldi/egs/yesno/s5/mfcc/raw_mfcc_train_yesno.1.ark,/home/gsc/kaldi/egs/yesno/s5/mfcc/raw_mfcc_train_yesno.1.scp
# Started at Sat Jun 17 18:55:58 CST 2017
#
copy-feats --compress=true ark:- ark,scp:/home/gsc/kaldi/egs/yesno/s5/mfcc/raw_mfcc_train_yesno.1.ark,/home/gsc/kaldi/egs/yesno/s5/mfcc/raw_mfcc_train_yesno.1.scp
compute-mfcc-feats --verbose=2 --config=conf/mfcc.conf scp,p:exp/make_mfcc/train_yesno/wav_train_yesno.1.scp ark:-