摘 要: 手語翻譯器作為不懂手語的正常人與使用手語的殘障人士之間的溝通橋梁,近來成為研究熱點,但是目前市場上成熟的手語翻譯器并不多見。在此設(shè)計利用Leap Motion對手部識別精度高以及體積小巧等特性,實現(xiàn)了一種識別精度高、便于攜帶的手語翻譯器。該翻譯器不僅支持靜態(tài)手語的識別,同時也能識別動態(tài)手語,實現(xiàn)了手語識別、文本翻譯、語音播報,多語言翻譯等功能。實驗結(jié)果表明該手語翻譯器具有識別準確率高的特點,能基本實現(xiàn)殘障人士與正常人之間簡單的交流,具有良好的應(yīng)用前景。
關(guān)鍵詞: Leap Motion; 手勢識別; 手語翻譯器; 語音播報; 多語言翻譯
中圖分類號: TN919.8?34 文獻標識碼: A 文章編號: 1004?373X(2015)24?0114?04
Design and implementation of sign language interpreter system based on Leap Motion
WENG Shenghui, CHEN Weihao, CHEN Kuanglin
(School of Computing Science, Beijing Institute of Technology (Zhuhai), Zhuhai 519085, China)
Abstract: As a communication bridge between normal people ignorant of the sign language and handicapped persons using the sign language, the sign?language translator has recently become a hot research. However, sign?language interpreters on the market are rare. A high recognition accuracy and portable sign?language translator was achieved by utilizing Leap Motion’s characteristics of high recognition accuracy and small size. The interpreter implemented the sign?language recognition, text translation, voice broadcast, multi?language translation and other functions, as well as can support static sign?language recognition and recognize dynamic sign?language. The experimental result shows that the sign?language interpreter has high recognition accuracy, and can basically realize simple communication between people with disabilities and normal people. Therefore, it has a nice prospect.
Keywords: Leap Motion; gesture recognition; sign language interpreter; voice broadcast; multi?language translation
0 引 言
目前全球大概有1億聾啞人,而我國就有超過2 000萬聾啞人,而且每年還在以2萬~3萬名的速度遞增。聽力正常人之間主要采用口語和書面語進行交流,并輔之以一定的體勢和表情。在聾人之間的交流中,手語如同正常人的口語一樣,起著非常重要的作用。由于正常人懂手語的較少,所以正常人與聾啞人之間的溝通存在較大的障礙。隨著社會的發(fā)展,聾啞人的地位不斷提高,手語翻譯工作應(yīng)用的范圍也越來越廣泛,也將越來越引起社會各界的關(guān)注和重視。我國目前手語翻譯職業(yè)化道路剛剛起步,各方面還很不完善,缺少專業(yè)的手語翻譯,尤其分科明確專業(yè)程度很高的手語翻譯人員。目前手語翻譯工作大多是由聾校教師和殘疾人工廠的手語翻譯人員,這些人不僅缺乏手語翻譯技能技巧等方面的專業(yè)培訓(xùn),而且更缺乏某一專業(yè)領(lǐng)域的知識儲備和訓(xùn)練,如法律、醫(yī)療、心理咨詢等專業(yè)知識,手語翻譯的水平極大地限制了聾人群體的發(fā)展和生存質(zhì)量的提高。但是近年來互聯(lián)網(wǎng)和計算機不斷的發(fā)展,機器翻譯變得隨處可見。機器能有豐富的專業(yè)知識儲備,能在不帶任何私人感情和主觀意識的情況下準確無漏地進行翻譯,解決了手語翻譯人員存在的一些翻譯缺陷,而且其便攜性也是一大優(yōu)點[1]。
目前手語識別系統(tǒng)主要分為基于數(shù)據(jù)手套的識別和基于視覺(圖像)的手語識別系統(tǒng)[2]?;跀?shù)據(jù)手套的手語識別系統(tǒng),是利用數(shù)據(jù)手套和位置跟蹤器測量手勢在空間運動軌跡和時序信息[3?4]。這種方法的優(yōu)點是系統(tǒng)的識別率高,缺點是打手語的人必須穿戴復(fù)雜的數(shù)據(jù)手套和位置跟蹤器,并且輸入設(shè)備比較昂貴。
本文提出的手語翻譯器屬于基于視覺(圖像)的手語識別系統(tǒng)[5]。采用的識別設(shè)備是Leap Motion體感控制器Leap Motion是一款μm級3D手動交互設(shè)備,只有三寸長,一寸寬,看起來像一個U盤大小[6]??梢宰粉櫟叫〉?.01 mm的動作,擁有150°的視角,可跟蹤一個人10個手指的動作,最大頻率為290幀/s,延遲比顯示器的刷新率還要低,特別適合用作手語翻譯器。
1 系統(tǒng)概述
手語翻譯器主要由3大模塊組成,分別是手勢識別模塊,文本顯示模塊和語音播報模塊??傮w框架圖如圖1所示。
圖1 系統(tǒng)總體框架圖
該手語翻譯器主要利用手勢識別模塊中的Leap Motion體感設(shè)備自身的兩個紅外攝像頭進行手勢的捕捉,通過識別人手的姿勢和動作,將其轉(zhuǎn)換成數(shù)據(jù)通過數(shù)據(jù)線發(fā)送到主機進行處理,主機將對這些數(shù)據(jù)進行提取,把提取出來的有用的數(shù)據(jù)通過算法處理識別出手勢動作,翻譯成文本信息顯示在顯示器上,語音模塊可以根據(jù)需要轉(zhuǎn)換成語音信息,最后還可以通過接入互聯(lián)網(wǎng)的方式連接云翻譯服務(wù)平臺實現(xiàn)多語言翻譯功能。
2 各模塊的設(shè)計與實現(xiàn)
2.1 手勢識別
該模塊功能主要由Leap Motion控制器實現(xiàn),該設(shè)備中內(nèi)置兩個紅外線攝像頭,內(nèi)部結(jié)構(gòu)如圖2所示[6]。
它可捕捉到設(shè)備面前的一塊半球型區(qū)域中的人手和一切棍棒狀的工具,虛構(gòu)出xyz三個軸,生成一個監(jiān)聽者將檢測到的物體計算生成相關(guān)的數(shù)據(jù),如手中各個手指的骨骼點之間的距離、手指的長度、數(shù)量、方向等;還可以識別出各種基礎(chǔ)手勢特征基元,如轉(zhuǎn)圈,平移等,這些數(shù)據(jù)都將按照時間片的單位封裝成1幀使用。由于手語不只有靜態(tài)的,還有動態(tài)手勢,所以一個動態(tài)手勢可以細化成很多幀,每一幀都有其特定的ID與之區(qū)別開來,而Leap Motion設(shè)備一次捕獲一幀,之后可以通過對控制器物體的輪詢獲得幀,然后將其通過數(shù)據(jù)線發(fā)送到處理機。
圖2 Leap Motion內(nèi)部結(jié)構(gòu)示意圖
為了更方便,需要將控制器檢測到的數(shù)據(jù)進行提取,放進一個onframe()函數(shù)中。onframe()是核心函數(shù),它實時返回控制器所監(jiān)聽到的一些基本信息并顯示,能以數(shù)據(jù)的形式更直觀的對當前手勢進行分析。通過controller對象調(diào)用onframe()函數(shù),函數(shù)將獲取最新的運動跟蹤幀數(shù)據(jù),并把檢測目標的信息作為標準輸出。
下面的代碼是手勢識別代碼中的一部分,實現(xiàn)的功能有:獲取最新的Frame對象,并根據(jù)Frame對象檢索人手的list列表,然后輸出Frame的ID、時間戳、以及幀數(shù)據(jù)中人手的數(shù)量、手指數(shù)、工具的數(shù)量:
const Frame frame = controller.frame();
std::cout << \"Frame id: \" << frame.id()
<< \", timestamp: \" << frame.timestamp()
<< \", hands: \" << frame.hands().count()
<< \", fingers: \" << frame.fingers().count()
<< \", tools: \" << frame.tools().count()
<< \", gestures: \" << frame.gestures().count()
<< std::endl;
接下來,函數(shù)將檢測list列表中的第一只手,并判斷左右手:
const Hand hand = *hl;
LRhand = hand.isLeft() ? \"Left hand\" : \"Right hand\";
if(LRhand==\"Left hand\")
ui?>lineEdit?>setText(\"左手\");
else
ui?>lineEdit?>setText(\"右手\");
Hand類的一個對象包含ID、反映人手物理特征的屬性、手指對象的list列表,而每個Finger對象又包含ID、反映手指物理特征的屬性。
這是基本的信息提取,Leap還提供了基礎(chǔ)手勢特征基元的識別,首先調(diào)用enableGesture()函數(shù),啟用了所有的手勢識別類型:
controller.enableGesture(Gesture::TYPE_CIRCLE); controller.enableGesture(Gesture::TYPE_KEY_TAP);
controller.enableGesture(Gesture::TYPE_SCREEN_TAP);
controller.enableGesture(Gesture::TYPE_SWIPE);
Leap設(shè)備把代表識別動作模型的Gesture對象放到Frame對象中g(shù)estures的list列表中。通過對控制器的輪詢循環(huán)讀取gestures的list列表,并把每個手勢的信息輸出。
在動態(tài)手勢的識別中,需要將當前幀的手勢信息與前面的幀里對應(yīng)的手勢進行比較,可以隨時調(diào)用一個時間范圍內(nèi)的幀數(shù)據(jù),設(shè)置一個x值,通過比較并計算當前幀frame()與x幀之前frame(x)中數(shù)據(jù)變化來識別手勢。例如,畫圈的手勢動作中有個進度屬性,此屬性用來表示手指已經(jīng)畫圈的次數(shù)。這是一個完整的過程,如果想在幀與幀之間獲取這個進度,需要減去前一幀中手勢進度值。在實際操作中,可以通過手勢gesture的ID找到對應(yīng)的幀。下面的代碼就是用了這個方法由前幀導(dǎo)出相應(yīng)的角(單位:rad):
float sweptAngle = 0;
if (circle.state() != Gesture::STATE_START) {
CircleGesture previousUpdate = CircleGesture(controller.frame(1).gesture(circle.id()));
sweptAngle = (circle.progress()-previousUpdate.progr
ess()) * 2 * PI;
}
2.2 文本顯示
文本顯示模塊主要是將手勢手語翻譯成文本并顯示出來,能更方便聾啞人和正常人之間交流,實現(xiàn)實時交談。為了使該軟件更具實用性,該系統(tǒng)還加入了多語翻譯的功能,可連接上云翻譯服務(wù)平臺,將文本顯示的容易翻譯成多種語言。
多語言翻譯功能是利用網(wǎng)上百度公司提供的百度翻譯API實現(xiàn)的[7]。百度翻譯提供中文、英語、日語、韓語、法語、泰語、德語、俄語、西班牙語、葡萄牙語、阿拉伯語、意大利語、粵語等16個語種,136個語言方向的翻譯服務(wù),支持文本翻譯和網(wǎng)頁翻譯兩種類型。目前市面上百度翻譯API目前有近萬個開發(fā)者接入,日均訪問量近億次。手機百度App、金山詞霸全線產(chǎn)品、靈格斯詞霸、華為手機、OPPO手機、敦煌網(wǎng)、百度文庫、騰訊SOSO、特快翻譯IOS和Android版、百度PC瀏覽器和手機瀏覽器、百度輸入法等均與百度翻譯建立了良好的合作關(guān)系。要使用百度翻譯API需要先向百度申請開發(fā)所需的ApiKey。默認翻譯API使用頻率為每個IP 1 000次/h,如有需要可向百度開發(fā)者中心申請更高頻次權(quán)限。然后通過HTTP協(xié)議發(fā)送get翻譯請求。
發(fā)送的請求中需包含字符編碼必須為UTF?8的待翻譯內(nèi)容和作為開發(fā)者已授權(quán)用戶的身份證明的ApiKey,指定要翻譯的源語言和目標語言種類(可設(shè)置為自動識別)。之后便可以得到相應(yīng)的響應(yīng)。
返回的響應(yīng)是ISO?8859?1編碼格式的標準JSON字符串。為了能正常使用需要先將其轉(zhuǎn)換成日常使用的字符編碼格式UTF?8格式:
QTextCodec *codec = QTextCodec::codecForName(\"UTF?8\");
然后使用QScriptEngine一層層解析返回的嵌套JSON字符串,除去多余的內(nèi)容,將需要的翻譯完成后的文字內(nèi)容顯示出來:
QString all = codec?>toUnicode(reply?>readAll());
QJsonDocument myjson = QJsonDocument::fromJson(all.toLatin1(),jsonErr);
QByteArray byte_array = myjson.toJson(QJsonDocument::Compact);
QString json_str(byte_array);
QScriptEngine engine;
QScriptValue sc = engine.evaluate(\"s=\" + json_str);
qDebug()< QScriptValue subsc = sc.property(\"trans_result\"); QScriptValue subsc1 = subsc.property(0); ui?>textEdit?>setText(subsc1.property(\"dst\").toString()); 2.3 語音播報 語音功能是該翻譯器的拓展功能。翻譯不應(yīng)該只有翻譯顯示的功能。為了更加適應(yīng)聾啞人和正常人之間的交流,引入了語音播報的功能,使其更符合正常人日常之間使用語言而非文字的交流習慣。對此,翻譯器除了能發(fā)出聲音,還加入了不少特色功能。同時支持簡體中文和英語,根據(jù)使用者的性別,可在男聲女聲選項中選擇對應(yīng)的聲音,而且加入了聲音大小調(diào)節(jié)、語速快慢調(diào)整等功能功能,使該翻譯器更具人性化和實用性。 語音播報模塊使用微軟免費提供的的TTS引擎和發(fā)音包,同樣只需要使用官方提供的API即可。微軟SDK提供的SAPI是基于COM封裝的,無論是否熟悉COM,只要按部就班的初始化COM獲取接口,調(diào)用接口完成某個功能,實現(xiàn)語音控制,程序結(jié)束時釋放資源[8?9]。 模塊的核心是ISpVoice接口,其主要功能是speak()函數(shù),該函數(shù)的具體實現(xiàn)如下: bool TextSpeech::speak(QString txt) { if(!_binit) return 1; int result = this?>_voice.dynamicCall(\"Speak(QString, SpeechVoiceSpeakFlags)\", txt ,1).toInt(); _bReading = true; return result; } 傳入可識別的字符串為參數(shù),執(zhí)行播報功能,返回一個參數(shù)表示是否執(zhí)行成功除了Speak()外IspVoice接口還有許多成員函數(shù),如通過SetRate(int),SetVolume(int)等語句將具體參數(shù)傳入,設(shè)置音量、音調(diào),Pause(void)和Resume(void)來暫停和回復(fù)語音的朗讀,幾乎可以使輸出達到自然語音效果。至于音色,則通過SetVoice(ISpObjectToken *pToken)函數(shù)選擇預(yù)裝的語音庫,可實現(xiàn)男聲女聲的切換。不僅如此,這個TTS API功能最強大之處在于能夠分析XML標簽,輸入文本并不需要嚴格遵守W3C的標準,只要含有XML標簽就行。XML標簽同樣也能做到上述函數(shù)中的功能:設(shè)置音量、音調(diào)、延長、停頓等。再另外,根據(jù)XML標注的不同,數(shù)字、日期、時間之類的讀法有自己的一套規(guī)則。例如數(shù)字1 024,\" 實際上所有的語言發(fā)音都是由基本的音素組成,以中文發(fā)音為例,拼音是組成發(fā)音的最基本的元素,只要知道漢字的拼音,即使不知道怎么寫,也不知道怎么讀,都沒有關(guān)系。對于TTS引擎來說,它不一定認識所有字,但是只要把拼音對應(yīng)的符號(SYM)給它,它就一定能夠讀出來,而英語發(fā)音則可以用音標表示,例如“h eh ? l ow 1”就是hello這個單詞對應(yīng)的語素。所以與一些用預(yù)先錄制的聲音文件實現(xiàn)發(fā)聲的應(yīng)用程序相比,TTS的發(fā)聲引擎不需要大量的聲音文件支持,只有幾兆大小,因此可以節(jié)省很大的儲存空間,縮小了程序的體積。 3 應(yīng)用前景預(yù)測 目前市面上的手語翻譯器很少,但是對于這種應(yīng)用的需求可以從助聽器市場中窺知一二。2012年我國助聽器國內(nèi)銷量為406.5萬個,同比增長21.2%,增幅較2011年增加6.5個百分點。2008—2012年我國助聽器銷量統(tǒng)計如表1所示[10]。 表1 2008—2012年我國助聽器銷量統(tǒng)計統(tǒng)計表 以上的數(shù)據(jù)都顯示出我國助聽器市場強勁的需求,從而可推斷出算出手語翻譯器潛在的市場容量,絲毫不必過多地擔心市場容量問題。目前市場上助聽器價格昂貴,品牌助聽器最便宜2 000元起,貴則幾萬元,據(jù)殘疾人的就業(yè)調(diào)查相關(guān)數(shù)據(jù)顯示我國聾啞人群體的就業(yè)狀況不容樂觀,雖然市場上有針對聽力障礙者推出的各類品牌助聽器,但是也相對比較昂貴。這對于有就業(yè)困難的特殊人群來說,無疑是難以負擔的。而且據(jù)調(diào)查,大部分助聽器的使用者均表示佩戴不適,伴有噪音,輕微頭暈等癥狀。而本文提出的手語翻譯器,不僅不會給使用者帶來不適,其小巧的機身與低廉的價格更具競爭力。2009—2014年我國助聽器銷量如圖3所示[11]。 圖3 2009—2014年我國助聽器銷量圖 4 結(jié) 語 本文敘述了基于Leap Motion的手語翻譯器的設(shè)計與實現(xiàn)。這種翻譯器利用了Leap Motion對手部識別的高精度,手勢時間片段的細化和其體積小巧的特性,做出了識別度高,便攜性好的手語翻譯器。日常手語中有很多動態(tài)手勢,該翻譯器不僅支持靜態(tài)手語的識別,同時也能識別出動態(tài)的手語。而且該設(shè)備還內(nèi)置有光感調(diào)節(jié),紅外線打的攝像頭對環(huán)境的兼容性很高,即使在強光弱光的情況下均能使用,基本實現(xiàn)了聾啞人與正常人之間簡單的交流。相對其他手語翻譯設(shè)備來說,Leap Motion除了具有精度高、體積小等優(yōu)點外,價格也比較低廉,具有較好的應(yīng)用前景。 參考文獻 [1] 倪訓(xùn)博,趙德斌,高文,等.非特定人手語數(shù)據(jù)生成及其有效性檢測[J].軟件學(xué)報,2010,21(5):1153?1168. [2] 姜華強,潘紅.基于關(guān)鍵幀的多級分類手語識別研究[J].計算機應(yīng)用研究,2010,27(2):491?493. [3] 顧偉宏,閔昆龍,張曉娜.新型數(shù)據(jù)手套及其手勢識別研究[J].自動化儀表,2011(2):56?58. [4] 劉明濤,雷勇.基于數(shù)據(jù)手套的漢語手指字母流識別系統(tǒng)[J].計算機工程,2011,37(22):168?170. [5] 楊全,彭進業(yè).基于深度圖像信息的手語識別算法[J].計算機應(yīng)用,2013,33(10):2882?2885. [6] Leap Motion, Inc. Leap Motion controller [EB/OL]. [2015?04?11]. https://developer.leapmotion.com. [7] Microsoft Corporation. Speech [EB/OL]. [2015?03?12]. http://cn.bing.com/dev/speech. [8] 章森,劉磊,刁麓弘.大規(guī)模語音語料庫及其在TTS中應(yīng)用的幾個問題[J].計算機學(xué)報,2010,33(4):687?696.