Day 29 Chatbot integration- 多功能 chatbot 就此诞生!

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.txthttps://github.com/KuiMing/triathlon_azure

最後的成果

  • 看图学英文

  • 韩文翻译机器人

  • 人脸登入
  • 汇率预测,登入才能使用
非登入状态 已登入状态

终於,我们打完了大魔王,迎来终章。


<<:  Day.21 从零开始 - 实务需求学SQL_2

>>:  13 - cheat.sh - 终端机的程序百科全书

Day14:SwiftUI—ForEach、ScrollView

前言 这一篇也是关於 SwiftUI 的。 这次来讨论 ForEach、ScrollView。 Fo...

天翼云盘免安装客户端下载文件

当天翼云盘下载按钮变灰没办法点击,如下图 可使用审核元素使之可以点击和获取下载链接 搜索 btn b...

Day 29 - ios 开发实作 (今天还要继续吃吗APP-3)

今天会使用到foreach,所以开头我们先来学一下要怎麽使用Foreach。 Foreach 什麽时...

[Day15] Boxenn 实作 Repository & Query

Repository 将 source wrapper 、 record mapper 、 fact...

[自学笔记]关於SVN(Subversion) 版本控制系统

安妞大家 以下一样是自学笔记 什麽是SVN(Subversion) ? SVN(Subversion...