1. 背景介绍

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

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

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

相关链接:

爆肝一周,用Python在物联网设备上写了个智能语音助手-创建阿里云账号

爆肝一周,用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硬件排线图请参考
HaaS EDU K1说明书 - IoT物联网操作系统 - 阿里云

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

名称

数量

参考链接

HaaS EDU K1开发版

1

HaaS EDU K1购买链接

Type-C USB数据线

1

普通Type-C USB数据线即可

模拟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: GPIO19gpio = GPIO()gpio.open('GPIO19')gpio.write(1)gpio.close()# 初始化oledoledInit()#初始化播放器audioPlayerInit()# 录音初始化audioRecorderInit()# 连接WiFiconnectWifi()# get_wifi_status()sessionId = Noneis_session_finished = True# 初始化kws唤醒词global wakeup, countwakeup = 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 = Falseis_session_finished = True# record 3sec pcm dataoledShowText('Please speak...', 8, 24, 1, True)rframes, length = audioRecord(duration)# ASR识别oledShowText('Recognizing...', 12, 24, 1, True)# 动态获取tokentoken_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)continuetoken_resp = ujson.loads(token_resp)if token_resp != None:if token_resp.get('ErrMsg') != '':audioPlay(token_fail_file)continueasr_token = token_resp.get('Token').get('Id')else:print('get token fail')asr_token = asr_default_tokenif asr_token == None:audioPlay(sorry_file)continueasr_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:# 播放ttsprint('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对话机器人实例ID
instance_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:returnprint('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小助手提问了,让她帮你查天气,开关灯等。当然前提是你在智能对话机器人中已经配置好对话策略。快来打造你的智能语音助手吧!

开发者支持

如需更多技术支持,可加入钉钉开发者群,或者关注微信公众号。

更多技术与解决方案介绍,请访问HaaS官方网站https://haas.iot.aliyun.com。

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

  1. 爆肝一周,用Python在物联网设备上写了个智能语音助手-阿里云智能语音交互

    基于HaaS云端一体框架,用Python打造HaaS EDU K1智能语音助手的过程中需要用到云端能力.本篇文章介绍如何开通阿里云智能语音交互,并创建配置语音识别及语音合成项目,获取Appkey.请参 ...

  2. 阿里云智能物联网解决方案宣讲会,帮助天津东丽临空经济区数字腾飞

    简介:阿里云IoT助力天津,加速深耕数字化进程 9月14日,阿里云智能物联网解决方案对外宣讲会暨天津东丽临空经济区-浙江省中小企业协会经贸合作交流座谈会在杭州召开. 大会聚焦天津东丽临空经济区产业发展 ...

  3. 一张图看懂阿里云新发布的物联网设备上云神器——HiTSDB + IoT套件

    近日,阿里云针对物联网企业遇到的设备认证困难.安全问题突出等问题,发布了HiTSDB +IoT 套件的一体化解决方案,能够支持物联设备快速上云,高效设备管理,数据安全,低成本海量数据存储,实时掌握设备 ...

  4. 5分钟教你如何利用华为云IoT进行物联网设备上云

    一.背景 近些年,云计算的发展使得物联网技术突飞猛进,万物联网已经成为这个时代的标识,没有物联网之前,你能想象人在路上就能打开家里的空调?有了物联网,冰箱也能听懂主人在说什么:有了物联网,音响可以直接 ...

  5. ESP-Skainet智能语音助手,智能物联网方案,语音唤醒识别准确率高

    消费级智能硬件是最早显示出市场潜力的赛道,市场各方都在瞄准消费级智能交互终端.而智能终端的背后还有广阔的生态,包括语音开放平台.语音操作系统.内容等等. 近年行业正在经历从单一商业模式向多元化商业模式 ...

  6. 【Paper Reading】MCUNet:物联网设备上的微型深度学习

    MCUNet: Tiny Deep Learning on IoT Devices 本文纯翻译,原文见:https://arxiv.org/abs/2007.10319 目录 MCUNet: Tiny ...

  7. Python语言打造智能语音助手——附完整源码

    Python语言打造智能语音助手--附完整源码 随着智能家居.智能办公等领域的逐渐兴起,实现语音控制与交互已成为了一种趋势.而Python语言是一门极具魅力的编程语言,其强大的库.简洁的语法以及易于学 ...

  8. 物联网设备上云难?华为云IoT帮你一键完成模型定义,快速在线调试设备

    摘要:在不到3分钟的操作里,不仅完成了一款智慧烟感设备在云端的模型定义,还通过在线调试了解到了设备和远端通信的过程. 本文分享自华为云社区<物联网设备上云难?华为云IoT帮你一键完成模型定义,快 ...

  9. 【小白教程】基于树莓派的智能语音助手-python

    [完整教程零基础]基于树莓派的智能语音助手-python 树莓派3b+.python3系统自带.百度语音识别与合成.调用图灵机器人(热词唤醒失败,可用snowboy) 1.Windows系统下[下载+ ...

最新文章

  1. AI一分钟 | 李开复:AI创业公司估值今年会降20%~30%;谷歌让搜索结果加载速度提升两倍...
  2. 深入剖析iLBC的丢包补偿技术(PLC)
  3. Android Studio项目引入外部库注意事项(PullToRefresh)
  4. k8s 命令 重启_快速入门Kubernetes(K8S)——资源清单
  5. 64位ubuntu 12.04下如何解决中文乱码的问题
  6. 使用AndroidStudio时 R标红的一些问题总结
  7. [转]C#操作注册表
  8. java数据结构编写二叉树_java 数据结构与算法 BinaryTree二叉树编写
  9. python pptx表格里的字体怎么调整_在python pptx中更改序列填充颜色
  10. js高级学习笔记(b站尚硅谷)-4-函数
  11. 牛客SQL题解 - 查找employees表
  12. 荣耀8鸿蒙刷机,华为荣耀平板s8-701w刷机记(示例代码)
  13. 计算机无法读出u盘,教你win10系统电脑无法识别u盘的应对办法
  14. Springboot+Vue开发的简单的后台管理系统
  15. android banner停止轮播,android如何实现banner轮播图无限轮播效果
  16. underfined 与 null 的区别
  17. Android开发之WebDav
  18. intent跳转和转场动画
  19. 2014 acm亚洲区域赛(北京)总结
  20. 数据标注这份工作,不是你想做就能做

热门文章

  1. SQL语句大全 作者:阿多
  2. Python pandas在读取csv文件时(linux与windows之间传输),数据行数不一致的问题
  3. 程序员成长记录(前端转后端)
  4. 想成为注塑模具设计高手:这个你一定要懂
  5. 传统企业上云的三个正确姿势是什么?
  6. 物联网周刊(第 1 期):电动汽车的未来
  7. 对ASM存储管理的一些初步理解记录
  8. 英文文献作者的几种写法
  9. TELNET协议笔记
  10. 历年四级作文真题范文