iT邦幫忙

2021 iThome 鐵人賽

DAY 29
0

Chatbot integration- 多功能 chatbot 就此誕生!

終於到了這一步,要把所有功能整合在一起了。前面雖然很痛苦,但在我看來最痛苦的還是這一步。之前,教朋友處理的時候,很明顯這一個步驟看似最簡單,實際才是大魔王!首先,先定義好我們想要做到的功能:

  1. 看圖學英文:利用 Azure 實踐物體偵測和影像描述的功能,過程中照片需要放到 Azure Blob,偵測結果透過 Flex message 呈現。
  2. 韓文翻譯機器人:分成兩個部分:第一是利用 OCR 偵測圖片中的文字,如果是韓文則翻譯成中文,並且將韓文轉換成語音;第二是偵測文字訊息是否為韓文,如果是韓文一樣翻譯並提供語音。兩個部分都需要透過 Flex message 呈現。
  3. 人臉登入:上傳照片,進行人臉辨識,如果圖中人物是已經先前在資料庫中已有紀錄,且與專用於此 chatbot 的 User ID相符,則確認身份,並讓此人登入,登入時限為一天。之後,此人使用特殊功能(之前是以韓文翻譯機器人為例,這次則是匯率預測)時,便可以在登入狀態下使用。
  4. 預測匯率小工具:讓使用者在登入狀態下使用,輸入 currency 會得到當下臺幣對美金的匯率,輸入 prediction 則會得到隔天匯率收盤價的預測。若非在登入狀態使用預測工具,輸入 prediction 就只會得到 "prediction" 的回應。

整合時,最有可能會遇到的問題,電腦視覺的處理太久,畢竟圖片需要經過人臉辨識、OCR、物體偵測和影像描述,可能會讓處理的時間過長,處理的時間超過30秒,Line chatbot 會因為 timeout 無法回應使用者。所以,必須考慮先後順序,省略不必要的動作。我的做法是:

  • 先處理人臉辨識,若發現照片只有一張人臉,就直接輸出人臉辨識結果。
  • 萬一人臉太多,或者沒有人臉,則進行OCR。
  • 由於 OCR 完之後,如果是韓文還必須要進行翻譯和轉換成語音。如果翻譯完才發現並非韓文,才去進行物體偵測,就又拖到時間了。所以,在 OCR 完之後,利用langdetect這個套件偵測是否為韓文,若非韓文,則跳過翻譯與轉換語音的步驟。
  • 如果非人臉辨識也非韓文,就直接做物體辨識和影像描述。
  • 經過以上處理,可能還是時間還是太長,可以考慮將圖片尺寸縮小,目前測試的結果是讓最長邊的長度為 700 px ,處理時間是剛剛好的。
def resize_image(filename):
    """
    Resize image: fix the max aspect
    """
    base = 700
    img = Image.open(filename)
    ratio = base / float(max(img.size))
    width = int((float(img.size[0]) * float(ratio)))
    height = int((float(img.size[1]) * float(ratio)))
    img = img.resize((width, height), Image.ANTIALIAS)
    img.save(filename)
    return img
  • 如果還不行,可以考慮人臉登入之後,就省略人臉辨識的步驟。所幸,這次的 chatbot 不需要如此。

整合的過程,千萬不要一口氣把全部功能做完才git push到 Azure Web App,這樣不好除錯,錯誤很也可能會有如滔滔江水 連綿不絕 更有如黃河氾濫 一發不可收拾。之前幫朋友除錯時,往往只是一個打錯字的小錯誤,都有可能會因為錯誤太小,但程式碼太長,結果花了一兩個小時才解決一個小問題,建議可以用會幫忙偵測錯誤的編輯器來協助編輯,例如:Visial Studio Code。最好是,一個功能做完就git push一次,以下是我實作的順序:

  • Line chatbot webhook callback
  • 讓 chatbot 針對文字訊息回話
  • 針對 "currency" 與 "prediction" 這兩個文字訊息,提供匯率和預測
  • 影像描述
  • Flex Message
  • 上傳圖片到 Azure Blob
  • 物體偵測並且畫圖
  • 結合物體偵測和影像描述結果,以Flex Message傳出
  • 偵測圖片中的韓文
  • 針對韓文翻譯與提供語音
  • 人臉辨識
  • 縮小圖片尺寸
  • 以人臉辨識的結果登入
  • 檢查登入狀態,在登入的情況下,才能使用匯率預測功能

準備好config.json

{
    "line": {
        "line_secret": "your line secret",
        "line_token": "your line token",
    },
    "azure": {
        "cv_key": "your subscription key of computer vision",
        "cv_end": "your endpoint of computer vision",
        "blob_connect": "your connect string",
        "blob_container": "your blob container name",
        "trans_key": "your subscription key of translator",
        "speech_key": "your subscription key of speech",
        "face_key": "your subscription key of Azure Face service",
        "face_end": "your endpoint of Azure Face service",
        "mongo_uri":"your mongon uri",
        "azureml_endpoint": "your endpoint url of service on azure service"
}

然後,我們就可以攻略大魔王了。所有的程式碼,我都放在 github 上,有興趣的人可以參考application.pyrequirements.txt:https://github.com/KuiMing/triathlon_azure 。

最後的成果

  • 看圖學英文

  • 韓文翻譯機器人

  • 人臉登入
  • 匯率預測,登入才能使用
非登入狀態 已登入狀態

終於,我們打完了大魔王,迎來終章。


上一篇
Day 28 Chatbot integration- 匯率預測小工具
下一篇
Day 30 結語和 Azure 的學習資源- 打完魔王之後的最終章通常是劇情動畫
系列文
我不太懂 AI,可是我會一點 Python 和 Azure30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言