聽說現(xiàn)在趕火車刷臉就進站了!跟臉有關的最新玩法是你說什么,表情包就演什么
十一結束,假期開工返鄉(xiāng)潮仍在繼續(xù)。就在昨日,一則視頻刷爆朋友圈。
視頻里,北京、廣州、上海、成都、武漢的火車站都相繼開通自助“刷臉”進站通道。
乘客驚呼“連化妝和美瞳都能識別出來,太神奇!”
其實,刷臉早已不是什么新鮮事了!我們今天來聊一個更好玩的事兒,那就是你說話,AI給你配表情。讓你做個真正的虛擬人兒。
文章略枯燥,技術性的話術有點多,普通小白估計看起來夠嗆。技術宅們,上!
SIGGRAPH 2017曾經(jīng)收錄過英偉達的一篇關于3D動畫人物面部表情研究的論文:Audio-Driven Facial Animation by Joint End-to-End Learning of Pose and Emotion,在該論文中,英偉達展示了通過音頻輸入實時、低延遲驅動3D面部表情的機器學習技術,從而實現(xiàn)了虛擬人物面部表情和音頻輸入***配合。
圖1. 根據(jù)語音推斷臉部動畫的深度神經(jīng)網(wǎng)絡
讓我們先從這張圖開始吧。以下“我們”一詞為論文作者的***人稱。
當網(wǎng)絡的輸入為時長大約半秒的音頻時,輸出是與音頻窗口的中心相對應的固定拓撲網(wǎng)格的3D頂點位置。該網(wǎng)絡還有一個用于描述情緒狀態(tài)的二次輸入。其神經(jīng)網(wǎng)絡直接從訓練數(shù)據(jù)中學習情緒狀態(tài),不進行任何形式的預標記(pre-labeling)。
我們提出了一種通過低延遲的實時音頻輸入驅動3D面部動畫的機器學習算法。我們的深度神經(jīng)網(wǎng)絡可以學習從輸入音頻波形到臉部模型的3D頂點坐標的映射,同時還能找到一個簡潔的隱藏代碼,這個代碼可以用來區(qū)分只根據(jù)音頻無法解釋的面部表情變化。在進行干預時,隱藏代碼可以作為面部動畫情緒狀態(tài)的直覺控制(intuitive control)。
我們使用基于視覺的傳統(tǒng)表演捕捉法(performance capture methods)獲取了3-5分鐘的高質量動畫數(shù)據(jù),并用這些數(shù)據(jù)對神經(jīng)網(wǎng)絡進行了訓練。我們的主要目標是模擬單個表演者的說話風格;在用戶研究中,當我們用不同性別、口音或講不同語言的說話者的語音驅動模型時,我們也能得到不錯的結果。這些結果可應用于游戲對話、低成本本地化、虛擬現(xiàn)實頭像和遠程呈現(xiàn)等技術中。
CCS 概念: • 計算方法論→動畫;神經(jīng)網(wǎng)絡;基于回歸的監(jiān)督學習;學習隱藏表征;其他關鍵詞:面部動畫、深度學習、音頻
端對端網(wǎng)絡架構
下面我們將闡述該網(wǎng)絡的架構,以及關于音頻處理和從語音內容中分離出情緒狀態(tài)的細節(jié)。
輸入一小段音頻窗口,神經(jīng)網(wǎng)絡的任務是推斷該音頻窗口(window)中心的面部表情。我們將表情直接表示為面部固定拓撲網(wǎng)格中某一無情緒姿態(tài)(neutral pose)的逐頂點差分向量。當訓練好網(wǎng)絡后,我們通過在音頻軌道滑動窗口來將網(wǎng)格變成動畫,在每個時間步長上對網(wǎng)絡進行獨立評估。雖然網(wǎng)絡本身沒有關于前幾幀動畫的記憶,但是在實踐中它可以生成暫時穩(wěn)定的結構。
架構概覽
我們的深度神經(jīng)網(wǎng)絡由一個特殊用途層、10個卷積層以及2個完全連接層構成。我們將其切分為3個概念單元,如圖1和表1所述。
我們先將音頻窗口輸入到一個共振峰分析網(wǎng)絡中,生成一個隨時間變化的語音特征序列,之后我們會用這個序列驅動發(fā)音。該神經(jīng)網(wǎng)絡先利用固定函數(shù)自相關分析從音頻中提取出原始共振峰信息(請看原文第3.2節(jié)),然后再用其中5個卷積層優(yōu)化這些信息。通過訓練,卷積層可以學習提取對面部動畫有用的短期特征(shortterm features),例如語調、重讀和特定音素。第5個卷積層的輸出就是此類特征隨時間變化的抽象表示。
接下來,我們將結果輸入到一個發(fā)音神經(jīng)網(wǎng)絡中。這個網(wǎng)絡由5個卷積層構成,這些卷積層可以分享特征的時序變化,并最終確定一個用于描述音頻窗口中心面部姿態(tài)的抽象特征向量。
將情緒狀態(tài)的(學習)描述作為二次輸入連接到該發(fā)音神經(jīng)網(wǎng)絡中,用以區(qū)分不同的面部表情和說話風格(請看原文第3.3節(jié))。我們將情緒狀態(tài)表示為一個E維向量,直接將其與發(fā)音神經(jīng)網(wǎng)絡每層的輸出連接在一起,這樣之后的層就可以相應地改變它們的行為。
每個l層都會輸出 Fl×Wl×Hl激活函數(shù),其中Fl 是抽象特征映射的數(shù)量,Wl是時間軸的維度,Hl是共振峰周的維度。在共振峰分析網(wǎng)絡中,我們使用1×3的strided convolution逐漸減小Hl,逐漸增加Fl,也就是使原始共振峰信息向抽象特征偏移,直到Hl= 1且Fl = 256為止。同樣,在發(fā)音神經(jīng)網(wǎng)絡中,我們利用3×1卷積減小Wl,也就是通過結合不同時間域(temporal neighborhood)的信息來對時間軸進行二次采樣(subsample)。
我們選擇了表1中列出的特定參數(shù),因為我們發(fā)現(xiàn)這些參數(shù)在用數(shù)據(jù)集訓練的過程中始終表現(xiàn)良好,同時也保證了合理的訓練次數(shù)。雖然得出的結果對層數(shù)或特征映射并不是很敏感,但是我們發(fā)現(xiàn)我們必須對兩個不同階段中的卷積進行調整以避免出現(xiàn)過度擬合。重要的是,共振峰分析網(wǎng)絡在時間軸的每一個點上都執(zhí)行相同的操作,因此我們可以在不同的時間偏移(time offsets)中使用相同的訓練樣本。
發(fā)音神經(jīng)網(wǎng)絡輸出一系列共同表示目標面部姿態(tài)的256+E抽象特征,。我們將這些特征輸入到一個輸出神經(jīng)網(wǎng)絡(output network)中,以在跟蹤網(wǎng)格中生成5022個控制頂點的最終3D位置。該輸出網(wǎng)絡是一對可以對數(shù)據(jù)進行簡單線性轉換的全連接層。***層將輸入特征集映射到線性基本函數(shù)的權重上,第二層計算對應基向量(basis vectors)的加權總和,用它來表示最終頂點位置。我們將第二層預設為150個預先計算的PCA模塊,這些模塊總體可以解釋訓練數(shù)據(jù)99.9%的變化。理論上,我們可以用一個固定的基準來有效地訓練先前的層,生成150個PCA系數(shù)。但是我們發(fā)現(xiàn),在訓練中任由基向量自行變化得出的結果反而更好一些。
音頻處理
網(wǎng)絡的主要輸出是語音音頻信號,在信號輸入到網(wǎng)絡之前我們將其轉換為16 kHz單聲道信號。在試驗中,我們對每個聲道的音量(volume)進行正則化,以確保可以利用完整的動態(tài)范圍[-1,+1],但是我們并沒有進行任何諸如動態(tài)范圍壓縮、降噪任何處理或預加強濾波器(pre-emphasis filter)的處理。
表1中的自相關層將輸入音頻窗口轉化為一個簡潔的2D表達,之后的卷積層?!墩Z音生成source–filter模型》(filter model of speech production)[Benzeghiba等人. 2007;Lewis 1991]這篇論文啟發(fā)我們提出了這種方法,他們將音頻信號建模為線性濾波器(聲道)和激勵信號(聲帶)的混合體。眾所周知,線性濾波器的共振頻率(共振峰)攜帶有關于語音的音素內容的重要信息。激勵信號可以表示說話者聲音的音調、音色和其他特征,我們假設對面部動畫而言這種信號并不重要,因此我們主要借助共振峰來改善網(wǎng)絡對不同說話者的泛化。
線性預測編碼(LPC)執(zhí)行信號濾波器分離(source–filter separation)的標準方法。LPC將信號斷為數(shù)個短幀信號,根據(jù)***自相關系數(shù)K計算出每幀信號的線性濾波器系數(shù),并執(zhí)行反向濾波以提取激勵信號。濾波器的共振頻率完全取決于自相關系數(shù)的值,因此我們選擇跳過大部分處理步驟,將自相關系數(shù)直接作為瞬時共振峰信息的表征。這種方法在直覺上可行,因為自相關系數(shù)本質上表示的是一種壓縮形式的信號,其頻率信息與原始信號的頻譜(power spectrum)基本匹配。這種表示非常適合卷積網(wǎng)絡,因為卷積層可以輕易地學習如何估計特定頻帶的瞬時頻譜。
在試驗中,我們將520ms的音頻作為輸入(關于預計輸出姿態(tài)的260ms歷史樣本和260ms未來樣本)。我們選擇這個數(shù)值的原因是,它可以使我們在不向網(wǎng)絡提供過多數(shù)據(jù)(這樣會導致過度擬合)的情況下捕捉到諸如音素協(xié)同發(fā)音的相關效應。我們將輸出音頻窗口分為64個重疊為2x的音頻幀,這樣每幀音頻都對應16ms(256個樣本),并且連續(xù)的幀數(shù)之間間隔8ms(128個樣本)。在每幀音頻中,我們移除直流分量(DC component),用標準Hann窗口減緩時間域混疊效應(temporal aliasing effects)。***,我們計算出自相關系數(shù)K = 32,總共獲得了64×32個輸入音頻窗口標量。雖然自相關系數(shù)小一點(例如K = 12)也足以確認單個音素,但是我們選擇更多地保留關于原始信號的信息,以確保之后的層也可以檢測出音調變化。
我們的方法不同于語音識別領域先前的絕大多數(shù)方法,這些方法的分析步驟通常都基于某一種專用的方法,例如梅爾頻率倒譜系數(shù)(MFCC)、感知線性預測系數(shù)(PLP)和rasta filtering [Benzeghiba等人. 2007]。這些方法之所以被廣泛采用是因為它們可以很好地線性分離音素,非常適合隱馬爾科夫模型(Hidden Markov Models)。在我們的早期測試中,我們嘗試了幾種不同的輸入數(shù)據(jù)表征,結果發(fā)現(xiàn)我們方法的自相關系數(shù)明顯更好。
圖2.表演者不說話時動畫是什么樣?這些是從表演者不說話的訓練集中抽取的樣本幀。
情緒狀態(tài)的表征
根據(jù)語音推斷面部動畫本身就是一個不明確任務,因為同一語音可以對應不同表情。這一點尤其體現(xiàn)在眼睛和眉毛上,因為它們與語音的生成無任何直接關系。用深度神經(jīng)網(wǎng)絡處理此類不明確任務相當困難,因為訓練數(shù)據(jù)必然會涵蓋幾乎相同的語音輸入生成大不相同的輸出姿態(tài)的情況。圖2給出了幾個當輸入音頻剪輯完全無聲音時產(chǎn)生矛盾訓練數(shù)據(jù)的實例。如果網(wǎng)絡除了音頻數(shù)據(jù)還有其他可用的數(shù)據(jù),它就會學習輸出矛盾輸出的統(tǒng)計均值。
我們解決這些不明確任務的方法是向網(wǎng)絡提供一個二次輸入。我們將每個訓練樣本都與一小部分附加的隱藏數(shù)據(jù)關聯(lián)起來,這樣網(wǎng)絡就有足夠的信息用來明確地推斷出正確的輸出姿態(tài)。理想情況下,這些附加數(shù)據(jù)應編碼給定樣本時間域內所有無法根據(jù)音頻本身推斷出的動畫相關特征,包括不同的表情、說話風格和自相關模式等。通俗地說,我們希望二次輸入能代表表演者的情緒狀態(tài)。除了能消除訓練數(shù)據(jù)中的歧義,二次輸入還對推斷很有幫助——它可以使我們能夠將不同的情緒狀態(tài)于同一給定聲帶混合并匹配在一起,以有效地控制得出的動畫。讓動畫實現(xiàn)情緒狀態(tài)的其中一種方法是,根據(jù)明顯的情緒對訓練樣本進行標記或分類[Anderson等人. 2013;Cao等人. 2005;Deng等人. 2006;Wampler 等人. 2007]。
這種方法并不算理想,但是因為它無法保證預定義的標記可以充分消除訓練數(shù)據(jù)中的歧義。我們并沒有選擇依賴預定義的標記,而是采用了一種由數(shù)據(jù)驅動的方法。在這種方法的訓練過程中,網(wǎng)絡自動學習情緒狀態(tài)的簡明表征。這樣只要給出足夠多樣的情緒,我們甚至可以從in-character片段(in-character footage)中提取出有意義的情緒狀態(tài)。我們將情緒狀態(tài)表示為E維向量,其中E是一個可調參數(shù),在測試中我們將其設定為16或24,并初始化從高斯分布中提取出的隨機值的分量(components。)。
給每個訓練樣本都分配這樣一個向量,我們將保存這些隱藏變量的矩陣稱為“情緒數(shù)據(jù)庫”。如表1所示,發(fā)音神經(jīng)網(wǎng)絡所有的層的激活函數(shù)后都附有情緒狀態(tài)。這樣情緒狀態(tài)就作為損失函數(shù)(請看原文第4.3節(jié))computation graph(計算圖)的一部分;由于E是一個可訓練的參數(shù),因此在進行反向傳播時它會隨著網(wǎng)絡權重的更新而更新。E維度兩種效應之間的均衡。如果E太低,情緒狀態(tài)就無法消除訓練數(shù)據(jù)變化的歧義,導致出現(xiàn)不理想的音頻反映。如果E太高,所有情緒狀態(tài)就會變得太過狹義,無法用于一般推斷(請看原文第5.1節(jié))。
情緒數(shù)據(jù)庫的有這樣一個潛在問題:如果我們不能有效地限制情緒數(shù)據(jù)庫,它可能會學習明確地保存音頻中呈現(xiàn)的信息。如果不加限制,它可能會保存確定大部分面部表情的E blend形狀權重(E blend shape weights),弱化音頻的作用,并使網(wǎng)絡無法處理訓練中未出現(xiàn)出的數(shù)據(jù)。
按照設計,音頻數(shù)據(jù)提供的信息應僅限于520ms間隔內的短期效應。因此,我們可以通過禁止情緒狀態(tài)包含短期變化來防止它們包含重疊信息。情緒狀態(tài)專門包含長期效應對推斷也很有幫助——當情緒狀態(tài)保持不變時,我們也希望網(wǎng)絡能生成合理的動畫。為此,我們可以通過在損失函數(shù)中引入一個專用的正則項來懲罰情緒數(shù)據(jù)庫中的快速變化,這樣在訓練過程中情緒狀態(tài)就會逐漸平緩。我們的方法有一個較大的局限,我們無法正確模擬眨眼和眼部動作,因為它們與音頻無任何關系,也無法通過緩慢變化的情緒狀態(tài)來表示。
雖然在發(fā)音神經(jīng)網(wǎng)絡所有的層上都連接情緒狀態(tài)似乎有些多余,但是我們發(fā)現(xiàn)在實踐中這樣做可以大幅改善結果。我們認猜測這是因為情緒狀態(tài)的作用是在多個抽象層(abstraction level)上控制動畫,通常抽象層越高學習難度就越大。連接靠前的層可以實現(xiàn)對精細動畫特征(如協(xié)同發(fā)音)的精確控制,而連接靠后的層則只能加強對輸出姿態(tài)的直接控制。直覺上,當單個姿態(tài)得到很好的表示時,情緒狀態(tài)訓練早期應連接靠后的層,而到了訓練后期則應連接靠前的層。