• 沒有找到結果。

語音參數產生演算法

第二章 文獻回顧

2.2 基於隱藏式馬可夫模型之語音合成

2.2.4 語音參數產生演算法

在本章節中,我們將探討語音參數產生之演算法。由上述章節我們得知語 音參數向量可以由聲學模型λ來描述,假設其聲學模型λ之平均值為 M,其平方 差為 U,且狀態序列為已知,故語音參數向量會以圖(十一)表示:

圖(十一):以聲學模型λ繪製之語音參數向量示意圖

從圖(十一)當中我們觀察到如果直接以聲學模型之平均值與平方差作為其 語音參數向量的話,不同狀態之間會因為其平均值與平方差的不同而有了數值 上的落差,而當不同的聲學模型相連接時,可能會導致極大的落差產生,這違反 語音訊號為一段連續不中斷的訊號的認知。由於聲音訊號的特性,我們推測與 聲音訊號直接相關的頻譜(即為語音參數向量)亦有此一連續不中斷的特性,故我 們無法直接使用聲學模型來產生聲音訊號的頻譜。在 2000 年時,日本學者提出 了語音參數產生演算法[59],該演算法能夠在給與聲學模型λ的情況下,找出一

41

條平緩(Smooth)的聲音參數曲線。

在該演算法當中,我們將聲音參數產生問題分成三種情況討論:

情況一:給定聲學模型λ與狀態序列 Q,最大化其觀察序列 O 之機率,即最大化 𝑃(𝑂|𝑄, 𝜆)。

情況二:給定聲學模型λ,最大化其觀察序列 O 與狀態序列 Q 之機率,即最大 化𝑃(𝑂, 𝑄|𝜆)。

情況三:給定聲學模型λ,最大化其觀察序列 O 之機率,即最大化𝑃(𝑂|𝜆)。

在我們進入探討之前,我們假設一個觀察值𝑜𝑡是由其特徵向量𝑐𝑡之靜態與一 階動差、二階動差所組成,即

𝑜𝑡 = {𝑐𝑡, Δ𝑐𝑡, Δ2𝑐𝑡} (63) 而一階動差與二階動差的計算方式為:

Δ𝑐𝑡= ∑ 𝑤(1)(𝜏)𝑐𝑡+𝜏

𝐿(1)+

𝜏=−𝐿(1)

(64)

Δ2𝑐𝑡= ∑ 𝑤(2)(𝜏)𝑐𝑡+𝜏

𝐿+(2)

𝜏=−𝐿(2)

(65)

 情況一之探討:

在情況一當中,我們已知其聲學模型λ與狀態序列 Q,故𝑃(𝑂|𝑄, 𝜆)可以寫為

log 𝑃(𝑂|𝑄, 𝜆) = ∑ log 𝑏𝑞𝑡(𝑜𝑡)

𝑇

𝑡=1

(66)

又𝑏𝑞𝑡(𝑜𝑡)可定義成:

42

𝑏𝑗(𝑜𝑡) = 𝒩(𝑐𝑡; 𝜇𝑗, 𝑈𝑗) ∙ 𝒩(Δ𝑐𝑡; Δ𝜇𝑗, Δ𝑈𝑗) ∙ 𝒩(Δ2𝑐𝑡; Δ2𝜇𝑗, Δ2𝑈𝑗) (67) 從式(63)至(65)中,我們可以推得

𝑂 = 𝑊𝐶 (68)

其中 C 表示特徵向量𝑐𝑡之序列,而 W 為權重𝑤𝑡 = {𝑤𝑡(0), 𝑤𝑡(1), 𝑤𝑡(2)}所組成之序 列。

因此式(66)可重寫成

log 𝑃(𝑂|𝑄, 𝜆) = −1

2𝑂T𝑈−1𝑂 + 𝑂T𝑈−1𝑀 + 𝐾 (69) 其中𝑈為平方差矩陣,𝑀為平均值矩陣。

由於本問題之目標為尋找一條最佳特徵序列 C 使得式(69)產生最大值,故

我們可藉由對式(69)進行微分並令其為 0 來獲得其最大值,即

∂ log 𝑃(𝑂|𝑄, 𝜆)

∂C = 0 (70)

將式(70)進行化簡後便可得到式(71)

𝑊T𝑈−1𝑊𝐶 = 𝑊T𝑈−1𝑀T (71) 式(71)當中的 C 可以藉由喬萊斯基分解(Cholesky Decomposition)獲得。

 情況二之探討:

在情況二當中,我們更進一步只使用聲學模型λ來最大化其觀察序列 O 與狀 態序列 Q 之機率,此時我們利用貝式定理來轉換我們的問題:

𝑃(𝑂, 𝑄|𝜆) = 𝑃(𝑞|𝜆)𝑃(𝑂|𝑞, 𝜆) (72) 其中 q 為 Q 當中的一條狀態子序列。

43

從式(72)當中我們得知,若我們能使用聲學模型𝜆產生一條狀態序列 q,則 情況二之問題便可以簡化為情況一。

在語音合成當中,我們藉由合成語句可以得到音素之組合,此時我們假設 每個狀態的機率分布皆為一維的高斯機率分布,因此𝑃(𝑞|𝜆)可當作給予一個聲 學模型𝜆產生其狀態長度序列 D 之機率,即𝑃(𝐷|𝜆)。現在我們假設每個狀態之間 的長度皆為獨立,因此將𝑃(𝐷|𝜆)取對數後,便得到式(73)

log 𝑃(𝐷|𝜆) = ∑ log 𝑝𝑛(𝑑𝑛)

𝑁

𝑛=1

(73)

其中,𝑝𝑛(𝑑𝑛)為其第 n 個狀態為長度𝑑𝑛之機率。現在我們假設狀態 n 會進行 d 次之自循環(Self-Loop),因此𝑝𝑛(𝑑)之分布為

log 𝑃(𝑞|𝜆) = 𝑎𝑛𝑛𝑑 ∙ (1 − 𝑎𝑛𝑛) (74) 因此,我們使用式(74)來最大化式(73)會得到

𝐷̅ = arg max

𝐷

log 𝑃(𝐷|𝜆) = {1,1, ⋯ ,1} (75)

式(75)表示每個狀態皆只會重複一次即進入下一個狀態,而這情況與明顯與我們 說話時的習慣不同;在自然語流當中,每個音素應該皆有不同的發音長度。為了 避免此情況的產生,我們使用一維的高斯機率分布來額外對時間長度進行建模,

而我們將第 j 個狀態的平均值𝜉𝑗與平方差𝜎𝑗定義為:

𝜉𝑗 =∑𝑇𝑡0=1𝑇𝑡1=𝑡0𝜒𝑡0,𝑡1(𝑗) ∙ (𝑡1− 𝑡0+ 1)

𝑇𝑡0=1𝑇𝑡1=𝑡0𝜒𝑡0,𝑡1(𝑗) (76) 𝜎𝑗 = ∑𝑇𝑡0=1𝑇𝑡1=𝑡0𝜒𝑡0,𝑡1(𝑗) ∙ (𝑡1− 𝑡0+ 1)2

𝑇𝑡0=1𝑇𝑡1=𝑡0𝜒𝑡0,𝑡1(𝑗) − 𝜉𝑗2 (77) 其中𝜒𝑡0,𝑡1(𝑗)為第 j 個狀態在時間𝑡0到時間𝑡1之佔有機率,即式(78)

44

45

其中 U 為變異數矩陣,M 為平均值矩陣。

𝑈−1

̅̅̅̅̅ = diag[𝑈̅̅̅̅̅, 𝑈1−1 ̅̅̅̅̅, ⋯ , 𝑈2−1 ̅̅̅̅̅] 𝑇−1 (82) 𝑈𝑡−1

̅̅̅̅̅ = ∑ 𝛾𝑡(𝑞, 𝑖)𝑈𝑞,𝑖−1

𝑞,𝑖

(83) 𝑈−1𝑀

̅̅̅̅̅̅̅̅ = [𝑈̅̅̅̅̅̅̅̅, 𝑈1−1𝜇1 ̅̅̅̅̅̅̅̅, ⋯ , 𝑈2−1𝜇2 ̅̅̅̅̅̅̅̅̅]𝑇−1𝜇𝑇 T (84) 𝑈̅̅̅̅̅̅̅̅ = ∑ 𝛾𝑡−1𝜇𝑡 𝑡(𝑞, 𝑖)𝑈𝑞,𝑖−1𝜇𝑞,𝑖

𝑞,𝑖

(85) 而𝛾𝑡(𝑞, 𝑖)可由前向後向演算法求得其值。

由於式(58)的定義,因此𝑂 = 𝑊𝐶′一樣會成立,故將式(71)改寫如下

𝑊T𝑈̅̅̅̅̅𝑊𝐶−1 = 𝑊T𝑈̅̅̅̅̅̅̅̅̅ −1𝑀T (86) 利用上式(86),我們便可找到一特徵向量𝐶使 Q 函數具有機率區域最大值。

因此求取𝑃(𝑂|𝜆)之演算法流程如下:

1. 選取一個起始特徵向量 C。

2. 使用前向後向演算法求取𝛾𝑡(𝑞, 𝑖)之值。

3. 求得𝑈̅̅̅̅̅與𝑈−1 ̅̅̅̅̅̅̅̅後,將其帶入式(84)求得𝐶−1𝑀

4. 令𝐶 = 𝐶,若滿足設定之目標即停止;不然則回到步驟 2.繼續更新。

從此一演算法流程當中我們可以發現其演算法式依其起始特徵向量 C 進行 更新,故本演算法求得之解僅為區域最大值,非全域最大值。

46