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