7.1 端到端非自迴歸 TTS:FastSpeech 家族#
一、Tacotron 留下的遺產與遺憾#
2017 年的 Tacotron 由 Google 的 Wang 等人發表,隨後 Tacotron 2 在同年稍晚補上了時間上采樣、殘差連接與 Griffin-Lim 之外的 WaveNet 替代方案。兩代 Tacotron 確立了一個至今仍具支配地位的架構共識:文字經過音素化與正規化後,編碼器把離散的符號序列映射到內部表示,解碼器再以自迴歸的方式一幀一幀地吐出梅爾頻譜。整個過程不需要音素級的時長標註,不需要手寫韻律規則,訓練端到端進行,合成結果自然度在 2018 到 2019 年間幾乎超越了所有基於模板拼接的傳統系統。Tacotron 2 論文裡那長達一分鐘的連續朗讀示範,在當時是一種技術宣告:機器終於能用流暢的語氣把整段文字唸出來,而不是把單字拼接成殘缺的關鍵詞列表。
但 Tacotron 的解碼器有一個無法迴避的結構性代價:它是自迴歸的。要產生 \(T_{mel}\) 個梅爾框架,模型就必須做 \(T_{mel}\) 次前向傳播,每一次的輸入都依賴前一次的輸出。在 2019 年的硬體條件下,這意味著合成一句十秒的語音需要數百次網路呼叫,推理延遲往往超過實時倍率數十倍,難以支撐即時對話、語音客服與車載語音助理。Tacotron 論文報告的 MOS 自然度已經足夠好,但它的實時係數(RTF)離「電話上可以線上生成」依然很遠。
更麻煩的是,自迴歸解碼器在推理時的行為與訓練時並不一致。訓練時用的是 teacher forcing,模型看到的是真實的前序梅爾框架;推理時看到的是自己上一幀的輸出,任何一步的微小偏差都會沿時間軸累積。這意味著「自回歸誤差累積」是結構性的,而不是可以靠加大模型解決的問題。
二、核心命題:語音的長度比大致可預測#
FastSpeech 的作者 Ren 等人在 2019 年提出的問題,可以濃縮成一句話:既然聲音與文字之間的長度比大致固定,且這個比值與語義內容只有弱相關,為什麼還要逐音素自迴歸地生成?
這個觀察來自語音學裡的一個老常識:在自然語音中,每個音素都會持續一段時間,而其持續時間主要取決於該音素的類型(元音比塞音長)、說話速度與語境,而非它在句子中的語義角色。換句話說,「文字到梅爾」的映射不是自由的,而是在大多數情況下近似確定性且緊湊的。既然如此,把生成過程從「逐步選擇下一幀」改為「一次性輸出整段」,理論上是可行的。
這個命題若成立,會帶來三個好處。其一是延遲從 \(O(T_{mel})\) 次網路呼叫降為一次前向,量級上從數百倍降到數十倍乃至更低。其二是訓練與推理一致,因為沒有 teacher forcing 的落差。其三是模型的輸出具有全局一致性:一次前向可以看到整段文字,而不是在每一步只看前幾個字元。
值得注意的是,這個命題並非憑空而來。傳統的拼接式語音合成早就隱含地依賴了「音素時長大致可預測」這件事:模板拼接系統正是靠著查表得到每個音素的時長,才把音節片段接起來的。Tacotron 把時長交給注意力機制隱式決定,等於把一個原本被人工規則明確表達的量,重新藏進了網路的黑箱裡。FastSpeech 的主張其實是把傳統系統的做法重新扶正:既然時長本來就有一個可預測的結構,沒有理由不把它顯式化。
三、架構拆解:三個模組與一個被外化的變數#
FastSpeech 的整體結構可以用一句話概括:用 Transformer 取代 RNN 編碼器與注意力解碼器,用長度調節器把音素表示一次性展平到梅爾長度,再加上一組負責韻律的變異數預測模組。
具體來說,輸入的音素序列經過兩層卷積前端(用以處理鄰接資訊與降維)後進入 Transformer 編碼器,輸出與輸入等長的音素級隱藏狀態 \(h_1, h_2, \dots, h_{T_{text}}\) 。這裡有一個與機器翻譯截然不同的問題: \(T_{text}\) 是音素數, \(T_{mel}\) 是梅爾框架數,兩者不相等,而 Transformer 編碼器是等長映射,不會自動產生這種膨脹。
FastSpeech 的解法是引入長度調節器(Length Regulator),它把音素級表示依據預測的持續時間重複若干次,展開成梅爾級表示 \(h_1, h_1, h_1, h_2, \dots, h_{T_{mel}}\) 。展開後的序列再送入解碼器(此處是一個上采樣的卷積堆疊),直接輸出整段梅爾頻譜。這就是「非自迴歸」的實質:輸出長度 \(T_{mel}\) 在網路內部是被決定好的,而不是被逐一生成的。
與 Transformer 的關係值得說清楚。FastSpeech 並沒有發明注意力機制,它採用的是 Vaswani 等人在 2017 年提出的原版 Transformer 編碼器結構,包含多頭自注意力與位置前饋網路,差別在於它把 Transformer 從「解碼器」搬到了「編碼器 + 展平」的位置上。原本 Transformer 用交叉注意力讓解碼器在每一步「查詢」編碼器輸出,那個機制在這裡被長度調節器取代了——這是一次代價很小但意義很大的替換。
自注意力本身保留了全局依賴:每一個音素位置都能看到整段音素序列,因此在 Transformer 編碼器內部,模型已經具備「規劃整句韻律」的能力。它缺的只是把這份規劃轉換成時間軸上的具體落點,而那正是長度調節器與變異數預測模組的職責。這也解釋了為什麼 FastSpeech 1 的 Transformer 編碼器只需要很少的層數就能工作良好——負擔被分散給了下游的三個顯式模組,而不是全部壓在編碼器上。
flowchart TB
subgraph TA["Tacotron 2(2017)自迴歸"]
A1["音素序列"] --> B1["卷積前端 + RNN 編碼器"]
B1 --> C1["交叉注意力解碼器<br/>逐幀自迴歸"]
C1 --> D1["梅爾頻譜幀 1"]
D1 -->|再次輸入| C1
D1 --> E1["梅爾頻譜幀 2 ..."]
end
subgraph FS["FastSpeech(2019)非自迴歸"]
A2["音素序列"] --> B2["卷積前端 + Transformer 編碼器"]
B2 --> C2["長度調節器<br/>依時長重複展開"]
C2 --> D2["梅爾級表示"]
D2 --> E2["卷積解碼器<br/>一次前向輸出整段"]
E2 --> F2["完整梅爾頻譜"]
end四、延遲:從數百倍到數十倍#
把上面的架構差異翻譯成時間數字,FastSpeech 論文給出的對比是:Tacotron 2 的合成速度約為實時的數十倍到百餘倍,而 FastSpeech 把這個數字降到 \(\text{RTF} \approx 0.03\) 的量級。在部分實作中,FastSpeech 1 的梅爾生成延遲比 Tacotron 2 低兩個數量級。
速度提升的直接來源是計算圖的形狀改變。自迴歸解碼器把時間維度串成一條鏈,GPU 的並行度在鏈上無從發揮;非自迴歸解碼器則把梅爾幀展成 \(T_{mel} \times d\) 的矩陣一次送進卷積堆疊,幾乎所有計算都能跑在批次與通道兩個維度上。這正是 GPU 擅長的形狀。從更深層次看,非自迴歸把「順序決定內容」的問題轉換成「並行決定內容」的問題,凡是這類轉換在深度學習史上成功的案例,通常都伴隨著十倍以上的效率躍升。
這個數字為什麼重要,不只是因為快。自迴歸模型的延遲會隨句子長度線性增長,長句尤其糟糕;非自迴歸模型的延遲則是一次前向加上卷積堆疊的平行計算,幾乎不隨長度變化——句子越長,優勢越大。這意味著 TTS 從「離線批次作業」正式轉向「串流服務元件」,這正是後續 VITS 與 HiFi-GAN 這類架構能在 2021 年之後進入即時語音對話市場的技術前提。
需要補充的是,非自迴歸並不代表輸出品質必然下降。FastSpeech 的論證是:當模型不再逐步生成時,損失函數可以直接作用在整段梅爾頻譜上,訓練訊號更密集,收斂更快。論文報告的梅爾頻譜重建誤差與 MOS 自然度都優於同期 Tacotron 2 的基線,證明了「快」與「好」在這裡並非取捨。這也與第 6 章的自迴歸波形生成形成對照——WaveNet 的慢是因為 1-bit 精確建模本身的代價,而 FastSpeech 的慢則是自迴歸解碼器的架構負擔,兩者的性質完全不同。
五、關鍵設計:把長度外化為顯式變數#
FastSpeech 對整個領域最深的影響,不是速度,而是設計哲學:把原本隱含在自迴歸解碼過程中的隱變數(每個音素持續多久、基頻如何起伏、能量如何分布)全部取出來,改成網路顯式預測的參數。
這正是本章主線。長度調節器把「長度」變成顯式變數,是第一層;下一節要處理的音素對齊,是這層顯式化的前提;而變異數建模器把音高、能量與時長三項韻律參數顯式化,則是第三層。三層串起來,就構成了 FastSpeech 家族完整的控制介面:想要控制語速,改時長預測;想要控制音高,改音高預測。這種「可插拔的韻律控制」在自迴歸架構裡幾乎不可能自然出現。
「長度外化」聽起來抽象,落到實作上其實非常具體。FastSpeech 1 的長度調節器有兩種模式:預測模式由一個時長預測器網路輸出每個音素的持續時間,而重複模式則直接採用外部提供的時長(用於訓練時以真實時長展開,推理時改用預測值)。這種「推理用預測、訓練可用真值」的設計,是一種標準的 teacher forcing 技巧,只不過作用在長度維度而非時間維度。
更後續的 FastSpeech 2 與多數衍生工作把長度調節器從簡單的重複升級為可插拔的形式,例如根據目標說話者的實際時長比例做插值,或使用基於注意力權重的軟對齊展開。從「重複」到「插值」,這個演進本身就是第 7.2 節的主題:對齊不只是一個數字的問題,而是一個需要獨立解決的問題。
六、與非自迴歸機器翻譯的平行#
FastSpeech 的思想來源之一是機器翻譯裡的非自迴歸浪潮。2015 年之前的 Google Neural Machine Translation 依賴 LSTM 解碼器逐詞生成,2016 年的 GNMT 依然如此;2017 年 Transformer 用平行處理的編碼器取代了自迴歸解碼器,訓練與推理效率提升數十倍,並成為後來 BERT 一系列工作的基礎。
但注意兩者的關鍵差異:機器翻譯的輸出長度與輸入長度大致相當,因此 Transformer 可以直接把解碼器堆疊到編碼器輸出上。而 TTS 的輸出長度是輸入長度的數倍到數十倍(一句話通常有十幾個音素、數百個梅爾框架),這個「膨脹」在翻譯裡不存在。所以 FastSpeech 必須自己設計一個把短序列變長的機制——也就是長度調節器。這是 TTS 版本自迴歸革命裡最有技術含量的一塊拼圖。
| 項目 | Tacotron 2(2017) | FastSpeech(2019) | FastSpeech 2(2020) |
|---|---|---|---|
| 編碼器 | 雙層 LSTM 殘差堆疊 | Transformer 編碼器 | Transformer 編碼器 |
| 解碼器 | 注意力 + 卷積,自迴歸 | 一次前向卷積解碼器 | 一次前向卷積解碼器 |
| 長度處理 | 隱式,由解碼器逐步決定 | 長度調節器顯式展開 | 長度調節器顯式展開 |
| 韻律建模 | 隱式學會 | 變異數預測模組 | 變異數預測模組 + 目標聲學特徵 |
| 訓練對齊 | 注意力自對齊 | 外部對齊(用 MFA 或注意力) | 對齊搜尋 + 目標聲學特徵條件 |
| 推理延遲 | 數十到數百倍實時 | 單次前向,數十倍加速 | 單次前向,接近實時 |
| 聲音相似度 | 中等 | 較佳(顯式韻律) | 明顯提升(聲學特徵注入) |
從訓練的角度看,這種平行性有更深的意義。GNMT 與 Transformer 之所以能勝出,是因為它們能利用整段序列的平行計算,讓每個位置都從全句上下文中受益;FastSpeech 把同一套邏輯搬到梅爾域,但必須先解決「輸出長度不等於輸入長度」這個翻譯裡不存在的問題。這一章因此不只是速度的歷史,也是「非自迴歸化」這個 2017 年之後席捲整個序列建模領域的主題,第一次在聲音生成上落地。
七、FastSpeech 2(2020)的兩項改進#
FastSpeech 2 於 2020 年發表,針對 FastSpeech 1 的兩個弱點做了針對性改良。
第一項是對齊的改進。FastSpeech 1 依賴外部工具產生的音素級時長標註,這在合成語料上幾乎不可得(下一節會詳述)。FastSpeech 2 換成了一種在訓練期間動態搜尋對齊的方案,把對齊從「資料集預處理階段的固定標籤」變成「模型內部學到的對齊」,大幅降低了對標註的依賴。
第二項是目標聲學特徵(target acoustic feature)的引入。FastSpeech 2 在解碼器的部分層級上,把目標音訊的梅爾頻譜(經過下采樣)注入進去作為條件。這聽起來像是資訊洩漏,但實作上它只在有限的層級與有限的通道上注入,且目標特徵來自說話者參考的錄音。效果是顯著的:聲音相似度評測(MOS)明顯提升,且能更好地保留說話者的音色特徵,同時韻律遷移也更自然——因為模型被教會了「韻律如何作用於一個具體的聲學載體」,而不只是抽象地學韻律形狀。
FastSpeech 2 的第一項改進值得單獨強調,因為它直接連到下一節的主題。FastSpeech 1 需要在訓練前為每一段語音準備音素級時長標註,這是資料準備成本最高的一環。FastSpeech 2 把對齊的取得改成模型內部可學習的搜尋:從文字推梅爾的過程中,模型自己找出哪一段音素對應哪一段梅爾。這個思路與第 5 章中注意力對齊用於 ASR 的精神一致,差別在於 TTS 需要的是單調且正確的對齊,而不只是「夠用的」對齊。
這條路線最終在 VITS 中被推到極致:VITS 2021 提出的單調對齊搜尋(Monotonic Alignment Search, MAS)用動態規劃求取最優的單調對齊路徑,把對齊、變異數預測與生成全部納入同一個可微框架,不再需要任何外部標註。第 8 章會完整拆解 MAS 的推導,本節只需記住它的動機:FastSpeech 2 的對齊改進,正是 MAS 誕生前的最後一塊拼圖。
八、與 VITS 的分工:中間表示的邊界#
FastSpeech 家族產出的是梅爾頻譜,一個中間表示。要還原成可播放的波形,仍需要聲碼器(vocoder)。FastSpeech 1 時代常搭配 Griffin-Lim 演算法或作者的 MelGAN;這種兩段式管線的問題是:梅爾頻譜到波形的映射不唯一,Griffin-Lim 迭代慢且損失高頻細節,梅爾頻譜本身也承載不了說話者的音色細節。
2021 年的 VITS 改變了這個分工。VITS 把梅爾頻譜生成與聲碼器合成整合在同一個端到端框架內,用對抗訓練與 normalizing flow 直接從文字輸出波形,並用單調對齊搜尋(MAS)取代外部對齊。於是分工重新排列:FastSpeech 家族的「一次前向輸出梅爾頻譜」路線在 VITS 時代被部分吸收,但在「需要可控、可編輯、可攜帶音高能量參數」的場景中,FastSpeech 風格架構仍是主流選擇——例如 Numerous Labs、Styler TTS 這類風格遷移系統。
本章結束時,長度調節器這個外化變數已經被提出。下一節我們要問一個更根本的問題:長度調節器重複每個音素多少次,這個數字從哪裡來?當模型不再逐幀生成時,誰來告訴它每個音素持續多久?
小結#
Tacotron 證明了端到端文字到梅爾頻譜可行,FastSpeech 證明了非自迴歸也可行,並且更快。真正被顛覆的不是速度數字,而是設計哲學:隱式生成被拆解為顯式預測,而這個拆解一旦發生,語速、音高、能量就不再是模型內部的黑箱副作用,而是可以被外部介面握住的把手。下一節要處理的是這把把手的第一個前提——音素與梅爾框架之間究竟如何對齊。