語音合成,又稱文語轉換(Text To Speech, TTS),是一種可以將任意輸入文本轉換成相應語音的技術。
傳統的語音合成系統通常包括前端和后端兩個模塊。前端模塊主要是對輸入文本進行分析,提取后端模塊所需要的語言學信息,對於中文合成系統而言,前端模塊一般包含文本正則化、分詞、詞性預測、多音字消歧、韻律預測等子模塊。后端模塊根據前端分析結果,通過一定的方法生成語音波形,后端系統一般分為基於統計參數建模的語音合成(或稱參數合成)以及基於單元挑選和波形拼接的語音合成(或稱拼接合成)。
對於后端系統中的參數合成而言,該方法在訓練階段對語言聲學特征、時長信息進行上下文相關建模,在合成階段通過時長模型和聲學模型預測聲學特征參數,對聲學特征參數做后處理,最終通過聲碼器恢復語音波形。該方法可以在語音庫相對較小的情況下,得到較為穩定的合成效果。缺點在於統計建模帶來的聲學特征參數“過平滑”問題,以及聲碼器對音質的損傷。
對於后端系統中的拼接合成而言,訓練階段與參數合成基本相同,在合成階段通過模型計算代價來指導單元挑選,采用動態規划算法選出最優單元序列,再對選出的單元進行能量規整和波形拼接。拼接合成直接使用真實的語音片段,可以最大限度保留語音音質;缺點是需要的音庫一般較大,而且無法保證領域外文本的合成效果。
傳統的語音合成系統,都是相對復雜的系統,比如,前端系統需要較強的語言學背景,並且不同語言的語言學知識還差異明顯,因此需要特定領域的專家支持。后端模塊中的參數系統需要對語音的發聲機理有一定的了解,由於傳統的參數系統建模時存在信息損失,限制了合成語音表現力的進一步提升。而同為后端系統的拼接系統則對語音數據庫要求較高,同時需要人工介入制定很多挑選規則和參數。
這些都促使端到端語音合成的出現。端到端合成系統直接輸入文本或者注音字符,系統直接輸出音頻波形。端到端系統降低了對語言學知識的要求,可以很方便在不同語種上復制,批量實現幾十種甚至更多語種的合成系統。並且端到端語音合成系統表現出強大豐富的發音風格和韻律表現力。
深度學習用於語音合成
-
WaveNet
WaveNet並非一個端到端的TTS系統,依賴於其他模塊對輸入預處理,提供特征。詳見下文“聲碼器”部分,論文地址:WaveNet: A generative model for raw audio
仿照PixelRNN 圖像生成方式,WaveNet依據之前采樣點來生成下一采樣點。WaveNet是一種典型的自回歸生成模型,所謂自回歸生成模型,即是利用前面若干時刻變量的線性組合來描述以后某時刻變量的線性回歸模型,參見第四篇 自回歸模型(AR Model)。WaveNet生成下一個采樣點的結構為CNN結構。
WaveNet缺陷:1)每次預測一個采樣點,速度慢;2)WaveNet並非完整的TTS方案,依賴其余模塊提供高層特征,前端分析出錯,直接影響合成效果;3)用於TTS時,初始采樣點的選擇很重要
-
DeepVoice
將傳統參數合成的TTS系統分拆成多個子模塊,每個子模塊用一個神經網絡模型代替。論文地址:Deep voice: Real-time neural text-to-speech
DeepVoice將語音合成分成5部分進行,分別為:文本轉音素(又稱語素轉音素, G2P)、音頻切分、音素時長預測、基頻預測、聲學模型。
-
文本轉音素
DeepVoice直接輸入文本即可,但是由於不同語言存在“同字不同音”的現象,因此需要將文本轉化為注音字符。對於中文而言,就是將漢字轉化為拼音。
-
音頻切分
獲得每個音素在對應音頻中的起點和終點。使用Deep Speech 2: End-to-End Speech Recognition in English and Mandarin的對齊方法,這些對齊信息用於訓練后面的“音素時長預測”模型。
-
音素時長預測和基頻預測
該模型為多任務模型,輸入帶有重音標注的音素序列,輸出為音素時長、是否發音的概率和基頻
-
聲學模型
即后文的“聲碼器”(Vocoder)。用於將前面得到的高層特征轉換為聲音波形。DeepVoice的聲學模型即是在前文的WaveNet基礎上改進的。改進的主要方向是:改變網絡層數、殘差通道數、矩陣乘代替上采樣卷積、CPU優化、GPU優化等。
DeepVoice優勢在於:提供了完整的TTS解決方案,不像WaveNet需要依賴其它模塊提供特征,使用的人工特征也減少了;合成速度快,實時性好
DeepVoice缺陷:誤差累積,5個子模塊的誤差會累積,一個模塊出錯,整個合成失敗,開發和調試難度大;雖然減少使用了人工特征,但在這個完整的解決方案中,仍然需要使用音素標記、重音標記等特征;直接使用文本輸入,不能很好解決多音字問題。
-
-
Tacotron
真正意義上的端到端語音合成系統,輸入文本(或注音字符),輸出語音。論文地址:Tacotron: A Fully End-to-End Text-To-Speech Synthesis Model。
結構為:Encoder -> Attention -> Decoder -> Post-processing -> Griffin-Lim轉為聲音波形。后文“Tacotron”部分詳述了這個方法。
Tacotron優勢在於:減少特征工程,只需輸入注音字符(或文本),即可輸出聲音波形,所有特征模型自行學習;方便各種條件的添加,如語種、音色、情感等;避免多模塊誤差累積
Tacotron缺陷:模型除錯難,人為干預能力差,對於部分文本發音出錯,很難人為糾正;端到端不徹底,Tacotron實際輸出梅爾頻譜(Mel-Spectrum),之后再利用Griffin-Lim這樣的聲碼器將其轉化為最終的語音波形,而Griffin-Lim造成了音質瓶頸。
-
DeepVoice2
上文DeepVoice升級版,引入“說話人”向量,能夠合成多種音色的語音。
對DeepVoice的改進:
- 音頻切分模塊和上代結構不變,但加入了batch normalizaiton和殘差連接,對原始音頻做平滑歸一化處理,固定閾值來確定是否為靜音音素。
- DeepVoice使用一個模型同時預測音素時長和基頻,而DeepVoice2分拆成兩個模型。音素時長預測看作是序列標准問題,將連續時長離散化,模型為Neural Architectures for Named Entity Recognition。基頻預測使用時長和音素作為輸入,只輸出發音概率和基頻(DeepVoice還輸出音素時長)。動機:聯合預測還是獨立預測,取決於任務之間是否相互促進,存在共同點,音素時長和發音概率&基頻關聯不大,所以分拆。連續時長離散化的理由在於音素時長不需要十分精准,音素邊界存在10~30毫秒的擾動對合成音質無影響,而離散化后更容易處理。
- 聲學模型采用繼續改進后的WaveNet。
增加“說話人”支持:在encoder、decoder和vocoder三處添加說話人信息,說話人信息是自動從語音數據中學習到的一個16維向量:
- 音頻切分模塊,激活函數之前,說話人向量和batch normalization的結果做點乘
- 音素時長預測模塊,使用說話人向量初始化RNN,並和輸入做拼接
- 基頻預測模塊,使用說話人向量初始化RNN
- 聲學模型模塊,說話人向量和輸入做拼接
-
DeepVoice3 & Tacotron2
DeepVoice3,基於卷積序列到序列模型的多說話人語音合成。論文地址:Deep Voice 3: 2000-Speaker Neural Text-to-Speech
Tacotron2 論文地址:Natural TTS Synthesis by Conditioning WaveNet on Mel Spectrogram Predictions
Tacotron
Tacotron是第一個真正意義上的的端到端語音合成系統。輸入文本或者注音字符,輸出Linear-Spectrum,再經過聲碼器Griffin-Lim轉換為波形。Tacotron目前推出了兩代,Tacotron2主要改進是簡化了模型,去掉了復雜的CBHG結構,並且更新了Attention機制,從而提高了對齊穩定性。開源地址:Tacotron@github & Tacotron2@github。論文地址: Tacotron: A Fully End-to-End Text-To-Speech Synthesis Model & Natural TTS synthesis by conditioning Wavenet on MEL spectogram predictions 。現以Tacotron為例。

上圖為Tacotron在paper中的總體結構,黃色為“輸入”,綠色為“輸出”,藍色為“網絡”。網絡分為4部分,左側為Encoder,中間為Attention,右下為Decoder,右上為Post-processing。其中,Encoder和Post-processing都包含一個稱為CBHG的結構。所謂CBHG即為:1-D convolution bank + highway network + bidirectional GRU,如下圖所示。

CBHG的網絡結構如藍色框所示,由一維卷積濾波器組,Highway網絡和一個雙向GRU組成,CBHG是一種強大的網絡,常被用來提取序列特征。
Encoder、Attention和Decoder構成了經典的seq2seq結構,因此Tacotron是一種seq2seq+post-processing的混合網絡。
Input: 為了避免各種語言的多音字,未錄入詞發音等問題,Tacotron通常將注音字符作為輸入,例如中文可將“拼音”作為輸入。這里有個很好用的漢字轉拼音的python庫:python-pinyin
Output: 根據不同用途,Tacotron可以輸出Linear-Spectrum或者Mel-Spectrum兩種頻譜。如果使用Griffin-Lim作為頻譜轉波形的聲碼器(Vocoder),需要Tacotron輸出Linear-Spectrum;如果使用WaveNet作為聲碼器,則Tacotron需要輸出Linear-Spectrum或者Mel-Spectrum均可,但Mel-Spectrum的計算代價更小。在Tacotron2中,作者使用了80維的Mel-Spectrum作為WaveNet聲碼器的輸入。
Seq2seq: seq2seq是學習序列到序列的模型,在機器翻譯NMT等領域應用廣泛。Tacotron套用了該框架。在seq2seq模塊中,輸入注音字符,輸出Mel-Spectrum序列。引入低維Mel-Spectrum的目的在於幫助Attention收斂。該seq2seq模塊中還包括了引入CBHG模塊,Decoder模塊每一時刻同時輸出多幀等tricks。
Post-processing: 在Tacotron+WaveNet框架下,由Tacotron輸入注音字符,輸出頻譜;WaveNet輸入頻譜,輸出波形。post-processing模塊加在Tacotron和WaveNet之間,主要目的在於串聯多個幀,提高生成質量。seq2seq框架決定了Decoder只能看到前面若干幀,而對后面一無所知。但post-processing可以向前向后觀測若干幀,參考信息更多,因此生成質量更高。下圖中,上面為不加post-processing的聲譜圖,下面是加了post-processing的聲譜圖(橫軸是離散傅里葉變換DFT)。可以明顯看到,加了post-processing模塊的聲譜圖更為清晰、銳利,特別是在低頻部分,合成效果更好些。

聲碼器
Tacotron能夠將注音字符解壓為頻譜,需要聲碼器將頻譜還原成波形。在Tacotron中,作者使用Griffin-Lim算法,從Linear-Spectrum中恢復相位,再通過短時傅里葉變換ISTFT還原出波形。Griffin-Lim算法簡單,但是速度慢,很難做到實時。而且通過Griffin-Lim生成波形過於平滑,空洞較多,聽感不佳。經過Tacotron2,可以看到,可利用采樣點自回歸模型提高合成質量。主要的采樣點自回歸模型有:1)SampleRNN; 2)WaveNet; 3)WaveRNN。這里以WaveNet為例。論文地址:WaveNet: A generative model for raw audio

上圖描述了WaveNet這類采樣點自回歸模型的工作方式。模型輸入若干歷史采樣點,輸出下一采樣點的預測值,也即是根據歷史預測未來。這種工作方式和語言模型很像,只不過音頻采樣點自回歸更難而已,需要考慮更長的歷史信息才能夠保證足夠的預測准確率。
WaveNet是基於CNN的采樣點自回歸模型,由於CNN結構限制,為了解決長距離依賴問題,必須想辦法擴大感受野,但擴大感受野又會增加參數數量,為了在擴大感受野和參數數量中尋求平衡,作者引入了所謂的“擴展卷積”。“擴展卷積”又稱“空洞卷積”,就是在計算卷積時跨越若干個點,WaveNet堆疊多層一維擴展卷積,卷積核寬度為2,感受野隨着層數的升高而逐漸增大。可以想象,通過這種結構,CNN感受野隨着層數的增多而指數級增大。
訓練好WaveNet,就可以合成語音波形了。但是由於沒有添加語義信息,所以現在的WaveNet生成的波形完全是鸚鵡學舌。所以可以使用Tacotron生成的Mel-Spectrum作為輸入,為其添加語義信息。由於采樣點長度和Mel-Spectrum長度不匹配,需要想辦法將長度對齊,完成這一目標有兩種方法:一種是將Mel-Spectrum反卷積上采樣到采樣點長度,另一種是將Mel-Spectrum直接復制上采樣到采樣點長度。兩種方法差異很小,為了保證模型盡量簡潔,故而采用第二種方法。

上圖展示了第二種方法,將Mel-Spectrum直接復制以上采樣到采樣點長度的方法。上采樣和下采樣參見:上采樣和下采樣-Hoganway,計算機視覺中upsampling(上采樣)的三種方式-明天去哪

上圖為DeepVoice: Real-time Neural Text-to-Speech中將Mel-Spectrum的語義信息嵌入到WaveNet中去的過程。經過復制上采樣的Mel-Spectrum首先需要經過一個1*1的卷積,是的Mel-Spectrum維度和WaveNet GAU輸入維度相同,然后分兩部分累加送入GAU即可。注意,WaveNet每層GAU都需要獨立添加Mel-Spectrum語義信息。
Tacotron + WaveNet
一個完整的TTS系統的整體流程即是:注音字符輸入Tacotron中,輸出Mel-Spectrum;Mel-Spectrum輸入WaveNet,輸出聲音波形。
可以參考基於Tacotron漢語語音合成的開源實踐動手訓練一個Tacotron模型。

上圖為Tacotron的92k步時的對齊情況,表征的是編碼器序列(文本,縱軸)和解碼器序列(聲譜,橫軸)是否對應起來。觀察訓練是否達到預期的條件有兩個:1)是否收斂,在上圖中即為文本和聲譜是否對齊,圖中像素點越亮,對齊情況越好;2)loss值低於某閾值,loss值在0.07附近,表明效果已經比較好了。與之對應的,下圖為Tacotron的140k步時的對齊情況,像素點模糊,loss值為0.086,訓練效果並不好。

