在許多的電影裡面常會看到用口語(自然語言)來進行一些設備的操控,在這樣的運作中主要會面對兩個問題,第一個問題就是語音辨識(Speech recognition,就是要了解使用者說了什麼),另一個問題是語意辨識(Semantic recognition,就是了解使用者想做什麼),這兩個主題均是人工智慧中相當重要的課題。

關於語音辨識的部份,Google已經把這一個領域的技術發展的相當成熟了,Google Cloud Speech API讓開發人員透過API中的神經網路模型,將聲音轉換成文字。

而語意辨識的部份,Microsoft LUIS在這個方面可以幫我們處理,LUIS全名是Language Understanding Intelligent Services,是一個提供語句理解能力的服務,其實LUIS並非去分析語句(這是Text Analytics的功能),而是去嘗試理解一個句子的意義,找出用戶的企圖(intents)與相關聯的entities。

今天這一個智慧居家自然語言控制系統,就是利用前面兩個強有力的後援來加以完成的。整個系統的運作流程大概就是:行動裝置(人機界面)接收到使用者的語音輸入後,把語音資料傳送給語音辨識的服務(Google Cloud Speech API),語音辨識會幫我們把語音辨識成文字,這些文字會傳送到控制伺服器上,控制伺服器會把由語音轉出的文字傳送給語意辨識的服務(Microsoft LUIS),語意辨識會幫我們把文字辨識成使用者的意圖,控制伺服器在了解使用者的意圖後,會為這個使用者產生相關的控制指令並傳送至MQTT伺服器,最後智慧居家控制中心在接收到指令後,對於家中的設備進行相關的設定(開或關等等不同動作)。

接下來由人機界面來開始說明,一個部分一個部分來解釋系統的完成方式。人機界面是採用App Inventor 2(AI2)來完成的

在這裡主要應用SpeechRecognzier來幫我們把使用者說的話辨識成文字,由TextSpeech來幫我們把文字以語音的方式念出來,利用webViewew來顯示由控制伺服器傳回的執行結果。

程式碼超簡單,呼叫語音辨識,辨識後將結果以QueryString的方式,傳送給控制伺服器上由ASP.NET寫好的程式(LUIS.aspx),在webViewer中顯示結果。使用Google Cloud Speech API是相當單純的,只要直接使用,就可以使用Google已經訓練多年的語音辨識資料,得到相當好的辨識結果,但要使用Microsoft的語意辨識服務(LUIS)就沒有這麼輕鬆了,因為需要先做一些預備的動作。首先要到https://www.luis.ai,利用Microsoft的帳號登入

登入後可以看到如下的初始畫面

接下來要做的是建立一個LUIS app

第一次進入時畫面如下

在建立新App時要設定應用名稱、使用語系等相關內容

設定完後會進入應用主頁面,在這裡主要要用的功能是Intents與Entities

添加意圖(intents),這裡的意圖指的就是使用者想做的事情,以智慧居家自然語言控制系統這個範例來說,使用者的意圖應該就是開燈、關冷氣這一些的。

以這一個例子來說,為了簡化整個過程,我把使用者的意圖簡化成8個,畢竟只是用來給學生參考的範例,我可不想操死自己,因為每個意圖都需要進行訓練。目前有請學生進行健保承保問題的語意辨識,隨隨便便就會超過20個意圖,要訓練到七成以上的辨識率(我的要求),呵呵,覺得有點累!

添加意圖後,接著要做的是添加實體(entities),這些實體主要是被用來套用在意圖之上,以便在訓練後能用於辨識使用者的意圖

由於我刻意地去減少這個例子的複雜度,所以在智慧居家自然語言控制系統只有六個實體(四個可控制的設備,兩個控制的動作),這些實體可以搭配使用者可能針對特定意圖說出的語句範例(Utterance)進行相關的訓練,以提高LUIS對語句的理解程度

在對意圖與相關語句標示完相對應的實體後(詳細的作法網路上可以找到許多說明),就可以開始訓練此APP

訓練完成後,可利用Test來測試辨識率是否符合需求,是否需加強訓練

辨識率符合需求後,就可以發佈以供其他應用使用

在這邊有這個應用程式的ID與KEY,之後在寫應用程式時會用到

假設已完成LUIS的訓練,也發佈到網路上,就可以寫程式來使用這個語意辨識的服務,在控制伺服器上,我是使用ASP.NET寫的程式來接收由人機界面所傳來的語音辨識結果(文字),將這文字傳送至訓練好的LUIS服務中進行語意辨識,語意辨識的結果傳回控制伺服器上後會根據辨識出的使用者意圖,向MQTT伺服器傳送智慧居家的控制指令。在ASP.NET程式寫作上,LUIS已有Microsoft提供的元件可以使用,可以在建立LUIS應用時先用NuGet封裝管理員先把所需的套件裝好

安裝Microsoft.Congitive.LUIS

可以使用如下的程式碼片段,利用先前提及的ID與KEY來連線特定的LUIS語意辨識服務,以得到使用者可能的意圖與分數

這種寫法主要是用QueryString來寫方便由人機界面傳送訊息。一般來說意圖分數逹到0.7以上才比較有可信度,所以在控制上就是取意圖分數最高(超過0.7)做為使用者想做的事情。假設使用者在人機界面上以語音的方式說了"請幫我開啟客廳的電燈",控制伺服器在語意辨識後可以了解使用者的真正意圖是要開燈(第二高的意圖"開冷氣"分數只有0.051)

在辨識出使用的意圖之後,就准備傳送控制指令至MQTT伺服器。有關於MQTT伺服器的架設應用可參考MQTT的架設與測試MQTT資料的抓取啟用MQTT的身份驗證這三篇文章,這裡不再特別描述。成功的架設MQTT伺服器後,在上一個畫面執行時,伺服器上應可看到這樣的訊息,表示傳送動作成功了

在控制指令送到MQTT伺服器後,智慧居家控制中心會透過MQTT的協定即時接收針對此控制中心的指令。在這個範例我是使用ESP8266來建構模擬控制中心,關於ESP8266部分的應用可參考ESP8266 D1 mini傳送資料到MQTT Server、接收資料進行相關控制ESP8266 D1 mini連線AP與保存相關參數。在這一個ESP8266我用四個燈來代替四個居家中可控制的設備,當使用者使用語音說出他的意圖後,可以依他的需求進行設備1-4的開與關(以亮燈與關燈來示意)

寫到這裡,突然發現我把各個部分都寫完了,吔!