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

如何通過開源的 TensorFlow.js BERT 模型來構建應用
如何基于 ES6 的 JavaScript 進行 TensorFlow.js 的開發
使用TensorFlow和Artemis構建解決農村面臨的問題設備

評論