第二章 文獻回顧
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