论文阅读 - AUTOVC: Zero-Shot Voice Style Transfer with Only Autoencoder Loss
文章目錄
- 1 概述
- 2 模型架構
- 3 模塊解析
- 3.1 獲取梅爾頻譜
- 3.2 speaker encoder
- 3.3 AutoVC
- 3.4 Vocoder
- 4 關鍵部分
- 參考資料
1 概述
voice conversion這個任務的目標是輸入兩個音頻,其輸入是兩段音頻,一段音頻稱為content_audio,另一段稱為speaker_audio。模型將抽取content_audio中的說話內容特征和speaker_audio中的語者特征,將兩者結合,輸出用speaker_audio中的說話人的聲音說content_audio中的內容的音頻。
這個任務的模型一般會有兩個問題:
- 需要成對的數據,即需要多個人說同一句話的數據
- 無法用在沒有在訓練數據中出現過的人聲上
AutoVC成功解決了這兩個問題,也就是它不需要成對的數據,同時也可以做到zero-shot conversion。
官方給出的demo可見https://auspicious3000.github.io/autovc-demo/。效果還是很不錯的,但是在中文語音上的表現就很差了。要在中文上做,就需要在中文數據集上重新訓練了。中文的訓練數據還是比較好找的,只要是知道每一句話是誰說的數據集都可以,比如ASR的數據集就都是可以拿來用的。
2 模型架構
voice conversion的整體流程如下圖2-1所示。
首先會對輸入的content_wav和speaker_wav抽取梅爾頻譜,接著將抽取得到的speaker_mel過一個speaker_embedding模型,抽取語者的特征,然后將語者特征和content_mel一起輸入到AutoVC當中進行融合,得到融合之后的梅爾頻譜merged_mel,最后把merge_mel過vocoder就得到了最終的輸出音頻。
這里用紫色方框框出的是需要訓練的部分,用土色方框框出的是可以更換的部分。
3 模塊解析
3.1 獲取梅爾頻譜
這個模塊的輸入時聲音信號,輸出是聲音信號的梅爾頻譜,一般是80維的。
不同的模型在抽取梅爾頻譜時,參數會有所不同,而這里的梅爾頻譜也影響了輸入vocoder的梅爾頻譜。因此在使用不同的模型拼成整個流程時,需要對梅爾頻譜的處理做統一,這個在實現的時候是很重要的一步。否則訓練好的模型,和后面的模型接不上了,就挺麻煩的。
3.2 speaker encoder
這個部分是將音頻中語者的特征給抽取出來,輸入是梅爾頻譜,輸出是一個256維的特征。
所謂語者的特征也就是和內容無關,只和說話人有關的特征。這個模型訓練時候的目標是使得同一個人說不同的話輸出相同的256維的向量,使得不同的人說同一句話輸出不同的256維的向量。
這個模型是可以使用預訓練好的模型的,AutoVC中使用的是在VoxCeleb1和Librispeech上預訓練好的Dvector,共3549個語者。
訓練之前,把每個語者說的所有話,分別過一下speaker encoder,并把這些embedding取一個平均,作為這個語者的speaker embedding。
預測的時候,把輸入的speaker_mel過一下speaker encoder,將輸出的特征作為語者的speaker embedding。
這個speaker embedding是一個很重要的特征,如果這個特征不夠好的話,會導致訓練的AutoVC訓練的也不夠好。
我們也可以在中文的語料上重新訓練一下這個模型。也可以拿別人在中文語料上預訓練過的模型,比如MockingBird。
3.3 AutoVC
AutoVC這個模塊才是這篇文章的重點,它由一個content encoder(EcE_cEc?),一個speaker encoder(EsE_sEs?)和decoder組成。這里的EsE_sEs?就是3.2中的speaker encoder,是預訓練好的,所以用灰色來表示。其推理時的示意圖如下圖3-1(a)所示,其訓練時的示意圖如下圖3-1(b)所示。
在圖3-1(a)表示了推理時候的流程圖,X1X_1X1?為content_audio的mel-spectrogram,Z1Z_1Z1?為X1X_1X1?中的內容特征,U1U_1U1?為X1X_1X1?中的語者特征,EcE_cEc?表示抽取內容特征的content encoder,C1C_1C1?是抽取出來的內容特征;X2X_2X2?為speaker_audio的mel-spectrogram,Z2Z_2Z2?為X2X_2X2?中的內容特征,U2U_2U2?為X2X_2X2?中的語者特征,表EsE_sEs?示抽取語者特征的speaker encoder,S2S_2S2?是抽取出來的語者特征;DDD表示融合特征的decoder,X^1→2\hat{X}_{1 \rightarrow 2}X^1→2?表示最終轉換后的mel-spectrogram。
在圖3-1(b)表示了訓練時候的流程圖,訓練時,我們沒有成對的數據,也就是沒有兩個人說同一句話的數據,所以沒有了S2S_2S2?,只有S1S_1S1?。這個S1S_1S1?并不是單個X1X_1X1?經過EsE_sEs?得到的,而是說X1X_1X1?這句話的這個人說的所有的話,分別經過EsE_sEs?之后,取平均得到的,也就是在訓練之前就已經確定了的。X^1→1\hat{X}_{1 \rightarrow 1}X^1→1?表示自重建之后的梅爾頻譜,我們希望它與X1X_1X1?越接近越好。
作者在decoder(DDD)這里還加了一個postnetwork,這個網絡起到一個修正的作用,其輸入是X^1→2\hat{X}_{1 \rightarrow 2}X^1→2?,輸出是R^1→2\hat{R}_{1 \rightarrow 2}R^1→2?,看這個用來表示的符號也可以猜出來,是殘差的意思。有了殘差之后,最終的結果為
X^final1→2=X^1→2+R^1→2(3-1)\hat{X}_{final \ 1 \rightarrow 2} = \hat{X}_{1 \rightarrow 2} + \hat{R}_{1 \rightarrow 2} \tag{3-1} X^final?1→2?=X^1→2?+R^1→2?(3-1)
訓練時的Loss由三部分構成
自重建損失其一:
Lrecon=E[∣∣X^1→1?X1∣∣22](3-2)L_{recon} = E[|| \hat{X}_{1 \rightarrow 1} - X_1 ||^2_2] \tag{3-2} Lrecon?=E[∣∣X^1→1??X1?∣∣22?](3-2)
自重建損失其二:
Lrecon0=E[∣∣X^final1→1?X1∣∣22](3-3)L_{recon0} = E[|| \hat{X}_{final \ 1 \rightarrow 1} - X_1 ||^2_2] \tag{3-3} Lrecon0?=E[∣∣X^final?1→1??X1?∣∣22?](3-3)
內容損失:
Lcontent=E[∣∣Ec(X^final1→1)?C1∣∣1](3-4)L_{content} = E[|| E_c(\hat{X}_{final \ 1 \rightarrow 1}) - C_1 ||_1] \tag{3-4} Lcontent?=E[∣∣Ec?(X^final?1→1?)?C1?∣∣1?](3-4)
總的損失為
L=Lrecon+μLrecon0+λLcontent(3-5)L = L_{recon} + \mu L_{recon0} + \lambda L_{content} \tag{3-5} L=Lrecon?+μLrecon0?+λLcontent?(3-5)
其中,μ\muμ和λ\lambdaλ時用來調整不同loss之間權重的超參數。這些loss都是保證了模型的自重建能力。
3.4 Vocoder
Vocoder的作用是將梅爾頻譜還原回音頻信號,正常情況下,這個模型不用替換。原文中使用的是wavenet,但是wavenet的速度太慢了,一個5秒的音頻要15分鐘才能跑出來,這根本沒法用。
開源之后,作者又提供了訓練好的hifi-gan作為vocoder,hifi-gan就比wavenet快很多了,效果也是不錯的。只是會有一些電音。這個也可以自己finue-tune一下,不過要訓練hifi-gan的話,get_mel這里也要注意一致性的問題。
4 關鍵部分
有人可能會質疑,為什么這樣訓練出來的C1C_1C1?就是內容的特征,就算S1S_1S1?是干凈的語者的特征,C1C_1C1?里就不會也參雜一點語者的特征嗎?
原文中也對這個問題進行了說明,列了一些假設。大前提是S1S_1S1?是干凈的語者特征。
我這里不求甚解,只把直觀的理解說明一下。要保證C1C_1C1?只有內容特征,且是完整的內容特征的方法是,控制C1C_1C1?的維度。開源代碼中,這個維度是32維。
如圖3-2所示,如果C1C_1C1?的維度太大的話,如(a),會把語者的特征也包括進去,這個時候對自重建能力是沒有影響的,但是如果拿C1C_1C1?去訓練一個speaker classification模型的話,模型的準確率就會比較高;如果C1C_1C1?的維度太小的話,如(b),最終自重建出來的誤差會比較大;如果C1C_1C1?的維度剛剛好的話,如?,是的自重建誤差也比較小,用C1C_1C1?去訓練一個speaker classification模型的準確率也比較小。
作者就是按這種方式來確定,下表就是不同C1C_1C1?維度下,得到的自重建誤差和語者分類器準確率的表。
參考資料
[1] AUTOVC: Zero-Shot Voice Style Transfer with Only Autoencoder Loss
[2] https://github.com/auspicious3000/autovc
[3] https://github.com/babysor/MockingBird
[4] https://github.com/jik876/hifi-gan
總結
以上是生活随笔為你收集整理的论文阅读 - AUTOVC: Zero-Shot Voice Style Transfer with Only Autoencoder Loss的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二十七、PHP框架Laravel学习笔记
- 下一篇: python爬虫模拟登录人人网