Chapter2-1_Voice Conversion(Feature Disentangle)
文章目錄
- 1 什么是Voice Conversion
- 2 實(shí)際實(shí)現(xiàn)中的細(xì)節(jié)
- 3 根據(jù)數(shù)據(jù)集分類
- 4 Feature disentangle
- 5 訓(xùn)練技巧
本文為李弘毅老師【Voice Conversion - Feature Disentangle】的課程筆記,課程視頻youtube地址,點(diǎn)這里👈(需翻墻)。
下文中用到的圖片均來自于李宏毅老師的PPT,若有侵權(quán),必定刪除。
文章索引:
上篇 - 1-7 Language Modeling
下篇 - 2-2 CycleGAN and StarGAN
總目錄
1 什么是Voice Conversion
Voice Conversion指的就是輸入一段聲音,輸出另一段聲音。這兩段聲音的文字內(nèi)容是一樣的,但其他的某些方面是不一樣的。
這個(gè)某些方面指的是什么呢?
(1)說話人(Speaker)的轉(zhuǎn)變。就是讓這段語音聽起來像是另一個(gè)人在說一樣。
- 不同的人說同樣一段話,會有不同的效果;
- 可以用來詐騙(Deep fake);
- 做個(gè)性化的語音轉(zhuǎn)換,比如小孩一個(gè)人在家,別人敲門時(shí),可以用大人的聲音回答;
- 保護(hù)個(gè)人隱私,從聲音中可以獲取一個(gè)人很多的信息。
(2)說話風(fēng)格(Speaking Style)的轉(zhuǎn)換。
- 說話情緒的轉(zhuǎn)變,有些人說話很溫柔,想要嚴(yán)厲批評別人的時(shí)候,可以用這個(gè);
- Normal to Lombard。Normal是指正常環(huán)境下說話的聲音,Lombard是指在酒吧這種嘈雜環(huán)境下說話的聲音。做這個(gè)的原因是,也許有一天,我們的機(jī)器人需要在嘈雜的環(huán)境下說話,轉(zhuǎn)成Lombard可以讓別人聽的更清楚。
- Whisper to Normal。悄悄話轉(zhuǎn)成正常人說話的聲音。也許我們在圖書館或者哪里用很輕的聲音打電話時(shí),希望電話另一頭的人聽到的是正常的聲音。
- 唱歌技巧轉(zhuǎn)換。比如加彈唇,加顫音。
(3)增強(qiáng)說人話的可理解性(Improving Intelligibility)。
- 說話有障礙的人群說的話,可以被轉(zhuǎn)化成更容易理解的聲音。
- 口音轉(zhuǎn)換。比如讓中國人說英文時(shí),聽不出中國人在說的感覺。
(4)數(shù)據(jù)增強(qiáng)(Data Augmentation)
- 擴(kuò)大數(shù)據(jù)集。
2 實(shí)際實(shí)現(xiàn)中的細(xì)節(jié)
在實(shí)際的實(shí)現(xiàn)中,我們往往會假定輸入和輸出的長度是一致的,這樣會讓我們的模型比較簡單,一個(gè)encoder就夠了。同時(shí),輸出的聲音特征向量不能直接作為語音輸出,還差個(gè)相位,轉(zhuǎn)化為語音時(shí),還需要一個(gè)vocoder。這個(gè)vocoder如果做的不好,就會讓我們合成的聲音聽起來比較假,一聽就聽出來是合成的了。
這次不講vocoder,只講voicer conversion的部分。
3 根據(jù)數(shù)據(jù)集分類
用于語音轉(zhuǎn)換的數(shù)據(jù)集可以是成對的(parallel data),也可以是不成對的(unparallel data)。
成對就是指,同樣一段話,讓不同的人念一遍。這樣的數(shù)據(jù)往往成本比較高,很難找到很多。如果有這樣的數(shù)據(jù)的話,硬train一發(fā),就可以了。
不成對就是每個(gè)說話人說的話,甚至語言都是不一樣的。這樣的數(shù)據(jù)往往比較好找。這里就需要借助于圖像中風(fēng)格轉(zhuǎn)換的一些技術(shù)。Feature Disentangle,顧名思義,就是說我們的聲音信號中包含著各種各樣的特征,有關(guān)于內(nèi)容的特征,有關(guān)于說話人的特征,有背景噪音的特征等等。我們的目的就是把這些特征給分離開來,然后如果要做speaker的轉(zhuǎn)換的話,就把speaker這部分的特征替換掉就可以了。
4 Feature disentangle
下面在描述時(shí),以speaker的轉(zhuǎn)換為例。同樣的方法也可以用來轉(zhuǎn)換其他的特征。
假設(shè)我們今天有一個(gè)content encoder可以提取出語音中的文字信息;又有一個(gè)speaker encoder可以無視文字信息,只提取出說話人的說話特征;還有一個(gè)decoder吃content encoder和speaker encoder的輸出,然后可以吐出speaker encoder說話人說出content encoder內(nèi)容的語音了。這就實(shí)現(xiàn)了voice conversion。
那么,要怎么訓(xùn)練這兩個(gè)encoder加上一個(gè)decoder呢?訓(xùn)練的總體方法和auto-encoder非常相似,就是經(jīng)過encoder之后,會有一個(gè)特征,然后再把這個(gè)特征放進(jìn)decoder里之后,希望得到輸入盡可能一致的聲音信號。但是,如果完全按照auto-encoder的方法來訓(xùn)練的話,模型并不知道要把兩個(gè)encoder分為content和speaker兩部分,兩個(gè)encoder學(xué)成一樣的也是完全有可能的。如何讓模型知道要學(xué)一個(gè)content的特征,一個(gè)speaker的特征就是voice conversion和auto-encoder的區(qū)別所在。
目前主要有以下幾種方法:
(1)用one-hot向量來代替speaker encoder
一種做法就是,我們干脆不要這個(gè)speaker encoder了。我們用一個(gè)one-hot encoder的向量來表示是哪個(gè)說話人說的。這個(gè)做法的前提是,我們知道是哪個(gè)說話人說的,且這個(gè)說話人屬于一個(gè)已知的有限集合,如果有一個(gè)新的說話人進(jìn)來,就需要重train這個(gè)模型。這個(gè)做法的另一個(gè)缺點(diǎn)是,沒有辦法保證content encoder的輸出中,不包含說話人相關(guān)的特征,不過這個(gè)可以通過控制encoder輸出的維度來加以限制。此法雖然看似很簡單,但卻會有還不錯(cuò)的結(jié)果。
(2)Pretrained Encoder
另一種做法就是我們先事先train好一個(gè)speaker embedding的模型來當(dāng)作這個(gè)speaker encoder,然后再訓(xùn)練的時(shí)候,只需要微調(diào)一下這個(gè)speaker encoder就可以了。至于content encoder的部分,我們也可以用一個(gè)事先train好的語音識別的模型來做這個(gè)encoder。一般的語音識別的模型都是輸出的文字,不太好直接放上去,一個(gè)比較好的content encoder就是HMM中用來計(jì)算輸入的acoustic feature屬于哪個(gè)state的那個(gè)DNN。
這個(gè)方案是工業(yè)界比較常用的方案。
(3)Adversarial Training
還有一種思路就是在訓(xùn)練content encoder的時(shí)候引入對抗學(xué)習(xí)。我們會添加一個(gè)speaker classifier作為discriminator,用來區(qū)分這句或是哪個(gè)說話人說的,而content encoder就要做到讓speaker classifier區(qū)別不了這句話是哪個(gè)人說的,這樣就可以盡可能地保證content encoder中不包含說話人的特征。
(4)設(shè)計(jì)網(wǎng)絡(luò)
這里借用了image style transfer中的思想來實(shí)現(xiàn)feature dsentangle。首先,會在content encoder這里加上Instance Normalization來去除說人話的相關(guān)特征。然后會在decoder上加入一個(gè)Adaptive Instance Normalization來加入說話人的特征。
IN(Instance Normalization)就是對輸出特征的每一個(gè)channel做normalization,因?yàn)槊恳粋€(gè)channel其實(shí)代表了模型捕捉到的聲音信號中的某一個(gè)特征,將這些特征normalize之后,就可以把全局的特征抹去了,也就抹去了說話人的特征。
AdaIN(Adaptive Instance Normalization)是會先對decoder輸出的特征加上一個(gè)IN,消除說話人的信息,然后再結(jié)合speaker encoder的輸出,把說話人的信息,也就是全局信息給加上。
5 訓(xùn)練技巧
由于受到訓(xùn)練數(shù)據(jù)的限制,我們在類似auto-encoder這樣traning的時(shí)候,從content這一路過來的聲音和speaker這一路過來的都是同一個(gè),而我們在testing的時(shí)候,卻希望content這一路的聲音,和speaker這一路過來的不是同一個(gè)人。這樣我們的模型在testing的時(shí)候,表現(xiàn)就會不太好。
事實(shí)上,我們在訓(xùn)練的時(shí)候沒法得到不同speaker從兩路過來輸出結(jié)果的ground truth,所以也只能這樣訓(xùn)練。
為了解決這個(gè)問題,我們可以做2nd stage的training。這次訓(xùn)練時(shí),兩路過來的speaker時(shí)不同的,然后我們會把最終的輸出放到一個(gè)discriminator里去判斷這句話是否真實(shí),我們希望輸出越真實(shí)越好。同時(shí),也會把輸出放到一個(gè)speaker classifier當(dāng)中去,來對進(jìn)行speaker的判斷。不過,這樣直接train的話,很難train,我們還需要在另外加一個(gè)pather作為補(bǔ)償器,這個(gè)patcher和decoder吃一樣的輸入,然后把輸出加到decoder的輸出上去。相當(dāng)于給輸出打了一個(gè)打補(bǔ)丁。這個(gè)補(bǔ)丁在1st stage training的時(shí)候是不需要的。
這樣的做法可以讓模型的效果提升很多。
總結(jié)
以上是生活随笔為你收集整理的Chapter2-1_Voice Conversion(Feature Disentangle)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 2130. 链表最大孪
- 下一篇: RDD 编程