跳轉到

6.1 自迴歸波形生成:WaveNet 與因果擴張卷積#

一、波形生成的長序列困境#

在談 WaveNet 之前,必須先量化「直接生成波形」究竟意味著什麼。一段以 16-bit 取樣、16 kHz 採樣率的語音,每一秒就包含 16,000 個取樣點;一句五秒的話語,序列長度是 80,000。這個數字意味著模型必須在時間解析度上做到極度細緻:基頻約 100 至 300 Hz 的振動在一秒內要重複數百次,而音素邊界、共振峰移動、爆破音的瞬態都發生在十毫秒甚至更短的尺度上。相較之下,梅爾頻譜圖只需每秒 50 至 100 個影格,時間解析度寬鬆了兩到三個數量級。於是波形生成的第一個難題不是「模型不夠強」,而是「序列太長、每一步太細」,任何以幀為單位建模的架構都無法直接承載。

在談 WaveNet 之前,必須先量化「直接生成波形」究竟意味著什麼。一段以 16-bit 取樣、16 kHz 採樣率的語音,每一秒就包含 16,000 個取樣點;一句五秒的話語,序列長度是 80,000。這個數字意味著模型必須在時間解析度上做到極度細緻:基頻約 100 至 300 Hz 的振動在一秒內要重複數百次,而音素邊界、共振峰移動、爆破音的瞬態都發生在十毫秒甚至更短的尺度上。相較之下,梅爾頻譜圖只需每秒 50 至 100 個影格,時間解析度寬鬆了兩到三個數量級。於是波形生成的第一個難題不是「模型不夠強」,而是「序列太長、每一步太細」,任何以幀為單位建模的架構都無法直接承載。

第二個難題來自目標函數的選擇。若像多數迴歸模型那樣最小化均方誤差,模型實際學到的是條件分佈的平均。對一個音素而言,合理的實現方式有很多種:基頻可以偏高或偏低、共振峰可以因說話人而略有差異、爆破音的瞬態幅度可以強或弱。均值回歸會把這些差異全部抹平,輸出一個統計上「安全」但聽起來平板無力、帶有金屬感的波形——這是早期神經聲碼器與 GAN 聲碼器之前的常見失敗模式。第三個難題則是語氣與韻律的可控性:若輸出只由文字決定、且模型只學會一個平均值,使用者便無從要求「激動一點」或「放慢一點」。

這三個難題在本質上互相糾纏:長序列使得逐樣本的機率建模極慢,回歸式訓練使得輸出缺乏多樣性,而多樣性又要求模型能夠對同一條件產生不同的實現。2016 年,DeepMind 的 Aäron van den Oord、Sergio D薰覓森與其他作者在《WaveNet: A Generative Model for Raw Audio》提出了一個看起來平淡無奇、卻改變了整個領域走向的答案:把波形合成重新表述為機率建模問題。

值得先停下來說明,為什麼這個答案在當時不是顯而易見的。若只是想在既有框架上加一個「隨機性」開關,最直接的做法是給迴歸網路接一個噪聲層,或把目標函數換成變分下界。但只要模型仍然輸出的是一個點,那麼「輸出集合」在數學上就是退化的——一個高斯分佈的樣本雲與一個確定值,在訓練時loss曲面上幾乎不可區分。要真正獲得多樣性,必須讓網路輸出的是一組概率而非一個數,也就是必須承認「同一段文字背後存在多種合理的波形」這個本體論事實。

這個承認之所以在 2016 年之前不普遍,是因為長期的韻律合成研究習慣了「語音合成等於語音參數化」的範式:說話人、音高、能量、語速是連續可控參數,合成器把它們映射為波形。既然參數是給定的,波形似乎也該是給定的。但波形在物理上遠比這組參數複雜——它包含大量與語意無關的隨機性,例如摩擦音的細微顆粒感、爆破音的具體瞬態形狀。分布建模正是把這些「不相干的隨機性」重新接回模型內部。

一之二、歷史座標:機率建模並非新題目#

必須說明的是,WaveNet 借鑑的傳統相當深厚。D. W. Talkin 與 J. R. Deller 在 1990 年代建立的 HMM 語音合成系統,本質上就是一個自迴歸概率模型,只是它的自迴歸單位是「音素狀態」而非「取樣點」,輸出的是源濾器參數而非波形。1980 年代的 FORMANT 合成器與 Klatt 樹狀合成器更早就把「用有限狀態機器串接共振峰模型來生成語音」這件事做透了。DeepMind 在 2014 至 2016 年間做的 WaveNet 前身研究,則是把這套「狀態 + 機率」的想法從音素層級一路下沉到取樣點層級。

同一時期,DeepMind 在影像上發表的 PixelCNN 系列也提供了直接的結構性啟發:把二維影像視為像素序列,用捲積網路計算每個像素在給定左側與上方像素時的條件分佈,並以自迴歸方式逐像素生成。像素是離散的、類別是有限的,因此 Softmax 分佈可以直接用交叉熵訓練;把這套模板搬到音訊上,唯一需要解決的就是「連續值如何變成有限類別集合」的問題。

換言之,2016 年的關鍵貢獻並不是發明了自迴歸建模,也不是發明了因果卷積,而是把這三件事首次組裝到同一個針對原始音訊的系統裡,並且證明它能合成出在盲測中勝過當時專用系統的語音。組裝本身就是創新,因為三個部分之間的介面(因果性限制、離散化粒度、取樣效率)互相牽制,任何一個改動都會牽動其餘兩個。

二、連鎖律:把 TTS 變成一個條件分佈#

WaveNet 的起點是機率論裡最基本、也最容易被低估的一條定理:條件機率的連鎖律。對任何隨機變數序列 \(x_1, x_2, \dots, x_T\) 與條件變數 \(c\) ,聯合分佈可以分解為一串條件分佈的乘積:

\[ P(x \mid c) = \prod_{t=1}^{T} P \left( x_t \mid x_1, x_2, \dots, x_{t-1}, c \right) \]

其中 \(c\) 可以是文字、音素序列、甚至一段說話人的標記,而 \(x_t\) 是第 \(t\) 個取樣點的取值。這個式子的關鍵不在定理本身,而在於它重新定義了問題的形狀。傳統的 TTS 把它當成「回歸任務」:給定文字,吐出一條確定的波形序列。連鎖律則把它變成「建模任務」:給定文字,學會一個覆蓋所有合理波形的機率分佈,再從這個分佈中取樣。

這個轉變連帶解決了前面列出的三個難題。多樣性不再是額外附加的模組(例如 GAN 的判別器或 VAE 的潛在變數),而是自動從分佈的取樣中湧現:同一段文字取樣兩次,就會得到兩個不同的實現,只要分佈本身學得夠準。反向傳播的訓練目標也隨之確定化——訓練時只需最大化觀測到的真實序列的對數機率,也就是最小化負對數似然:

\[ \mathcal{L} = - \sum_{t=1}^{T} \log P \left( x_t \mid x_1, \dots, x_{t-1}, c \right) \]

這是交叉熵。換言之,WaveNet 把一個原本沒有良定義回歸目標的連續訊號生成問題,變成了一個標準的、有成熟優化工具鏈的分類式目標函數。這正是深度學習最擅長的生態系。

這裡有一個容易被忽略的推論:一旦目標變成分類式的對數機率,「類別」的數量就決定了模型能表達的解析度。若把取值粗略地二分為正負兩個類別,模型只能表達「波形向上或向下」這種幾乎沒有資訊的統計量,量化誤差會淹沒一切。若提高到兩百多個類別,模型才可能描述局部波形的形狀。這也說明了為什麼 WaveNet 的離散化設計不是事後的工程細節,而是整個架構中與機率表述同等重要的部分——6.3 節會把這條線索完整展開。

另一個同樣重要的推論是關於條件分佈的因子化粒度。連鎖律允許我們在任意位置切斷:可以對整個音訊序列做因子化,也可以先因子化成「音素時序 × 每個音素內的取樣點」兩層。WaveNet 選擇了最細的粒度——每一個取樣點都是一個因子——這讓模型的表達力達到最大,但同時把取樣步數推到最大。從這個角度看,自迴歸模型的「快」與「慢」、「表達力」與「延遲」永遠是同一枚硬幣的兩面,後續所有改良——並行取樣、非自迴歸變壓器、對抗式聲碼器——都只是在這枚硬幣上重新分配權重。

三、與同時代方法的正面对照#

要理解 2016 年這個選擇的重量,必須把它放回當時的技術地圖裡。當時主流的語音合成路線大致有三條。

第一條是 Griffin-Lim 類的相位重建。它先用梅爾頻譜迴歸器估計出功率譜,再用 Griffin-Lim 演算法在重建與保持原頻譜之間交替迭代以推回相位。這條路徑的致命弱點是:梅爾頻譜本身丟棄了相位資訊,而相位對語音的可懂度與自然度影響巨大。演算法迭代數十上百次仍難以收斂到自然波形,聽感上常有明顯的「金屬味」與不穩定的尾音。

第二條是簡單卷積網路直接回歸波形(例如 2015 至 2016 年間 GAN-based WaveNet 的前身工作與 vocoder 類實驗)。這類模型端到端從梅爾譜回歸原始波形,取樣只需一次前向傳播,延遲極低,是後來 HiFi-GAN 路線的先驅。但 MSE 損失導致均值化,加上梅爾譜本身的資訊瓶頸,輸出細節總是失真。

第三條是韻律合成器與源濾器模型。這條路線把語音拆成「音源激發 + 濾波整形」,用類神經網路建模基頻軌跡、音量軌跡與共振峰軌跡,再由源濾器合成器合成波形。它的優點是物理可解釋、參數少、可控制性強;缺點是合成器本身只做了一階近似,摩擦音、爆破音、共振峰隨時間的動態變化都難以自然呈現。

設計面向 同時代典型做法 WaveNet 的選擇 代價
問題定義 回歸連續波形(點估計) 建模條件分佈 需逐樣本取樣
輸入條件 梅爾譜 / 音素時序 直接餵入文字或音素特徵 條件編碼器需自行對齊
損失函數 MSE 或頻譜 L1 交叉熵(負對數似然) 需要離散化
多樣性 平均化、單一輸出 由取樣自動產生 隨機性難以完全控制
取樣延遲 一次前向傳播 逐步自迴歸 序列長時極慢
可解釋性 物理參數直觀 端到端學習 中間表徵不可直讀

四、分布建模與點估計的取捨#

把問題說清楚之後,取捨也就無可迴避。分布建模相對點估計的核心代價是取樣速度:點估計模型只需要跑一次前向傳播,而分布建模必須把序列逐點「解開」,每一步都依賴上一步的輸出。這意味著若目標是 16 kHz 取樣、一秒鐘的音訊,就要做 16,000 次前向傳播。即使每次只需幾毫秒,整體延遲也遠遠無法支撐即時互動——這個缺陷正是第 7 章 FastSpeech 家族要正面解決的對象,而第 6.3 節提到的 2017 年並行取樣改進則是過渡方案。

第二個代價是隨機性的可控性。分布模型的每一次輸出都不相同,這在創意應用上是優點,在工程上卻意味著品質波動:取樣溫度、隨機種子、條件強度都需要被小心管理。第三個代價是訓練與推理的不對稱性:訓練時所有時間步可以平行計算(老師強制),推理時卻必須串行,這個落差正是自迴歸模型在聲學建模上最著名的結構性瓶頸。

這裡必須把訓練與推理的差異量化清楚,才能明白後續文獻中那些「加速數百倍」的說法從何而來。訓練時,給定真實序列 \(x_{1:T}\) ,第 \(t\) 步的目標分佈 \(P(x_t \mid x_{<t}, c)\) 可以用真實前綴一次算完,並且 \(T\) 個位置的所有卷積核可以透過高度並行的捲積算子同時評估,等於一次前向傳播處理整段音訊。推理時則不然:第 \(t\) 步的分佈依賴模型自己剛剛產出的 \(x_{t-1}\) ,必須等前一步完成才能開始下一步,於是形成一條長度為 \(T\) 的串行相依鏈。即便把每一步的延遲壓到一毫秒,80,000 步的音訊就需要八十秒——這不是工程最佳化能彌補的差距,而是結構性的。

第三個代價是訓練資料量與算力的門檻。分布建模需要模型對整段波形做逐點似然估計,參數量、可訓練的細節與資料分佈都需要匹配;相較之下,回歸式的梅爾譜→波形方法只要一個卷積網路就能訓練起來。於是 WaveNet 在發表的當年需要多台 GPU 花上數天,而它的論文中真正令人震驚的部分——24 kHz 取樣率下的原聲品質——正是靠這種計算量堆出來的。

另一個被低估的優點是分佈校準能力。當模型對某個時刻的取值不確定時,分布會展寬,softmax 迴歸的結果會讓分布式的取樣機制在多樣性與保真之間取得平衡。而點估計模型只能輸出一個中間值,聽起來像是「哪裡都不像」。WaveNet 論文報告的 MOS 測試顯示,引入分佈建模後,模型在同樣條件下能產生遠比回歸式模型更自然的結果。

最後還有一個方法論上的收穫值得記錄:分布建模把「品質」的定義交給了聽覺,而非交給數學損失。回歸式模型的 MSE 損失下降與聽感改善之間沒有必然聯繫,甚至常常背道而馳(因為平均化必然降低誤差卻劣化聽感)。而交叉熵損失下降意味著模型對真實波形的分布預測更準確,聽感改善是它的自然後果。這一點在日後對抗式聲碼器與擴散模型的演進中不斷被重演:每一次進步的背後,都是「損失函數與聽覺目標對齊」這件事被重新發現。

五、架構預告#

把連鎖律寫成網路,還需要解決兩個純粹的工程問題:其一,條件 \(x_1, x_2, \dots, x_{t-1}\) 是一個長度隨 \(t\) 增長的序列,用循環網路(LSTM 或 GRU)處理會帶來時間上的串行依賴,訓練與取樣都慢;其二,要讓第 \(t\) 個輸出真正「只依賴過去」,網路必須嚴格滿足因果性。

這兩個問題分別由本章接下來兩節處理:6.2 節介紹擴張因果卷積如何在不增加參數量的前提下把感受野擴展到數千個取樣點,並與 LSTM 的時序長度依賴做正面對比;6.3 節則處理「連續取值如何變成分類」這個問題,說明門控激活單元的資料流設計、Softmax 離散化如何讓交叉熵真正可用,以及它引入的量化誤差與隨後被廣泛採用的改進路徑。