1. 程式人生 > >Kaldi知識點彙集

Kaldi知識點彙集

特徵提取

MFCC

compute-mfcc-feats.cc

Create MFCC feature files.
Usage:  compute-mfcc-feats [options...] <wav-rspecifier> <feats-wspecifier>

其中引數rspecifier用於讀取.wav檔案,wspecifier用於寫入得到的MFCC特徵。典型應用中,特徵將被寫入到一個大的”archive”檔案,同時會寫入一個”scp”檔案用於隨機存取。該程式並未提取delta特徵(add-delats.cc).
其–channel引數用於選擇立體聲情況(–channel=0, –channel=1).

compute-mfcc-feats --config=conf/mfcc.conf \
   scp:exp/make_mfcc/train/wav1.scp    \
   ark:/data/mfcc/raw_mfcc_train.1.ark;

第一個引數”scp:…”用於讀取exp/make_mfcc/train/wav1.scp指定的檔案。第二個引數”ark:…”指示計算得到的特徵寫入歸檔檔案/data/mfcc/raw_mfcc_train.1.ark。歸檔檔案裡的每一句是N(frames)× N(mfcc)的特徵矩陣。
MFCC特徵的計算是在物件MFCC中的compute方法完成的,計算過程如下:
1.遍歷每一幀(通常25ms一幀,10ms滑動)
2.對每一幀
a.提取資料,新增可選擾動,預加重和去直流,加窗
b.計算該點的能量(使用對數能量,而非C0)
c.做FFT並計算功率譜
d.計算每個梅爾頻點的能量,共計23個重疊的三角頻點,中心頻率根據梅爾頻域均勻分佈。
e.計算對數能量,做離散餘弦變換,保留指定的係數個數
f.倒譜系數加權,確保係數處於合理的範圍。

三角梅爾頻點的上下限由–low-freq和–high-freq決定,通常被分別設定成接近0和奈奎斯特頻率。如對於16KHz語音–low-freq=20, –high-freq=7800。
可以使用copy-feats.cc將特徵轉換成其它格式。

倒譜均值和方差歸一化

該歸一化通常是為了獲得基於說話人或者基於說話語句的零均值,單位方差歸一化特徵倒譜。但是並不推薦使用這個方法,而是使用基於模型的均值和方差歸一化,如Linear VTLN(LVTLN)。可以使用基於音素的小語言模型進行快速歸一化。特徵提取程式碼compute-mfcc-feats.cc/compute-plp-feats.cc同樣提供了–substract-mean選項獲得零均值特徵。如果要獲得基於說話人或者基於句子的均值和方差歸一化特徵,可以使用
compute-cmvn-states.cc或者apply-cmvn.cc程式。
compute-cmvn-stats.cc將會計算均值和方差需要的所有統計量,並將這些統計資訊以矩陣的形式寫入到table中。

compute-cmvn-stats 
          --spk2utt=ark:data/train/train.1k/spk2utt \
          scp:data/train.1k/feats.scp \
          ark:exp/mono/cmvn.ark;

單音素訓練

初始化單音素模型

-gmm-init-mono.cc
該程式有兩個輸入和兩個輸出。做為輸入,需要描述聲學模型的HMM音素結構的拓撲檔案(如data/lang/topo)和高斯混合模型中每個分量的維度。

gmm-init-mono data/lang/topo \
              39 \
              exp/mono/0.mdl \
              exp/mono/tree;

在這個例子中tree是語境決策樹。

-compile-train-graphs.cc
假設我們已經得到了決策樹和模型。接下來的命令建立訓練集對應的HCLG圖歸檔檔案。該程式為每一個訓練語句編譯FST。

compile-train-graphs  exp/mono/tree \
                      exp/mono/0.mdl \
                      data/L.fst \
                      ark:data/train.tra \
                      ark:exp/mono/graphs.fsts;

train.tra是訓練集的索引檔案,該檔案每一行的第一個欄位是說話人ID。該程式的輸出是graphs.fsts;其為train.tra中的每句話建立一個二進位制格式的FST。該FST和HCLG對應,差異在於沒有轉移概率不在裡面。這是因為該圖將在訓練中被多次用到且轉移概率也將會發生變化,所以後面才會加上轉移概率。但是歸檔的FST中包含了silence的概率(編碼到L.fst)。解碼圖就是HCLG=HCLG
1.H包括了HMM定義;輸出符號是上下文無關的音素,輸入符號是一系列狀態轉變ID(是概率id和其它資訊的編碼)。
2.C代表的是上下文依賴關係。其輸出代表音素的符號,輸入是代表上下文相關的音素符號;
3.L是字典(Lexicon);輸出是單詞,輸入是一系列音素。
4.G表示的是Grammar;是語音模型的有限狀態機。

由於訓練時候不要進行符號消歧義,所以圖建立要比測試時簡單,訓練和測試使用HCLG形式上是一樣的,不同在於,訓練時G僅僅包括和訓練文集相關的一個線性接收器。
同樣希望HCLG具有隨機性,傳統方法使用“push-weights”方法。

訓練單音素模型

-align-equal-compiled.cc
給定聲學模型/圖rspecifier/特徵rspecifier。這個程式會返回用於對齊的wspecifier。這是EM演算法中的E步驟(EM演算法見http://blog.csdn.net/shichaog/article/details/78415473)。對齊是整數向量。

align-equal-compiled 0.mdl \
                     graphs.fsts \
                     scp:train.scp \
                     ark:equal.ali; 

如果要檢視對齊結果,可以使用show-alignments.cc程式檢視。

-gmm-acc-stats-ali.cc
這個程式有三個輸入:1.編譯好的聲學模型(0.mdl);2.訓練用的音訊檔案特徵(MFCC,train.scp)3.先前計算的隱藏狀態的對齊資訊。輸出檔案是GMM訓練用的狀態集(0.acc)。

gmm-acc-stats-ali 0.mdl \
                  scp:train.scp \
                  ark:equal.ali \
                  0.acc

-gmm-test.cc
這是EM演算法的M步驟,給定1.聲學模型; 2.GMM訓練狀態集,這個程式將會輸出新的聲學模型(經過ML估計更新)。

gmm-test --min-gaussian-occupancy=3 \
         --mix-up=250 \
         exp/mono/0.mdl \
         exp/mono/0.acc \
         exp/mono/1.mdl;

引數--mix-up指定了新的混合高斯模型成分的數量。
當訓練資料量小時,--min-gaussian-occupancy需要指定以處理少見的音素。

音素和資料對齊

-gmm-align-compiled.cc
給定1.聲學模型;2.圖的rspecifier;3.特徵的rspecifier。該程式返回對齊的wspecifier。這是EM演算法中的E步驟。對齊是指HMM狀態和提取的語音特徵向量關係。每一個HMM狀態有一個高斯分佈輸出,對齊後的特徵向量會被用於高斯引數更新(μ).

gmm-align-compiled 1.mdl \
                    ark:graphs.fsts \
                    scp:train.scp \
                    ark:1.ali;

三音素訓練

上下文相關音素決策數構建

CART(Clustering and Regression Tree).

-acc-tree-stats.cc
該程式有三個輸入引數1.聲學模型,2.聲學特徵的rspecifier,3.前一次對齊的rspecifier。返回值是樹累積量。
該程式不僅能處理單音素對齊,也能處理基於上下文關係的對齊(如三音素),構建樹需要的統計量被以BuildTreeStatsType型別寫入磁碟,函式AccumulateTreeStats()接收P和N。命令列程式會將P和N預設設定成3和1,但是可以使用--context-with--central-position選項進行更改。acc-tree-stats.cc接收一系列上下文無關音素(如,silence),這可以減少統計量的數目。

acc-tree-stats final.mdl \
               scp:train.scp \
               ark:JOB.ali   \
               JOB.treeacc;

-sum-tree-statics.cc
該程式為音素樹構建求和統計量,該程式輸入多個*.treeacc檔案,輸出單個累積後統計量(如treeacc)。

sum-tree-stats  treeacc \
                phonesets.int \
                questions.int;

-compile-questions.cc
該程式的輸入是1.HMM拓撲(如,topo),2.音素列表(如,questions.int),返回EventMap(如phonesets.qst)中“key”對應問題的C++物件表示的音素列表。

compile-questions data/lang/topo \
                  exp/triphones/questions.int \
                  exp/triphones/questions.qst;

-build-tree.cc
當統計量累積後可以使用build-tree.cc構建樹。其有三個輸入引數:1.累積的樹統計量(treeacc),2.問題配置(questions.qst),3.根檔案(roots.int)。
樹統計量使用程式acc-tree-stats.cc求得,問題配置使用程式compile-questions.cc求得,cluster-phones.cc求得音素問題拓撲列表。
build-tree建立了一系列決策樹,最大葉子節點數(如2000)是概率數量,在分割之後,對每一顆樹會做後聚類。共享的葉子的作用域在單棵樹內。

build-tree treeacc \
           roots.int \
           questions.qst \
           topo    \
           tree;

可以使用程式draw-tree.cc檢視決策樹。

draw-tree data/lang/phones.txt \
          exp/mono/tree | \
          dot -Tps -Gsize=8,10.5 | \
          ps2pdf - ~/tree.pdf

-gmm-init-model.cc
根據1.決策樹(tree),2.累積樹狀態(treeacc),3.HMM拓撲(topo)來初始化GMM聲學模型(1.mdl)。

gmm-init-model tree \
               treeacc \
               topo   \
               1.mdl;

-gmm-mixup.cc
根據1.高斯聲學模型(1.mdl),2.每個狀態轉變ID出現次數,做高斯合併操作,返回的高斯聲學模型(2.mdl)的分量數會增加。

gmm-mixup --mix-up=$numgauss \
          1.mdl  \
          1.occs   \
          2.mdl

-convert-ali.cc
根據1.舊的GMM模型(monophones_aligned/final.mdl),2.新的GMM模型(triphones_del/2.mdl),3.新的決策樹(triphones_del/tree),4.就的對齊的rspecifier(monophones_aligned/ali..gz),該程式將返回新的對齊(triphones_del/ali..gz)。

convert-ali monophones_aligned/final.mdl \
            triphones_del/2.mdl    \
            triphones_del/tree     \
            monophones_aligned/ali.*.gz  \
            triphones_del/ali.*.gz   

-compile-train-graphs.cc
給定輸入1.決策樹(tree),2.聲學模型(2.mdl),3.字典的有限狀態轉換器(L.fst),4.訓練文字集的rspecifier(text)將輸出訓練圖的wspecifier(fsts.*.gz)。

compile-train-graphs tree \
                     1.mdl \
                     L.fst \
                     text  \
                     fsts.*.gz;

貝葉斯準則

p(|)=p(|)p()p()
其中p()的概率源於語言模型(如n-gram)
p(|)是根據訓練資料集得到的統計模型。
要找到語音對應句子,就是找p(|)概率最大的句子。

WFST關鍵點

1.determinization
2.minimization
3.composition
4.equivalent
5.epsilon-free
6.functional
7.on-demand algorithm
8.weight-pushing
9.epsilon removal

HMM關鍵點

1.Markov Chain
2.Hidden Markov Model
3.Forward-backward algorithm
4.Viterbi algorithm
5.E-M for mixture of Gaussians

L.fst 發音字典FST

L將單音素序列對映到單詞。
檔案L.fst是根據音素符號序列獲得單詞序列的有限狀態轉換器。
這裡寫圖片描述
這裡寫圖片描述

聚類機制

類GaussClusterable(高斯統計量)繼承了純虛類Clusterable。未來會加入從Clusterable類繼承來的可以聚類物件的處理。Clusterable 存在的目的是使用通用聚類演算法。
Clusterable的核心思想是將統計量相加,然後評測目標函式,兩個可以聚類物件的距離是指兩個物件各自目標函式和他們相加之後目標函式帶來的影響。
Clusterable類相加的例項有混合高斯統計量的高斯模型,離散觀測量的計數值。
獲得Clusterable*物件的例項如下:

Vector<BaseFloat> x_stats(10), x2_stats(10);
BaseFloat count = 100.0, var_floor = 0.01;
// initialize x_stats and x2_stats e.g. as
// x_stats = 100 * mu_i, x2_stats = 100 * (mu_i*mu_i + sigma^2_i)
Clusterable *cl = new GaussClusterable(x_stats, x2_stats, var_floor, count);

聚類演算法

聚類函式如下:
- ClusterBottomUp
- ClusterBottomUpCompartmentalized
- RefineClusters
- ClusterKMeans
- TreeCluster
- ClusterTopDown
常用到的資料型別是:

std::vector<Clusterable*> to_be_clustered;

K-means及其類似演算法介面

聚類程式碼呼叫例項如下:

std::vector<Clusterable*> to_be_clustered;
// initialize "to_be_clustered" somehow ...
std::vector<Clusterable*> clusters;
int32 num_clust = 10; // requesting 10 clusters
ClusterKMeansOptions opts; // all default.
std::vector<int32> assignments;
ClusterKMeans(to_be_clustered, num_clust, &clusters, &assignments, opts);

ClusterBottomUp() 和ClusterTopDown()和ClusterKMeans()的呼叫方法類似,如果聚類的數量較大,ClusterTopDown()比ClusterKMeans()更高效。