资讯专栏INFORMATION COLUMN

爆肝一周,用Python在物联网设备上写了个智能语音助手

I_Am / 2512人阅读

摘要:背景介绍智能语音助手作为物联网领域的一个重要生态成员,是一种全新的交互方式,它能够解放双手,随时提供服务,无须借助任何按键。学完该案例让你对智能语音助手有一个全新的认识。快来打造你的智能语音助手吧

1. 背景介绍

智能语音助手作为物联网领域的一个重要生态成员,是一种全新的交互方式,它能够解放双手,随时提供服务,无须借助任何按键。想必很多开发者都有玩过天猫精灵、小爱同学或者小度吧,看到这些炫酷的人工智能产品,是不是很想搞清楚它到底怎么工作的冲动,是不是也想自己打造一台专属智能语音助手。仅仅通过说出“HaaS HaaS”、“天猫精灵”、或“小爱同学”,就可以唤醒语音助手并告诉它想要的信息。在商业领域的人工智能产品要么是C或者C++开发,工作量巨大。现在有了HaaS EDU K1,通过数100行Python代码就可以轻松打造一款智能音箱。这种全新的开发方式,还不来体验下!

开始学习之前我们先看一下案例效果:

爆肝一周,用Python在物联网设备上写了个智能语音助手!

涉及知识点

  • HaaS小程序配网
  • https网络通信
  • 本地唤醒AI推理引擎运用
  • 云端智能语音交互平台应用
  • 云端智能对话机器人应用
  • 模拟MIC声音采样
  • 喇叭播放wav、mp3文件
  • 文件系统应用
  • OLED绘字

2. 方案介绍

本案例基于HaaS云端一体智能语音交互框架打造的。整个框架如下:

从框架可以看到,该案例是一个完整的云端语音交互全链路,包括了本地语音唤醒、回声消除、降噪、ASR、NLP、TTS等。学完该案例让你对智能语音助手有一个全新的认识。

2.1 软件功能

整个方案支持:

  1. HaaS小程序配网;
  2. HaaS HaaS离线语音唤醒;
  3. 云端智能语音交互;
  4. 自定义问答、闲聊、多轮对话、知识库等对话流管理。

3. 开发环境搭建

3.1 硬件准备

3.1.1 使用HaaS语音扩展板

HaaS语音扩展板是专门为HaaS EDU K1教育神器打造的,无缝对接,即查即用,不过目前没有对外售卖,后续将在一些训练营或活动中定向赠送。以下是使用HaaS语音扩展板的硬件图,最终正式的版本比这个更小。

3.1.2 使用外接麦克风和喇叭

如果没有HaaS语音扩展板也没有关系,请按照如下步骤接入麦克风和喇叭:

麦克风接入MIC1_N接口,喇叭介入SPKLP接口。

HaaS EDU K1硬件排线图请参考
https://help.aliyun.com/document_detail/205267.html

购买链接仅供参考!!我们不负责商家发货的品质保障等问题!!

名称

数量

参考链接

HaaS EDU K1开发版

1

HaaS EDU K1购买链接

microUSB数据线

1

普通microusb线即可

模拟MIC

1

模拟MIC参考链接

喇叭

1

喇叭参考链接

杜邦线

数条

NA

3.2 环境搭建

参考《HaaS EDU K1快速开始》中安装HaaS Studio完成AliOS Things开发环境搭建。

3.2.1 Python固件编译、烧录

参考 《HaaS EDU K1快速上手》烧录带Python引擎的固件包。

打开串口

固件烧录完成后,可以通过串口查看示例的运行结果,打开串口的具体方法可参考《HaaS EDU K1快速开始》查看日志章节。

3.2.2 Python案例代码下载

该案例相关的源代码下载可参考《创建工程》,该案例是Python案例。
其中:

选择Python开发

选择解决方案: “voice_assistant”

选择开发板: HaaS EDU K1

4. 软件架构

4.1 代码结构

├── asr.py                            # 云端语音识别处理接口├── kws.py                            # 语音唤醒识别处理接口├── main.py                           # 主程序├── nlp.py                            # 云端智能对话交互处理接口├── tts.py                            # TTS语音合成处理接口├── oled.py                           # oled显示接口├── player.py                         # TTS语音播报接口├── README.md                         # 使用文档说明├── recorder.py                       # 录音接口├── resource                          # 本地语料文件│   ├── network_connecting.mp3│   ├── network_fail.mp3│   ├── network_ok.mp3│   ├── noquestion.mp3│   ├── sorry.mp3│   ├── wakeup.mp3│   ├── welcome.mp3│   ├── get_token_fail.mp3└── └── wifi_smartconfig.mp3

4.2 程序主体

100行Python代码搞定程序主体:

def main():    # 初始化声卡驱动    print("enter main function/n")    Snd.install_codec_driver()    Snd.init()    # 打开语音扩展板PA,PIN23: GPIO19    gpio = GPIO()    gpio.open("GPIO19")    gpio.write(1)    gpio.close()    # 初始化oled    oledInit()    #初始化播放器    audioPlayerInit()    # 录音初始化    audioRecorderInit()    # 连接WiFi    connectWifi()    # get_wifi_status()    sessionId = None    is_session_finished = True    # 初始化kws唤醒词    global wakeup, count    wakeup = False    # 播报欢迎语料    oledShowText("I am your HaaS", 6, 18, 1, True)    oledShowText("voice assistant!", 4, 30, 1, False)    audioPlay(welcome_file)    while True:        if is_session_finished == True: # 非多轮对话时播放提示音            oledShowText("I am your HaaS", 6, 18, 1, True)            oledShowText("voice assistant!", 4, 30, 1, False)            kwsEnable(kwsCb)            while wakeup == False:                time.sleep(0.2)            kwsDisable()            # 播放唤醒提示音            oledShowText("Host, i am here!", 2, 24, 1, True)            audioPlay(wakeup_file)        wakeup = False        is_session_finished = True        # record 3sec pcm data        oledShowText("Please speak...", 8, 24, 1, True)        rframes, length = audioRecord(duration)        # ASR识别        oledShowText("Recognizing...", 12, 24, 1, True)        # 动态获取token        token_resp = ucloud_ai.get_token_id(access_key, access_secret, domain, region_id)        print("token_resp: %s" %token_resp)        if token_resp == None:            audioPlay(token_fail_file)            continue        token_resp = ujson.loads(token_resp)        if token_resp != None:            if token_resp.get("ErrMsg") != "":                audioPlay(token_fail_file)                continue            asr_token = token_resp.get("Token").get("Id")        else:            print("get token fail")            asr_token = asr_default_token            if asr_token == None:                audioPlay(sorry_file)                continue        asr_text = asrProcess(app_key, asr_token, "pcm", rframes, length)        if asr_text == None:            oledShowText("Answering...", 12, 24, 1, True)            audioPlay(sorry_file) # 抱歉,我没有听清楚,请重新说一次试试            continue        # NLP自然语音处理        is_session_finished, sessionId, intentName, text = nlpProcess(access_key, access_secret, instance_id, sessionId, asr_text)        if text == None:            oledShowText("Answering...", 12, 24, 1, True)            audioPlay(noquestion_file) # 抱歉,没有找到你问的问题,请换一个试试            continue        # TTS合成        # text = "今天天气很好"        tts_resp = ttsProcess(app_key, asr_token, 3, 16000, "siqi", 100, 0, 0, text, tts_file)        oledShowText("Answering...", 12, 24, 1, True)        # 根据意图执行设备端动作        doIntent(intentName)        if tts_resp == True:            # 播放tts            print("start to audioPlay tts/n")            audioPlay("fs:" + tts_file)        else:            print("tts resposne fail")            audioPlay(network_fail_file)    # 释放kws资源    kwsDisable()    # 释放播放器    audioPlayerUninit()    # 释放录音资源    audioRecordUninit()    # 释放声卡驱动    Snd.uninstall_codec_driver()    Snd.deinit()

5. 案例体验

本案例不支持打断功能,所以在唤醒后等待语音播报完成在进行问答,屏幕上有对应的提示。

5.1 云端功能开通

5.1.1 阿里云账号开通及访问控制

参考《爆肝一周,用Python在物联网设备上写了个智能语音助手-创建阿里云账号》完成以下两个步骤:

  1. 注册阿里云账号
  2. 获取AccessKey和Secret

5.1.2 智能语音交互开通及配置

参考《爆肝一周,用Python在物联网设备上写了个智能语音助手-阿里云智能语音交互》完成以下三个主要步骤:

  1. 智能语音交互功能开通
  2. 完成语音识别和语音合成功能进行配置
  3. 获取智能语音交互Appkey

5.1.3 智能对话机器人开通及配置

参考《爆肝一周,用Python在物联网设备上写了个智能语音助手-阿里云智能对话机器人》完成以下四个主要步骤:

  1. 创建会话机器人
  2. 配置机器人知识库
  3. 发布机器人
  4. 在机器人管理页获取对话机器人实例ID

5.2 设备端代码配置

5.2.1 账号信息配置

在上述5.1云端功能开通完成后,将获取到的AccessKey/Access Secret/Appkey/机器人ID填入到main.py中:

# 阿里云访问账号access_key = "Your-Access-Key"access_secret = "Your-Access-Secret"# 智能语音交互app_key = "Your-App-Key"# 登陆https://nls-portal.console.aliyun.com/overview# 查看你创建的项目功能配置旁边的appkey# Chatbot对话机器人实例IDinstance_id = "chatbot-cn-XXXXXXX"# 登陆https://chatbot.console.aliyun.com/yunme.htm#/beebot_preview/overview# 查看您创建的机器人ID

5.2.2 开关灯意图匹配

在5.1.3 智能对话机器人开通及配置中介绍了如何创建开关灯对话流,设备端events中的名称需与对话流中的意图名称保持一致。设备端对意图的处理代码位于main.py中,代码如下:

def doIntent(intentName):    if intentName == None:        return    print("intentName: %s" %intentName)    leds=("led_r", "led_g", "led_b")    events = [                {"light_on": "leds", "value": 1},                {"light_off": "leds", "value": 0},                {"red_light_on": "led_r", "value": 1},                {"red_light_off": "led_r", "value": 0},                {"green_light_on": "led_g", "value": 1},                {"green_light_off": "led_g", "value": 0},                {"blue_light_on": "led_b", "value": 1},                {"blue_light_off": "led_b", "value": 0},    ]    gpio = GPIO()    for event in events:        led = event.get(intentName)        if led != None:            value = event.get("value")            if led == "leds":                for led in leds:                    gpio.open(led)                    gpio.write(value)                    gpio.close()            else:                gpio.open(led)                gpio.write(value)                gpio.close()

当匹配意图为red_light_on时,设备端将GPIO led_r拉高置1点亮红灯。其他意图类似处理,如果有特殊需求,可以根据需要修改意图,比如控制其他GPIO或者PWM等操作。

5.3 Python代码推送

参考《Python 轻应用开发工具 HaaS-Studio》推送本案例Python代码包到设备中。

注意事项

如果遇到代码推送结束时报错,请确保设备/data/目录下,除python相关文件外,没有其他不必要的文件,如有,请删除再重试。

5.4 HaaS小程序配网

  1. 确认OLED上显示"Enter WiFi Smart Config...";
  2. 打开手机支付宝,搜索HaaS小程序,同时打开手机蓝牙功能;
  3. 点击扫描待配网设备;
  4. 选择Wi-Fi SSID;
  5. 填入Wi-Fi密码;
  6. 点击发起配网;
  7. 等待设备端连接Wi-Fi,当听到语音播报“网络连接成功!”或OLED看到“WiFi Connected!”表示网络连接成功。

注意事项

如果已经连接过WiFi,想要重新配网,请进入串口按"Ctrl+C",然后按“Ctrl+D”退出Python,再rm /data/wifi.conf后重启进入配网。

5.5 语音交互体验

联网成功后,说出“HaaS HaaS“后,设备唤醒。可以开始向HaaS小助手提问了,让她帮你查天气,开关灯等。当然前提是你在智能对话机器人中已经配置好对话策略。快来打造你的智能语音助手吧!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/119774.html

相关文章

  • 亚马逊新时代:云服务独领风骚,AI助手无处不在

    摘要:亚马逊人工智能语音助手技能超过万个,全球各主要硬件厂商纷纷搭载或兼容,使得其亚马逊助手无处不在。物联网设备透过云端实现跨行业和跨设备互联互通,所收集数据除了在边缘侧处理,还需要上传至云端,云端作为数据集散地,各种数据经过云端AI处理后,对这些数据利用将会带来新的商业模式。在物联网资深专家杨剑勇看来,云计算是全球物联网重要基础设施,作为物联网产业发展基石,聚集了亚马逊、微软、谷歌和BAT等重量...

    Bmob 评论0 收藏0
  • Google Home与亚马逊Echo “家庭云计算机”战争打响

    摘要:年月日,智能音箱全球发货,早在今年月的谷歌开发者大会上,作为新的生态圈硬件角色开始涉足智能家居领域,锁定目前美国最火爆的智能家居硬件亚马逊为竞争对手。2016年11月4日,Google Home智能音箱全球发货,早在今年5月的谷歌I/O开发者大会上,Google Home作为新的Google生态圈硬件角色开始涉足智能家居领域,锁定目前美国最火爆的智能家居硬件亚马逊Echo为竞争对手。Goog...

    Lycheeee 评论0 收藏0
  • JavaScript在物联网中的应

    摘要:定律在那篇最流行的编程语言能做什么里,我们列举了在不同领域的使用情况,今天让我们来详解一下在物联网中的应用。这个硬件层决定了物联网应用比应用更加复杂。这时,我开始关注实现物联网应用的可能性。 凡是能用JavaScript写出来的,最终都会用JavaScript写出来。 —— Atwood定律 在那篇《最流行的编程语言JavaScript能做什么?》里,我们列举了JavaScript在不...

    aaron 评论0 收藏0
  • JavaScript在物联网中的应

    摘要:定律在那篇最流行的编程语言能做什么里,我们列举了在不同领域的使用情况,今天让我们来详解一下在物联网中的应用。这个硬件层决定了物联网应用比应用更加复杂。这时,我开始关注实现物联网应用的可能性。 凡是能用JavaScript写出来的,最终都会用JavaScript写出来。 —— Atwood定律 在那篇《最流行的编程语言JavaScript能做什么?》里,我们列举了JavaScript在不...

    Barrior 评论0 收藏0
  • 2017 十大失败 AI 案例

    摘要:一名德国男子不在家,家中的被意外激活,并在半夜两点开始播放音乐,吵醒了邻居。然而在两个小时后,公交车就被一辆大货车撞上了。汇丰马上推出了解决方案尝试三次失败之后就锁定账户。 showImg(https://segmentfault.com/img/bV192y?w=700&h=312); 简评:整体来说,2017 年的 AI 进步还是不小的,比 2016 的 AR/VR 强很多。今天的...

    tomener 评论0 收藏0

发表评论

0条评论

I_Am

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<