如果聲音才是計算交互的未來,那么那些聾啞人怎么辦?帶著這個問題,本文作者構(gòu)建了一套系統(tǒng),讓亞馬遜的Alexa智能小助手學(xué)會了識別手語。本文介紹了如何使用TensorFlow.js來構(gòu)建這一系統(tǒng),全部代碼和演示已上傳至Github。
幾個月前,有一天晚上我躺在床上,一個念頭閃過我的腦海:“如果聲音才是計算交互的未來,那么那些聾啞人怎么辦?”我不知道究竟為何會產(chǎn)生這個想法,我自己可以正常說話、聽覺也正常,我周圍認識的人也沒有聾啞人,我也不使用語音助手。這個問題總是縈繞在我的腦子里,于是我知道自己需要好好研究一下了。
最終結(jié)果就是現(xiàn)在這個項目的誕生,我讓一臺Amazon Echo智能揚聲器對手語做出了響應(yīng)。確切的說是對美國手語(ASL)做出了響應(yīng),因為手語種類有很多。
本文將介紹如何使用TensorFlow.js構(gòu)建這一系統(tǒng)。讀者可以用自己的單詞和手語/手勢組合來對模型進行訓(xùn)練。此外,我希望這種方法有助于讓人們將焦點從項目的技術(shù)元素上轉(zhuǎn)移出來,而更多關(guān)注人文元素。這個項目更多的不是關(guān)于底層技術(shù)的討論,而是該技術(shù)能為人類提供的能力。
前期研究與系統(tǒng)需求
構(gòu)建系統(tǒng)需要:
用于解釋符號的神經(jīng)網(wǎng)絡(luò)(將視頻轉(zhuǎn)換為文本)。
一個文本到語音的轉(zhuǎn)換系統(tǒng),向Alexa說出需要解釋的手勢。
語音到文本的轉(zhuǎn)換系統(tǒng),用于轉(zhuǎn)錄Alexa對用戶的響應(yīng)。
運行此系統(tǒng)的設(shè)備(筆記本電腦/平板電腦)和與之交互的Echo智能揚聲器。
將上述部分聯(lián)系在一起的交互界面。
我可能花了很多時間來確定采用哪種類型的神經(jīng)網(wǎng)絡(luò)架構(gòu)。為此我提出了幾個選項:
1.由于符號有視覺和時間兩個方面的屬性,我一開始想選擇CNN與RNN的組合,其中將最后一個卷積層的輸出(在分類之前)作為序列輸入RNN。我后來發(fā)現(xiàn)這種網(wǎng)絡(luò)學(xué)名叫長期循環(huán)卷積網(wǎng)絡(luò)(LRCN)。
2.使用3D卷積網(wǎng)絡(luò),其中卷積將以三維方式應(yīng)用,前兩個維度是圖像,第三維度是時間。然而,這些網(wǎng)絡(luò)需要大量的內(nèi)存,我的macbook pro吃不消。
3.不再對視頻流中的各幀都進行CNN訓(xùn)練,而是僅在光流表示上進行訓(xùn)練,該光流表示將表示兩個連續(xù)幀之間的視在運動的模式。也就是說,它會對動作進行編碼,這將產(chǎn)生更為通用化的手語模型。
4.使用雙流CNN,其中空間流將是單幀(RGB)的,時間流將使用光流表示。
我通過閱讀論文發(fā)現(xiàn),這些論文至少使用了上述一些視頻活動識別方法。然而,我很快就意識到,由于我的計算力有限,而且我需要從頭開始研究和實施這些論文中的方法,時間和硬件條件都不夠。我最終確定的方法與上面完全不同。
為什么選擇TensorFlow.js
TensorFlow.js團隊一直在進行有趣的基于瀏覽器的實驗,以使人們熟悉機器學(xué)習(xí)的概念,并鼓勵他們將其用作您自己項目的構(gòu)建塊。對于那些不熟悉的人來說,TensorFlow.js是一個開源庫,允許用戶使用Javascript直接在瀏覽器中定義、訓(xùn)練和運行機器學(xué)習(xí)模型。特別是兩個演示似乎是有趣的起點 - Pacman網(wǎng)絡(luò)攝像頭控制器和可教學(xué)機器(Teachable Machine)。
雖然它們都從網(wǎng)絡(luò)攝像頭獲取輸入圖像并根據(jù)訓(xùn)練數(shù)據(jù)輸出預(yù)測結(jié)果,但其內(nèi)部每個操作都不同:
1)“吃豆人”(Pacman)網(wǎng)絡(luò)攝像頭。它使用卷積神經(jīng)網(wǎng)絡(luò)(CNN),采用來自網(wǎng)絡(luò)攝像頭的輸入圖像,通過一系列卷積和最大池化層進行傳遞。它可以提取圖像的主要特征,并根據(jù)已經(jīng)訓(xùn)練過的例子預(yù)測其標簽。由于訓(xùn)練是一個代價昂貴的過程,使用名為MobileNet的預(yù)訓(xùn)練模型進行遷移學(xué)習(xí)。該模型在1000個ImageNet類上進行了訓(xùn)練,但經(jīng)過優(yōu)化,可以在瀏覽器和移動應(yīng)用程序中運行。
2)可教學(xué)的機器。使用kNN(k-Nearest-Neighbors)模型,它非常簡單,從技術(shù)上講,它根本不執(zhí)行任何“學(xué)習(xí)”。它采用輸入圖像(來自網(wǎng)絡(luò)攝像頭)并通過使用相似度函數(shù)或距離度量找到最接近該輸入圖像的訓(xùn)練樣本的標簽來對其進行分類。
不過,在圖像輸入kNN之前,首先要通過名為SqueezeNet的小型神經(jīng)網(wǎng)絡(luò),然后將該網(wǎng)絡(luò)倒數(shù)第二層的輸出作為輸入進入kNN,這樣讀者就可以訓(xùn)練自己的模型。這樣做的好處是,我們可以使用SqueezeNet已經(jīng)學(xué)過的高級抽象內(nèi)容,而不是直接從網(wǎng)絡(luò)攝像頭向kNN提供原始像素信息,從而訓(xùn)練表現(xiàn)更好的分類器。
選擇使用TensorFlow.js也有其他原因:
1.進行原型設(shè)計時,無需編寫任何代碼。一開始通過簡單地在瀏覽器中運行原始示例,進行早期原型設(shè)計,對我打算使用的手勢進行訓(xùn)練,并查看系統(tǒng)如何執(zhí)行。即使輸出意味著pac-man在屏幕上移動。
2.可以使用TensorFlow.js直接在瀏覽器中運行模型。從可移植性,開發(fā)速度和Web界面交互的能力的角度來看,這都是巨大的優(yōu)勢。此外,模型可以完全在瀏覽器中運行,無需將數(shù)據(jù)發(fā)送到服務(wù)器。
3.由于可以在瀏覽器中運行,因此可以很好地與現(xiàn)代瀏覽器支持的語音到文本和文本到語音API進行交互。
4.測試、訓(xùn)練和調(diào)整速度更快,而這在機器學(xué)習(xí)任務(wù)中通常是一個挑戰(zhàn)。
5.由于我沒有手語數(shù)據(jù)集,并且訓(xùn)練示例基本上是我反復(fù)執(zhí)行手勢,因此使用網(wǎng)絡(luò)攝像頭來收集訓(xùn)練數(shù)據(jù)非常方便。
在徹底測試了這兩種方法,并發(fā)現(xiàn)兩個系統(tǒng)在測試中表現(xiàn)相當之后,我決定使用后者作為我的系統(tǒng)的基礎(chǔ),因為:
在較小的數(shù)據(jù)集上,kNN實際上可以比CNN更快/更好地執(zhí)行。 當使用越來越多的示例進行訓(xùn)練時,這種模型會變得很吃內(nèi)存,造成性能下降。但是因為我使用的數(shù)據(jù)集很小,所以這不是問題。
由于kNN并未真正從示例中學(xué)習(xí),因此在泛化方面表現(xiàn)很差。 因此,完全由一個人進行的實例訓(xùn)練的模型的預(yù)測,在另一個人身上的適用度不高。不過,這對我來說仍然不是問題,因為訓(xùn)練和測試模型的只有我一個人。
1.在瀏覽器中啟動站點時,第一步是提供訓(xùn)練示例。使用網(wǎng)絡(luò)攝像頭反復(fù)捕捉自己的手勢。這是個相對較快的過程,因為按住特定的捕獲按鈕會連續(xù)捕獲幀數(shù),直到釋放按鈕,使用適當?shù)氖謩輼擞洸东@的圖像。我訓(xùn)練的系統(tǒng)包含14個單詞,這些單詞在各種組合中允許我對Alexa發(fā)出各種請求。
2.訓(xùn)練完成后,進入預(yù)測模式。使用來自網(wǎng)絡(luò)攝像頭的輸入圖像并通過分類器運行,根據(jù)上一步驟中提供的訓(xùn)練示例和標簽手勢找到其最近的答案。
3.如果結(jié)果超過某個預(yù)測閾值,就將將手勢顯示到屏幕的左側(cè)。
4.接下來,使用Web Speech API進行語音合成,說出檢測到的手勢。
5.如果說出的單詞是Alexa,它會喚醒附近的Echo揚聲器并開始收聽查詢請求。另外值得注意的是,我設(shè)定了一個任意手勢(在空中揮右拳)來表示Alexa這個詞,因為美國手語中沒有Alexa這個單詞,反復(fù)拼寫A-L-E-X-A會很煩人。
6 一旦整個手勢短語完成后,我再次使用WebSpeech API來轉(zhuǎn)錄Echo揚聲器的響應(yīng),這個揚聲器響應(yīng)的請求,并不知道該請求來自另一臺機器。轉(zhuǎn)錄的響應(yīng)顯示在屏幕的右側(cè),供用戶閱讀。
7 再次做出喚醒手勢,清除屏幕并重新開始重復(fù)查詢的過程。
我在Github上傳了所有代碼(https://github.com/shekit/alexa-sign-language-translator)。讀者可以隨意使用和修改。
一些尚待完善之處
雖然系統(tǒng)運行情況相對較好,但確實需要一些粗略的改進,來幫助獲得理想的結(jié)果并提高準確性,如:
確保沒有檢測到任何符號,除非出現(xiàn)喚醒詞Alexa。
添加一個包含完整的全部類別的訓(xùn)練樣例,將其歸類為“其他”用于表示系統(tǒng)空閑狀態(tài)(無手勢的空白背景,人手臂自然下垂站立)。這可以防止錯誤地檢測到單詞。
在接受輸出之前設(shè)置高閾值,以減少預(yù)測錯誤。
降低預(yù)測速度??刂泼棵氲念A(yù)測量有助于減少錯誤的預(yù)測。
確保已在該短語中檢測到的單詞不再被視為新的預(yù)測。
另一個挑戰(zhàn)是準確預(yù)測用戶何時完成查詢簽名。這對于準確轉(zhuǎn)錄是必要的。如果轉(zhuǎn)錄提前觸發(fā)(在用戶完成簽名之前觸發(fā)),系統(tǒng)就會開始轉(zhuǎn)錄它自己的語音。否則,如果轉(zhuǎn)錄較晚觸發(fā)??赡軙?dǎo)致系統(tǒng)錯過轉(zhuǎn)錄Alexa的部分回答。為了克服這個問題,我實施了兩種獨立的技術(shù),每種技術(shù)都有各自的優(yōu)缺點:
第一個選項是在添加訓(xùn)練用的特定單詞時將它們標記為終端單詞(terminal words)。這里所說的terminal words是指用戶只會在短語的末尾簽名的詞。例如,如果查詢是“Alexa,what’sthe weather?”那么,通過將“weather”標記為一個terminal word,當檢測到這個詞時,就可以正確地觸發(fā)轉(zhuǎn)錄。雖然這種方法很有效,但這意味著用戶必須記住在訓(xùn)練期間將單詞標記為terminal words,并且還要假設(shè)這個詞只出現(xiàn)在查詢末尾。這意味著要重新調(diào)整你的查詢,如果問“Alexa,what’sthe weatherin New York?”,這種方法就不管用了。我們在視頻演示里使用了這種方法。
第二個選項是讓用戶簽署一個停止詞(stop-word),以便讓系統(tǒng)知道用戶已經(jīng)完成了查詢。一旦識別出這個停止詞,系統(tǒng)就會觸發(fā)轉(zhuǎn)錄。因此,用戶將簽署Wakeword >Query> Stopword。這種方法存在用戶忘記簽署停止詞的風(fēng)險,從而導(dǎo)致轉(zhuǎn)錄根本沒有被觸發(fā)。我在一個單獨的github branch中實現(xiàn)了這種方法,你可以在其中使用喚醒詞“Alexa”作為查詢的bookend,比如問“Alexa, what’s the weather in New York(Alexa)?”
當然,如果有一種方法能準確區(qū)分來自內(nèi)部源(筆記本電腦)的語音和來自外部源(附近的Echo)的語音,這整個問題就能解決,但這是另外一個挑戰(zhàn)了。
接下來,我認為還有很多其他的方法能處理這個問題,你可以試著用來創(chuàng)建自己的項目:
Tensorflow.js也發(fā)布了PoseNet,使用它可能是一種有趣的方法。從機器的角度來看,跟蹤手腕、肘部和肩膀在視頻幀中的位置應(yīng)該足以預(yù)測大多數(shù)單詞。在拼寫時,手指的位置通常最重要。
使用基于CNN的方法可能能夠提高準確性,并使模型更能抵抗平移不變性。CNN還有助于更好地推廣到不同的人,還可以包括保存模型或加載預(yù)訓(xùn)練的Keras模型的能力。這將不再需要每次重啟瀏覽器都對系統(tǒng)進行訓(xùn)練。
考慮時間特征的一些CNN+RNN或PoseNet+RNN的組合可以提高準確率。
使用tensorflow.js中包含的更新的可重用kNN分類器。
從我第一次發(fā)布這個項目以來,就在社交媒體上獲得廣泛分享和報道,甚至Amazon還在Echo Show上為說話障礙的人實現(xiàn)了一個輔助功能(Tap to Alexa)。這實在太酷了。希望在未來, Amazon Show或其他基于攝像頭和屏幕的語音助理都能加入這一功能。對我來說,可能這就是這個原型展示的最終用例了,同時也希望能夠為數(shù)百萬新用戶開放這些設(shè)備的能力。
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4717瀏覽量
99991 -
tensorflow
+關(guān)注
關(guān)注
13文章
327瀏覽量
60413
原文標題:【GitHub熱門】用TensorFlow.js讓智能音箱“聽懂”手語(代碼開源)
文章出處:【微信號:AI_era,微信公眾號:新智元】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論