張明嘉,黃丁韞,趙 凱,楊超宇,蔣玉茹
(北京信息科技大學(xué)計(jì)算機(jī)學(xué)院,北京 100000)
隨著信息技術(shù)快速、爆發(fā)式的增長,人工智能成為當(dāng)今研究越來越熱門的話題。在各個(gè)領(lǐng)域,人工智能逐漸成為重要的研究方法。我國十四五計(jì)劃提出要建設(shè)具有國際前瞻性的人工智能應(yīng)用方法,人工智能迎來新的發(fā)展機(jī)遇[1],其中情感識(shí)別是一個(gè)重要的熱點(diǎn)問題。
目前已經(jīng)存在的多款情感識(shí)別軟件,普遍是進(jìn)行單模態(tài)的情感識(shí)別,即能夠根據(jù)一個(gè)模態(tài)(語音、文字或圖片)的信息來進(jìn)行情感的識(shí)別。其優(yōu)勢就是在單一的模態(tài)下,能夠精準(zhǔn)地識(shí)別圖片、音頻或者文本中的情感。例如:百度的對話情緒識(shí)別系統(tǒng)能夠自動(dòng)檢測用戶日常對話文本中蘊(yùn)含的情感特征,能夠幫助企業(yè)更全面地把握產(chǎn)品體驗(yàn)、監(jiān)控客戶服務(wù)質(zhì)量。而Affectiva 公司的Automotive AI解決方案能夠通過視頻(圖片)實(shí)時(shí)監(jiān)控駕駛員的情感狀態(tài),當(dāng)其出現(xiàn)焦慮、嗜睡或易怒等狀態(tài)時(shí),令自動(dòng)駕駛功能接管汽車操控權(quán)。這些案例是單模態(tài)的情感識(shí)別模型根據(jù)圖片、音頻或者文本的單模態(tài)信息識(shí)別出人物的情感,但如果能同時(shí)捕獲多種模態(tài)信息,訓(xùn)練多模態(tài)情感識(shí)別模型,則能更好地預(yù)測人物的情感。因此,為了能夠滿足多模態(tài)場景下的情感識(shí)別需求,開發(fā)基于多模態(tài)情感識(shí)別模型的情感識(shí)別軟件勢在必行。
首先利用中文情景喜劇《天真派武林外傳》構(gòu)建一個(gè)中文多模態(tài)情感語料庫。根據(jù)美國心理學(xué)家Ekman[2]在1982 年提出的六大基本情緒:生氣、快樂、驚訝、厭惡、傷心和害怕,在構(gòu)建語料庫時(shí)將情緒設(shè)置七個(gè)類別,分別為生氣(anger)、快樂(joy)、厭惡(disgust)、驚訝(surprise)、傷心(sadness)、害怕(fear)和中立(neutral)。人工從《天真派武林外傳》的每一集中按照一定的規(guī)則合理地對視頻進(jìn)行切分,同時(shí)多位標(biāo)注人員采用人工標(biāo)注方式對切分后的視頻片段進(jìn)行情緒類別標(biāo)注。
多模態(tài)信息的提取工作,首先從視頻片段中提取圖片信息:使用Python中cv2模塊的Video-Capture 類構(gòu)建程序,逐幀截取圖片。利用cv2模塊的人臉分類器識(shí)別每一張圖片中的人臉,并將識(shí)別結(jié)果保存成圖片。然后從視頻片段中提取音頻信息:使用OpenSmile 自動(dòng)化工具從視頻片段中提取音頻。最后在Python 中調(diào)用百度語音識(shí)別接口將音頻轉(zhuǎn)換成文本。
接下來對圖片、音頻和文本分別進(jìn)行情感特征提取。采用預(yù)訓(xùn)練語言模型BERT進(jìn)行文本特征提取,并使用全連接的方式對文本特征進(jìn)行降維,獲得300維的文本情感特征向量;使用Opensmile自動(dòng)化工具進(jìn)行語音特征提取得到384維的話語級(jí)語音情感特征,并使用全連接的方式對音頻特征進(jìn)行降維,獲得300維的音頻情感特征向量;使用FaceCNN 結(jié)合BiLSTM 的方式進(jìn)行圖片特征提取,并使用全連接的方式對圖片特征進(jìn)行降維,獲得300維的圖片情感特征向量。將DialogueRNN[3]模型作為多模態(tài)情感識(shí)別模型,訓(xùn)練時(shí)將先前得到的文本情感特征向量、音頻情感特征向量和圖片情感特征向量進(jìn)行拼接得到當(dāng)前話語的情感特征向量,作為DialogueRNN模型的輸入,對DialogueRNN模型進(jìn)行訓(xùn)練,最終得到一個(gè)效果較為良好的多模態(tài)情感識(shí)別模型。
該應(yīng)用的客戶端支持用戶實(shí)時(shí)拍攝視頻進(jìn)行上傳;該應(yīng)用的服務(wù)端可以對用戶上傳的視頻分別進(jìn)行圖片特征抽取、音頻特征抽取和文本特征抽取,并將得到的圖片特征、音頻特征和文本特征輸入至多模態(tài)情感識(shí)別模型,識(shí)別得到用戶上傳的視頻中人物的情感信息,并將該情感信息返回至客戶端。系統(tǒng)時(shí)序圖如圖1所示。
圖1 系統(tǒng)時(shí)序圖
該應(yīng)用分為客戶端和服務(wù)端兩部分,客戶端負(fù)責(zé)用戶上傳視頻至服務(wù)端和接收服務(wù)端返回的視頻中人物的情感信息;服務(wù)端負(fù)責(zé)接收用戶上傳的視頻,并使用多模態(tài)情感識(shí)別模型識(shí)別視頻中人物的情感,并將該情感信息傳回客戶端。
使用Android 實(shí)現(xiàn)客戶端的功能。該應(yīng)用在Layout 布局文件中使用Button 控件、ProgressBar控件和TextView 控件,點(diǎn)擊Button 按鈕實(shí)現(xiàn)拍攝視頻并將視頻上傳至服務(wù)器,ProgressBar 用于顯示視頻上傳至服務(wù)器的進(jìn)度,TextView 控件用以顯示服務(wù)器返回的情感信息。分別創(chuàng)建對應(yīng)實(shí)現(xiàn)拍攝視頻并上傳至服務(wù)器的Button 對象、顯示視頻上傳進(jìn)度的ProgressBar 對象和顯示服務(wù)器返回的情感信息的TextView 對象,為Button對象的點(diǎn)擊事件注冊一個(gè)監(jiān)聽器,當(dāng)用戶點(diǎn)擊按鈕時(shí),使用intent 機(jī)制實(shí)現(xiàn)視頻錄制的功能,如果成功調(diào)用手機(jī)的攝像機(jī)拍攝視頻,并且在拍攝視頻的過程中沒有取消拍攝,該視頻將會(huì)保存至手機(jī)的指定路徑中。調(diào)用getContent-Resolver().query()方法獲取視頻保存路徑。定義isConnectingToInterne(t)方法檢查該應(yīng)用是否有網(wǎng)絡(luò)連接,定義checkURL()方法檢查指定的服務(wù)端URL 地址是否有效。在MainActivity 類中定義uploadFile()方法,將拍攝的視頻上傳至指定的URL 地址對應(yīng)的服務(wù)端中,并獲取服務(wù)端返回的視頻中人物的情感信息。
在該方法中,首先指定服務(wù)端的URL地址,以該URL 地址獲取HttpURLConnection 類的實(shí)例對象,調(diào)用該實(shí)例對象的setDoInpu(t)方法將該doInput 字段的值設(shè)置true,調(diào)用該實(shí)例對象的setDoOutput()方法將doOutput 字段的值設(shè)置為true,調(diào)用該實(shí)例對象的setRequestMethod()方法設(shè)置向服務(wù)器發(fā)送POST 請求,通過該實(shí)例對象的getOutputStream()方法向服務(wù)端發(fā)送視頻數(shù)據(jù),并通過該實(shí)例對象的getInputStream()方法接收服務(wù)器返回的情感信息。在MainActivity 類中創(chuàng)建一個(gè)線程類,并重寫run()方法,調(diào)用is-ConnectingToInterne(t)方法檢查該應(yīng)用當(dāng)前是否已經(jīng)連網(wǎng),調(diào)用checkURL()方法檢查指定的服務(wù)端URL 地址是否有效。如果該應(yīng)用當(dāng)前已經(jīng)連網(wǎng)并且指定的服務(wù)端URL 地址有效,調(diào)用uploadFile()方法將拍攝的視頻上傳至服務(wù)器并得到服務(wù)器返回的視頻中人物的情感信息,并調(diào)用Handler類的sendMessage()方法將情感信息發(fā)送給主線程。在MainActivity 類中聲明Handler類的實(shí)例對象,并重寫Handler 實(shí)例對象的handleMessage()方法,在該方法中調(diào)用TextView 對象的setText()方法將該情感信息展示給用戶。完成上述操作,即可實(shí)現(xiàn)該應(yīng)用客戶端的功能。
使用Python實(shí)現(xiàn)服務(wù)端的功能。使用Python中的Flask 框架[4]搭建Web 應(yīng)用,并且將該Web應(yīng)用部署到服務(wù)器上:注冊一個(gè)視圖函數(shù),該函數(shù)用來處理客戶端的請求;使用app.route()裝飾器為視圖函數(shù)綁定URL,當(dāng)用戶上傳視頻至這個(gè)URL 時(shí),就會(huì)觸發(fā)這個(gè)函數(shù),獲取返回值。具體做法:首先接收用戶上傳的視頻,然后使用cv2 模塊中的VideoWriter 類保存用戶上傳的視頻至指定的視頻文件夾中,并分別抽取視頻中對應(yīng)的圖片、音頻和文本內(nèi)容。抽取視頻中對應(yīng)圖片的方法:對保存在指定路徑下的視頻使用cv2 模塊的VideoCapture 類逐幀截取圖片,并使用cv2 模塊中的imwrite()方法將獲得的圖片保存至指定的圖片文件夾中。將人臉識(shí)別模型的xml 文件“haarcascade_frontalface_default.xml”作為cv2 模塊中的級(jí)聯(lián)分類器CascadeClassifier類的參數(shù),使用該方法對圖片文件夾中圖片上的人臉進(jìn)行識(shí)別并保存識(shí)別得到的人臉圖片。抽取視頻中對應(yīng)音頻的方法:指定音頻的保存路徑path,使用cv2 模塊的VideoFileClip 類從視頻文件中加載視頻,并使用AudioFileClip 類的write_audiofile()方法將從視頻中提取的音頻保存至指定的音頻文件中。同時(shí)使用opensmile 模塊中Smile 類的process_folder()方法從指定音頻文件中提取音頻特征并將提取得到的音頻特征保存至指定路徑下的csv 文件和pkl 文件中;根據(jù)音頻文件的路徑讀取音頻文件,并使用百度提供的開源API 實(shí)現(xiàn)語音轉(zhuǎn)文字的功能,并將得到的文本內(nèi)容保存至指定的文本文件中。經(jīng)過上述步驟,可以從用戶上傳的視頻中分別得到視頻中人物的人臉圖片、音頻和文本內(nèi)容。加載經(jīng)過訓(xùn)練的多模態(tài)情感識(shí)別模型,將處理好的人臉圖片、音頻和文本內(nèi)容輸入至多模態(tài)情感識(shí)別模型中,得到預(yù)測的視頻中對應(yīng)人物的情感信息,并以數(shù)據(jù)流的方式將該情感信息發(fā)送回客戶端。
4.1.1 用戶登錄/注冊
用戶只有在登錄之后才能使用該多模態(tài)情感識(shí)別的APP,如果用戶沒有賬號(hào),需要進(jìn)行注冊,并且使用注冊的賬號(hào)和密碼進(jìn)行登錄。
4.1.2 拍攝視頻
用戶可以使用手機(jī)系統(tǒng)自帶的相機(jī)拍攝視頻,并將拍攝的視頻進(jìn)行上傳。
4.2.1 抽取單模態(tài)信息
圖片抽取模塊:用來從用戶上傳的視頻中逐幀抽取圖片,并從圖片中提取人物人臉圖片。
音頻抽取模塊:用來從用戶上傳的視頻中抽取音頻。
文本抽取模塊:用來從抽取得到的音頻中抽取文本內(nèi)容。
4.2.2 情感識(shí)別
多模態(tài)情感識(shí)別模塊:此模塊用來識(shí)別用戶上傳的視頻中人物的情感。
整體工作流程如圖2所示,用戶使用多模態(tài)情感識(shí)別APP 上傳視頻至服務(wù)器,服務(wù)器從用戶上傳的視頻中提取人臉圖片、音頻和文本內(nèi)容,將提取得到的人臉圖片、音頻和文本內(nèi)容傳入至多模態(tài)情感識(shí)別模型中,由多模態(tài)情感識(shí)別模型對視頻中的人物情感進(jìn)行識(shí)別,最后以數(shù)據(jù)流的方式將識(shí)別得到的情感信息返回給用戶。
圖2 系統(tǒng)工作流程
本文設(shè)計(jì)并開發(fā)了一個(gè)能夠使用多模態(tài)情感識(shí)別模型識(shí)別視頻中對應(yīng)人物情感信息的移動(dòng)應(yīng)用程序。本項(xiàng)目團(tuán)隊(duì)自行構(gòu)建了基于中文情景喜劇《天真派武林外傳》的中文多模態(tài)情感語料庫,并利用DialogueRNN 模型訓(xùn)練出了中文多模態(tài)情感識(shí)別模型,通過從《天真派武林外傳》中提取得到的圖片、音頻和文本內(nèi)容對多模態(tài)情感識(shí)別模型進(jìn)行訓(xùn)練,并使用訓(xùn)練好的多模態(tài)情感識(shí)別模型對視頻中人物的情感進(jìn)行識(shí)別。相較于單模態(tài)的情感識(shí)別,基于多模態(tài)情感識(shí)別模型的情感識(shí)別能更準(zhǔn)確地識(shí)別用戶的情感狀態(tài)。本文所設(shè)計(jì)的應(yīng)用可以用于智能對話的很多場景中,比如在線學(xué)習(xí)系統(tǒng)中,隨時(shí)檢測學(xué)習(xí)者的情感狀態(tài),并根據(jù)學(xué)習(xí)者的情感狀態(tài)調(diào)整學(xué)習(xí)進(jìn)度;或者在客服對話系統(tǒng)中,實(shí)時(shí)檢測用戶的情感,以輔助客服人員可以根據(jù)用戶的情感更好地為用戶提供服務(wù)。