摘要:人臉表情動畫是計算機圖形學(xué)的重要研究領(lǐng)域之一,在影視和游戲中的虛擬人的應(yīng)用促進了它的發(fā)展,它主要研究若干種典型表情的產(chǎn)生以及利用已有表情產(chǎn)生中間過渡表情。本文主要介紹了表情動畫的研究現(xiàn)狀,并且設(shè)計實現(xiàn)了基于文本驅(qū)動的人臉表情變化系統(tǒng)。
關(guān)鍵詞:表情;文本驅(qū)動;人臉動畫
中圖分類號:TP391.4 文獻標識碼:A 文章編號:1007-9599 (2012) 15-0000-02
1 人臉動畫的研究背景
隨著信息技術(shù)的高速發(fā)展,人們己不滿足于過去的人機交互方式,尋求高度人性化的、對人友好的人機交互技術(shù)并將其實用化的呼聲越來越高。人與人的信息交流是多種信息同時傳遞的過程,因此,多模態(tài)的交互方式是一種發(fā)展趨勢。人們交談時,不但會傾聽對方的聲音,還通過觀察對方的面部活動(諸如嘴唇運動和面部表情等),來更加準確、全面地掌握對方所傳遞的信息,并據(jù)此來輔助獲得對方的心理活動、情緒變化等潛在的信息。
正由于人臉在信息傳遞中的重要作用,人們從古至今一直在探求各種表達人臉的方法。隨著計算機技術(shù)和先進設(shè)備的發(fā)展,人們開始利用信息技術(shù)對人臉進行數(shù)字化建模,并開始關(guān)注于合成富有真實感的人臉。隨著信息化的日益加快和人臉語音動畫技術(shù)的不斷發(fā)展,語音同步的人臉動畫在視聽覺信息處理、醫(yī)學(xué)輔助系統(tǒng)、教學(xué)輔助系統(tǒng)、感知學(xué)實驗研究、多媒體和數(shù)字娛樂等領(lǐng)域表現(xiàn)出越來越大的潛在應(yīng)用價值[1]。類似于應(yīng)用在聽覺障礙患者的聽覺輔助系統(tǒng),輔助其完成語音識別過程;應(yīng)用于發(fā)聲障礙患者的發(fā)聲訓(xùn)練,通過虛擬口腔的發(fā)音動作幫助矯正發(fā)聲;應(yīng)用于心理學(xué)或者感知學(xué)方面;應(yīng)用于游戲或者電影中的虛擬角色等等。
2 系統(tǒng)功能分析
2.1 TTS中相關(guān)事件的解釋
TTS 引擎通過 Events結(jié)構(gòu)來把事件信息傳遞給應(yīng)用程序。應(yīng)用程序可以調(diào)用ISpEventSource::SetInterest 來設(shè)置感興趣的事件。這個函數(shù)也可以通過ISpVoice來調(diào)用,因為它是繼承ISpEventSource的。程序還可以調(diào)用ISpEventSource::GetEvents來獲得事件的詳細信息。
以下是與TTS引擎相關(guān)的事件,它是SPEVENTENUM的子集。
typedef enum SPEVENTENUM
{
//--- TTS engine
SPEI_START_INPUT_STREAM = 1,
SPEI_END_INPUT_STREAM = 2,
SPEI_VOICE_CHANGE = 3, // LPARAM_IS_TOKEN
SPEI_TTS_BOOKMARK = 4, // LPARAM_IS_STRING
SPEI_WORD_BOUNDARY = 5,
SPEI_PHONEME = 6,
SPEI_SENTENCE_BOUNDARY = 7,
SPEI_VISEME = 8,
SPEI_TTS_AUDIO_LEVEL = 9
} SPEVENTENUM;
SPEVENT結(jié)構(gòu)包含了不同的事件各種信息。應(yīng)用程序可以根據(jù)不同的事件類型來分析這些信息。結(jié)構(gòu)體中,ulStreamNum是對應(yīng)于ISpVoice::Speak 或者 ISpVoice::SpeakStream 的返回值。
SPEI_START_INPUT_STREAM :當(dāng)輸出對象開始從一個某個流中獲取輸出內(nèi)容時發(fā)生此事件,eEventId域等于SPEI_START_INPUT_STREAM,其他的域無意義。
SPEI_END_INPUT_STREAM:當(dāng)輸出對象從某個流中取得最后的輸出內(nèi)容時,發(fā)生此事件。其它域無意義。
SPEI_VOICE_CHANGE:當(dāng)輸入的文本或流被XML標簽改變其相關(guān)屬性時發(fā)生此事件;每次調(diào)用Speak函數(shù)時也會發(fā)生此事件。
SPEI_TTS_BOOKMARK:表示獲得一個書簽標簽事件??梢栽谳斎氲奈谋局胁迦霑炛噶?bookmark>.
SPEI_WORD_BOUNDARY: 當(dāng)?shù)竭_一個新單詞時發(fā)生,即表明一個新單詞開始
SPEI_PHONEME:一個音素的邊界
SPEI_SENTENCE_BOUNDARY:一個新句子的邊界。
SPEI_VISEME:表示到達了一個新的嘴形。(每個單詞的發(fā)音都需要不同的嘴形配合)。
SPEI_TTS_AUDIO_LEVEL:表示音頻到達了一個指定的合成量級。
2.2 人臉技術(shù)的三角剖分
(1)三角剖分:假設(shè)V是二維實數(shù)域上的有限點集,邊e是由點集中的點作為端點構(gòu)成的封閉線段,E為e的集合。那么該點集V的一個三角剖分T=(V,E)是一個平面圖G,該平面圖滿足條件:
1)除了端點,平面圖中的邊不包含點集中的任何點。
2)沒有相交邊。
3)平面圖中所有面都是三角面,且所有三角面的合集是散點集V的凸包。
(2)Delaunay三角剖分的定義
在實際中運用的最多的三角剖分是Delaunay三角剖分,它是一種特殊的三角剖分。先從Delaunay邊說起:
Delaunay邊:假設(shè)E中的一條邊e(兩個端點為a,b),e若滿足下列條件,則稱之為Delaunay邊:存在一個圓經(jīng)過a,b兩點,圓內(nèi)(注意是圓內(nèi),圓上最多三點共圓)不含點集V中任何其他的點,這一特性又稱空圓特性。
Delaunay三角剖分:如果點集V的一個三角剖分T只包含Delaunay邊,那么該三角剖分稱為Delaunay三角剖分。
(3)三角剖分的特性
以下是三角剖分所具備的優(yōu)異特性:
1)最接近:以最近臨的三點形成三角形,且各線段(三角形的邊)皆不相交。
2)唯一性:不論從區(qū)域何處開始構(gòu)建,最終都將得到一致的結(jié)果。
3)最優(yōu)性:任意兩個相鄰三角形形成的凸四邊形的對角線如果可以互換的話,那么兩個三角形六個內(nèi)角中最小的角度不會變大。
4)最規(guī)則:如果將三角網(wǎng)中的每個三角形的最小角進行升序排列,則三角網(wǎng)的排列得到的數(shù)值最大。
5)區(qū)域性:新增、刪除、移動某一個頂點時只會影響臨近的三角形。
6)具有凸多邊形的外殼:三角網(wǎng)最外層的邊界形成一個凸多邊形的外殼。
理論上為了構(gòu)造三角網(wǎng),Lawson提出的局部優(yōu)化過程LOP(Local Optimization Procedure),一般三角網(wǎng)經(jīng)過LOP處理,即可確保成為三角網(wǎng),其基本做法如下所示:
1)將兩個具有共同邊的三角形合成一個多邊形。
2)以最大空圓準則作檢查,看其第四個頂點是否在三角形的外接圓之內(nèi)。
3)如果在,修正對角線即將對角線對調(diào),即完成局部優(yōu)化過程的處理。
LOP處理過程如下圖所示:
上述基于散點的構(gòu)網(wǎng)算法理論嚴密、唯一性好,網(wǎng)格滿足空圓特性,較為理想。由其逐點插入的構(gòu)網(wǎng)過程可知,遇到非Delaunay邊時,通過刪除調(diào)整,可以構(gòu)造形成新的Delaunay邊。在完成構(gòu)網(wǎng)后,增加新點時,無需對所有的點進行重新構(gòu)網(wǎng),只需對新點的影響三角形范圍進行局部聯(lián)網(wǎng),且局部聯(lián)網(wǎng)的方法簡單易行。同樣,點的刪除、移動也可快速動態(tài)地進行。但在實際應(yīng)用當(dāng)中,這種構(gòu)網(wǎng)算法當(dāng)點集較大時構(gòu)網(wǎng)速度也較慢,如果點集范圍是非凸區(qū)域或者存在內(nèi)環(huán),則會產(chǎn)生非法三角形。
人臉模型采用預(yù)先設(shè)計好的三維點,實現(xiàn)一個簡單的人臉模型。共75個三維點。
2.3 紋理映射
在三維圖形中,紋理映射(Texture Mapping)的方法運用得最廣,尤其描述具有真實感的物體。比如繪制一面磚墻,就可以使用一幅具有真實感的圖像或者照片作為紋理貼到一個矩形上,這樣,一面逼真的磚墻就畫好了。如果不用紋理映射的方法,這墻上的每一塊磚都要作為一個獨立的多邊形來繪制。另外,紋理映射能夠保證在變換多邊形時,多邊形上的紋理也會隨之變化。例如,用透視投影模式觀察墻面時,離視點遠的墻壁的磚塊的尺寸就會縮小,而離視點近的就會大些,這些是符合視覺規(guī)律的。紋理對象通過一個單獨的數(shù)字來標識。這允許OpenGL硬件能夠在內(nèi)存中保存多個紋理,而不是每次使用的時候再加載它們,從而減少了運算量,提高了速度。
紋理映射是真實感圖像制作的一個重要部分,運用它可以方便的制作出極具真實感的圖形而不必花過多時間來考慮物體的表面細節(jié)。與顯示列表一樣,紋理對象通過一個單獨的數(shù)字來標識。這允許OpenGL硬件能夠在內(nèi)存中保存多個紋理,而不是每次使用的時候再加載它們,從而減少了運算量,提高了速度。
2.4 人臉表情變化
在對基本表情的調(diào)節(jié)中,只需要調(diào)節(jié)基本變化數(shù)組(矩陣),基本的表情的參數(shù)預(yù)先已經(jīng)定義好,它們的初值都是0.0f ,這代表中性,也就是說開始的表情顯示為中性。表情的變化其實是實現(xiàn)每個三維點的微變,這些都是通過變化矩陣來實現(xiàn)的。三維點的微變導(dǎo)致整個三角網(wǎng)也要變化,三角索引變化直接影響紋理圖像的各個部位,通過調(diào)節(jié)眼睛、眉毛、還有嘴巴這些部位對應(yīng)的三維信息,就可以實現(xiàn)表情的變化。詳細的參數(shù)信息可以見InitVertexOrder()這個函數(shù)中的初始化信息。如初始化中有:m_iFrom[1] = 0; m_iTo[1] = 11;表示的就是第一個三維點的位置偏移范圍從0到11,這樣整個三維點在空間中的位置就有了明顯的變化,可以實現(xiàn)表情的調(diào)節(jié)。如以下代碼:
glBegin(GL_LINES);
glVertex3f(m_iX[m_iFrom[i]],
m_iY[m_iFrom[i]],
m_iZ[m_iFrom[i]]);
glVertex3f(m_iX[m_iTo[i]],
m_iY[m_iTo[i]],
m_iZ[m_iTo[i]]);
glEnd();
通過改變m_iFrom[i] 表示每個點對應(yīng)的三個坐標的初始位置標號,m_iTo[i]表示每個點三個坐標的最終坐標的標號,在這個m_iFrom[i]到m_iTo[i]的過程,是一個位置變化的過程。其中g(shù)lBegin(GL_LINES)代表的是連接兩個點,即在視圖中看到的一條線,到glEnd()表示劃線結(jié)束。
參考文獻:
[1]周維.漢語語音同步的真實感三維人臉動畫研究:學(xué)位論文,中國科學(xué)技術(shù)大學(xué),模式識別與智能系統(tǒng),2008