馬文藝,姜麗莉,范言文
(南京工業(yè)大學(xué)浦江學(xué)院 計(jì)算機(jī)與通信工程學(xué)院,江蘇 南京 210044)
社交軟件已經(jīng)深入人們的生活,而人們使用社交軟件更多的是在以文字、語(yǔ)音、朋友圈等形式在網(wǎng)絡(luò)上進(jìn)行交流。據(jù)此可見(jiàn),人們對(duì)于視頻社交并不敏感,僅有極少部分的情況會(huì)選擇以視頻形式進(jìn)行互動(dòng)。個(gè)人認(rèn)為不選擇使用視頻形式有以下兩種原因:(1)對(duì)于非親友或熟識(shí)的人,大部分人不愿意暴露自己真實(shí)樣貌;(2)不是所有人都有好看的外表,有自信去向他人展現(xiàn)。
基于此,以模型化代替本身樣貌進(jìn)行社交應(yīng)能成為較優(yōu)解,模型化形式可以在保證互動(dòng)性情況下,有效避免本身樣貌的顯露,有助于線上互動(dòng)聊天。對(duì)于模型,目前正熱門的Live2D是一個(gè)不錯(cuò)的選擇,目前該技術(shù)運(yùn)用領(lǐng)域也在增多,尤其是對(duì)于目前3D技術(shù)與硬件技術(shù)存在不匹配矛盾的直播行業(yè),該技術(shù)未來(lái)還是會(huì)有很好的應(yīng)用前景。
系統(tǒng)架構(gòu)分為五層,從下至上分別為:基礎(chǔ)設(shè)施層、存儲(chǔ)層、業(yè)務(wù)層、接入層、移動(dòng)終端。
業(yè)務(wù)層為整個(gè)系統(tǒng)的中心,負(fù)責(zé)為整個(gè)系統(tǒng)提供服務(wù),響應(yīng)移動(dòng)端用戶的操作,將數(shù)據(jù)返回以及存儲(chǔ)到存儲(chǔ)層。業(yè)務(wù)層包括通訊業(yè)務(wù)、登錄業(yè)務(wù)、賬號(hào)服務(wù)、好友服務(wù)、消息服務(wù)、聊天室服務(wù),其中即時(shí)通信業(yè)務(wù)包括音頻通信、文字通信、虛擬視頻通信業(yè)務(wù)。
移動(dòng)終端也就是客戶端,使用Android技術(shù)開發(fā)的APP,用戶通過(guò)APP可實(shí)現(xiàn)即時(shí)通信功能。本系統(tǒng)核心技術(shù)Live2D+Mlkit運(yùn)行在移動(dòng)終端,Mlkit調(diào)用移動(dòng)終端的相機(jī)獲取實(shí)時(shí)視頻流,調(diào)用CPU對(duì)視頻流進(jìn)行處理與計(jì)算,得到實(shí)時(shí)的人臉坐標(biāo)數(shù)據(jù),通過(guò)自定義的數(shù)據(jù)轉(zhuǎn)換器轉(zhuǎn)換為L(zhǎng)ive2D配置數(shù)據(jù),完成Live2D與人臉動(dòng)作的實(shí)時(shí)同步。
基礎(chǔ)設(shè)施層包括操作系統(tǒng)、服務(wù)器、存儲(chǔ)設(shè)備,主要負(fù)責(zé)服務(wù)的提供與數(shù)據(jù)的存儲(chǔ);存儲(chǔ)層包括MySQL、OSS(對(duì)象存儲(chǔ)),MySQL是關(guān)系型數(shù)據(jù)庫(kù)主要存儲(chǔ)用戶、聊天室、聊天記錄等信息,OSS主要存儲(chǔ)系統(tǒng)中的資源文件,如用戶頭像等;接入層用于連接Android APP與服務(wù)端,使用OkHttp3技術(shù),按照Resultful規(guī)則,GET用于獲取各種系統(tǒng)數(shù)據(jù),POST用于新增系統(tǒng)數(shù)據(jù),PUT用于更新系統(tǒng)數(shù)據(jù),DELTE用于刪除數(shù)據(jù);用戶的每個(gè)操作都是向業(yè)務(wù)層發(fā)送請(qǐng)求,業(yè)務(wù)層再操作存儲(chǔ)層的數(shù)據(jù),為了保證系統(tǒng)易于維護(hù),在業(yè)務(wù)層與存儲(chǔ)層都需要加入日志服務(wù),用于記錄用戶操作日志,當(dāng)系統(tǒng)遇到Bug、崩潰等問(wèn)題時(shí)可根據(jù)日志進(jìn)行回溯。社交軟件需要實(shí)現(xiàn)即時(shí)通信的功能,本系統(tǒng)使用WebSocket技術(shù)在客戶端與服務(wù)端建立持久的連接,保證信息的即時(shí)性。
綜上所述,系統(tǒng)總體架構(gòu)如圖1所示。
圖1 系統(tǒng)總體架構(gòu)圖
本系統(tǒng)客戶端采用Android技術(shù),服務(wù)端使用Java后端技術(shù),通過(guò)客戶端向服務(wù)端、服務(wù)端向客戶端發(fā)送數(shù)據(jù)進(jìn)行交互。
Live2D:日本Cybernoids公司開發(fā)的一種2D繪圖渲染技術(shù),多用于電子游戲,通過(guò)一系列的連續(xù)圖像和人物建模來(lái)生成類似三維模型的二維圖像。
Mlkit:Google的機(jī)器學(xué)習(xí)套件,是一個(gè)移動(dòng)端SDK,提供了強(qiáng)大易用的視覺(jué)和自然語(yǔ)言API來(lái)解決應(yīng)用程序中常見(jiàn)的問(wèn)題。
Fastjson:Alibaba的一個(gè)可以將Java對(duì)象轉(zhuǎn)為JSON數(shù)據(jù)、將JSON轉(zhuǎn)為Java對(duì)象的Java庫(kù)。
OkHttp3:一個(gè)主流的網(wǎng)絡(luò)請(qǐng)求的開源框架。
Spring Boot:為快速啟動(dòng)且最小化配置的Spring應(yīng)用而設(shè)計(jì),簡(jiǎn)化了傳統(tǒng)Spring應(yīng)用的開發(fā)。簡(jiǎn)化了煩瑣的配置項(xiàng)目、提供了內(nèi)置的Http服務(wù)器、簡(jiǎn)化了Maven的依賴配置。有助于開發(fā)者快速構(gòu)建架構(gòu),進(jìn)行開發(fā),幫助開發(fā)者專注于需求業(yè)務(wù)的開發(fā)。
WebSocket:一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議。
MySQL:關(guān)系型數(shù)據(jù)庫(kù),主要用于存儲(chǔ)用戶、聊天室等數(shù)據(jù)。
Redis:Key-Value型數(shù)據(jù)庫(kù),用于用戶Token數(shù)據(jù)的緩存。
客戶端通過(guò)OkHttp3和WebSocket與服務(wù)端通信,為用戶提供包括賬號(hào)登錄、賬號(hào)創(chuàng)建、完善個(gè)人信息、文字通信、語(yǔ)音通信、虛擬視頻通信、搜索好友、添加好友、修改好友備注、刪除好友、創(chuàng)建聊天室、刪除聊天室等功能。其中文字通信需要支持顏文字的發(fā)送,語(yǔ)音通信擁有關(guān)閉麥克風(fēng)、關(guān)閉揚(yáng)聲器功能;虛擬視頻通信擁有相機(jī)翻轉(zhuǎn)、切換成語(yǔ)音功能。用戶功能用例圖如圖2所示。
圖2 用戶功能用例圖
服務(wù)端功能應(yīng)該包括權(quán)限驗(yàn)證、Token頒發(fā)、WebSocket服務(wù)、數(shù)據(jù)提供服務(wù)、數(shù)據(jù)存儲(chǔ)服務(wù)等功能。權(quán)限驗(yàn)證需要驗(yàn)證用戶Token是否合法、是否過(guò)期等功能;Token即為用戶訪問(wèn)服務(wù)端的令牌,每位每次登錄都會(huì)生成獨(dú)一無(wú)二的Token;WebSocket服務(wù)需要支持用戶文字、語(yǔ)音、視頻通信,同時(shí)還包括接受用戶語(yǔ)音請(qǐng)求、視頻請(qǐng)求以及請(qǐng)求結(jié)果的消息,實(shí)時(shí)反饋給用戶。輸入提供服務(wù)提供了調(diào)用業(yè)務(wù)層功能的API,此服務(wù)提供即時(shí)通信以外的其他服務(wù);數(shù)據(jù)存儲(chǔ)服務(wù)用于隨時(shí)存儲(chǔ)用戶產(chǎn)生、更新的各種數(shù)據(jù),如聊天室、好友關(guān)系、聊天記錄等數(shù)據(jù)。
管理端為管理系統(tǒng)中的各種數(shù)據(jù)提供了可視化的管理界面,還提供數(shù)據(jù)分析、數(shù)據(jù)統(tǒng)計(jì)等功能。管理員功能用例圖如圖3所示。
圖3 管理員功能用例圖
綜合3.1~3.3所述,本系統(tǒng)的總體功能框架圖如圖4所示。
圖4 系統(tǒng)總體功能框架圖
整合Live2D。主流的Android應(yīng)用開發(fā)使用Android Studio作為編譯器,Gradle作為包管理器。Live2D官方版本已達(dá)到4.0版本,但官方并未提供Jar包,只提供了Native的SDK,所以本系統(tǒng)引入了2.0版本的Live2D的Jar包。參考官方Demo編寫自定義的Live2D Manager,通過(guò)該管理器可以自定義更換Live2D模型和傳入自定義動(dòng)作的配置。
整合Mlkit。Mlkit是谷歌專門為移動(dòng)端提供的機(jī)器學(xué)習(xí)套件,提供了非常強(qiáng)大的人臉和NPL技術(shù)的API,使用Gradle可輕松整合。通過(guò)Android提供的相機(jī)服務(wù),實(shí)時(shí)獲取相機(jī)的視頻流,經(jīng)過(guò)Mlkit處理,實(shí)時(shí)返回人臉坐標(biāo)數(shù)據(jù)。
4.2.1 處理人臉坐標(biāo)數(shù)據(jù)
每個(gè)人臉坐標(biāo)數(shù)據(jù)都是不同的,首先本系統(tǒng)需要錄入用戶的坐標(biāo)數(shù)據(jù)作為參考,通過(guò)坐標(biāo)數(shù)據(jù)的變換來(lái)判斷眨眼、張嘴等動(dòng)作。例如眼部的坐標(biāo)如圖5所示
圖5 眼部坐標(biāo)圖示例
以眼部坐標(biāo)為例,可以看到眼部一共有16個(gè)左邊點(diǎn),這些左邊對(duì)應(yīng)著X軸、Y軸,可以看到坐標(biāo)4、5、11、12處于眼部中間,理論上只需要將坐標(biāo)4的減去坐標(biāo)12的得到的值無(wú)限接近0,即可知道眼睛的狀態(tài)。
眼睛單純的睜閉映射到Live2D模型上會(huì)顯得僵硬和突然,可通過(guò)以下公式計(jì)算眼睛的開合度,會(huì)使模型的動(dòng)作更加逼真。代表某位用戶眼睛睜開時(shí)軸相減的高度,Y代表當(dāng)前用戶上眼的Y軸坐標(biāo),Y代表下眼的Y軸坐標(biāo),H代表模型最終的開合度,最終公式為:
H=(Y-Y)/
Live2D眼睛的開合度只支持1、0,而嘴巴支持的開合度為±30,如果是計(jì)算嘴巴的開合度,公式可改為:
H=(Y-Y)/×30
4.2.2 將人臉坐標(biāo)數(shù)據(jù)轉(zhuǎn)為L(zhǎng)ive2D動(dòng)作配置數(shù)據(jù)
Live2D有一套標(biāo)準(zhǔn)的配置參數(shù)表,通過(guò)配置參數(shù)即可更改模型的臉部動(dòng)作,如圖6所示。
圖6 模型動(dòng)作更改示例
通過(guò)編寫一個(gè)數(shù)據(jù)轉(zhuǎn)換器將人臉數(shù)據(jù)轉(zhuǎn)換為模型配置,最終實(shí)現(xiàn)人臉與模型動(dòng)作的實(shí)時(shí)同步,最終效果如圖7所示。
圖7 人臉與模型動(dòng)作同步示例
需要注意的是,在虛擬視頻通信中,雙方和相機(jī)需要保持在一定的距離范圍內(nèi),距離誤差越大,實(shí)際檢測(cè)結(jié)果誤差也就越大。
文本通信屬于本系統(tǒng)中實(shí)現(xiàn)起來(lái)較為容易的功能,流程為:(1)用戶發(fā)送文本消息;(2)服務(wù)端接收并解析,獲取到接收人并分發(fā);(3)接收端接收到消息后,通過(guò)Android廣播的方式更新視圖并顯示。
相比于文本通信,音頻通信需要接收方接收請(qǐng)求才可進(jìn)行音頻通信,具體流程為:(1)用戶發(fā)起音頻通信請(qǐng)求;(2)服務(wù)端接收到請(qǐng)求并解析,獲取到接收人并分發(fā);(3)接收端接收到請(qǐng)求后,喚起音頻接收Activity,用戶可選擇接受或拒絕;(4)接受端接收或拒絕的響應(yīng)會(huì)發(fā)送到服務(wù)端,服務(wù)端進(jìn)行解析,并將結(jié)果分發(fā);(5)發(fā)起端接收到結(jié)果,如果對(duì)方接受則開始音頻流傳輸,如果拒絕則將終止當(dāng)前Activity。
虛擬視頻在音頻通信的基礎(chǔ)上增加了獲取用戶實(shí)時(shí)視頻流并轉(zhuǎn)換為L(zhǎng)ive2D模型配置,在接收方接受后,不僅會(huì)傳輸音頻流,還將Live2D實(shí)時(shí)配置數(shù)據(jù)傳輸給接收方,接收方接收后通過(guò)Live2D Manager實(shí)時(shí)更改模型的動(dòng)作,也就是將發(fā)起方人臉動(dòng)作同步給接收方模型,從而實(shí)現(xiàn)了所謂的虛擬視頻通信。在此期間并沒(méi)有傳輸用戶的視頻流,只是傳輸了模型的配置數(shù)據(jù)。
用戶在虛擬視頻通信過(guò)程中,本系統(tǒng)支持轉(zhuǎn)為音頻通信,流程為:(1)用戶1點(diǎn)擊轉(zhuǎn)為音頻通信按鈕時(shí)會(huì)直接終止本地相機(jī),Live2D配置數(shù)據(jù)傳輸也會(huì)停止,與此同時(shí)會(huì)發(fā)送消息給服務(wù)端;(2)服務(wù)端接收到消息后,解析并分發(fā)給用戶2;(3)用戶2接收到此消息后,隨即也會(huì)終止本地相機(jī)的工作和Live2D配置數(shù)據(jù)的傳輸,音頻數(shù)據(jù)流傳輸正常進(jìn)行。
本系統(tǒng)雖然最終實(shí)現(xiàn)了即時(shí)通信的功能,但仍然存在著一些問(wèn)題:(1)系統(tǒng)使用的是Live2D 2.0版本的SDK,而Live2D版本已經(jīng)到達(dá)4.0,新的版本支持的功能更多,經(jīng)過(guò)多版本的迭代,性能也會(huì)更好,本系統(tǒng)的APP運(yùn)行占用了大量的系統(tǒng)內(nèi)存,對(duì)于舊版的手機(jī)還是會(huì)存在性能問(wèn)題;(2)Mlkit技術(shù)也存在一些問(wèn)題,因是實(shí)時(shí)視頻流處理,且是運(yùn)行在移動(dòng)終端,同樣會(huì)占用過(guò)多的系統(tǒng)內(nèi)存,影響用戶的體驗(yàn),同時(shí)對(duì)眼睛開合檢測(cè)的準(zhǔn)確率略低;(3)本系統(tǒng)的即時(shí)通信功能基于WebSocket進(jìn)行傳輸,對(duì)于普通的文字消息用戶發(fā)送到服務(wù)端,服務(wù)端接收后分發(fā)給目標(biāo)用戶,期間的延遲并不明顯;對(duì)于音頻流使用WebSocket傳輸就會(huì)顯得吃力,延遲更高??梢允褂肦TC技術(shù)實(shí)現(xiàn)客戶端點(diǎn)對(duì)點(diǎn)通信來(lái)解決這個(gè)問(wèn)題。
這些問(wèn)題分別對(duì)應(yīng)著軟件、硬件、技術(shù)方面,在各方面技術(shù)高速發(fā)展的今天,或許不久以后就可以得到完美的解決,當(dāng)然也有可能今天就可以得到解決,只是自己掌握的知識(shí)不夠。
5G的時(shí)代,傳統(tǒng)的IM通信已經(jīng)成為人們生活、工作中不可分割的一部分,雖然提高了人們的工作效率,隨之而來(lái)的是越來(lái)越大的工作壓力。虛擬人物視頻社交或許可以成為人們釋放壓力、進(jìn)行娛樂(lè)的一種新方式。