爆肝一周,用Python在物联网设备上写了个智能语音助手-总体方案-《神奇的物联网》

简介: 基于HaaS EDU K1物理网开发板,通过数100行Python代码轻松打造一款智能语音助手!

1. 背景介绍

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


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

涉及知识点

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

2. 方案介绍

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

云端一体智能语音交互框架.png

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

2.1 软件功能

整个方案支持:

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

3. 开发环境搭建

3.1 硬件准备

3.1.1 使用HaaS语音扩展板

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

HaaS智能语音.jpg

3.1.2 使用外接麦克风和喇叭

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

HaaSEDU-kws接线图.png

麦克风接入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

haas智能语音助手工程创建.png

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代码搞定程序主体:

defmain():
# 初始化声卡驱动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唤醒词globalwakeup, countwakeup=False# 播报欢迎语料oledShowText('I am your HaaS', 6, 18, 1, True)
oledShowText('voice assistant!', 4, 30, 1, False)
audioPlay(welcome_file)
whileTrue:
ifis_session_finished==True: # 非多轮对话时播放提示音oledShowText('I am your HaaS', 6, 18, 1, True)
oledShowText('voice assistant!', 4, 30, 1, False)
kwsEnable(kwsCb)
whilewakeup==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)
iftoken_resp==None:
audioPlay(token_fail_file)
continuetoken_resp=ujson.loads(token_resp)
iftoken_resp!=None:
iftoken_resp.get('ErrMsg') !='':
audioPlay(token_fail_file)
continueasr_token=token_resp.get('Token').get('Id')
else:
print('get token fail')
asr_token=asr_default_tokenifasr_token==None:
audioPlay(sorry_file)
continueasr_text=asrProcess(app_key, asr_token, 'pcm', rframes, length)
ifasr_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)
iftext==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)
iftts_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对话机器人实例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中,代码如下:

defdoIntent(intentName):
ifintentName==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()
foreventinevents:
led=event.get(intentName)
ifled!=None:
value=event.get('value')
ifled=='leds':
forledinleds:
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小助手提问了,让她帮你查天气,开关灯等。当然前提是你在智能对话机器人中已经配置好对话策略。快来打造你的智能语音助手吧!

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
目录
相关文章
|
18天前
|
物联网
DC/AC电源模块:为物联网设备提供可靠的电力支持
DC/AC电源模块:为物联网设备提供可靠的电力支持
DC/AC电源模块:为物联网设备提供可靠的电力支持
|
18天前
|
安全 物联网
BOSHIDA DC/AC电源模块:为物联网设备提供可靠的电力支持
BOSHIDA DC/AC电源模块:为物联网设备提供可靠的电力支持
BOSHIDA DC/AC电源模块:为物联网设备提供可靠的电力支持
|
17小时前
|
存储 人工智能 安全
物联网设备安全通信协议:现状、挑战与未来展望
【6月更文挑战第30天】物联网(IoT)技术快速发展带来设备安全通信挑战。现有协议如ZigBee、蓝牙在安全上分为公钥和对称密码体系。面临资源限制、安全威胁、隐私保护和互操作性问题。未来趋势聚焦轻量级协议、多层次安全、隐私技术与标准化,以增强物联网安全性,推动行业健康发展。
|
2天前
|
传感器 安全 物联网
物联网(IoT)设备的硬件选型与集成技术博文
【6月更文挑战第28天】物联网设备硬件选型与集成聚焦关键要素:功能匹配、性能稳定性、兼容扩展及成本效益。嵌入式系统、通信协议、数据处理和安全性技术确保集成效果,支撑高效、智能的IoT系统,驱动家居、城市与工业自动化变革。
|
3天前
|
传感器 存储 监控
使用Python进行物联网设备控制与数据收集
通过这些步骤和示例,可以看到Python在物联网领域的广泛应用和强大功能。Python不仅能够轻松实现硬件控制和数据处理,还能通过丰富的库和工具支持高效的开发、部署和运维。随着物联网技术的不断发展,Python将继续在智能家居、工业自动化、智慧城市等领域发挥重要作用,为开发者提供更多的创新和高效的解决方案。
|
11天前
|
安全 物联网 网络安全
智能家居安全:物联网设备的风险与防护
【6月更文挑战第18天】随着科技的飞速发展,智能家居设备已经深入人们的日常生活。然而,这些便捷的智能设备背后隐藏着不容忽视的安全风险。本文将探讨智能家居中常见的安全威胁,并提供有效的预防措施,帮助用户构建一个更加安全的智能家居环境。
|
15天前
|
存储 Python
Python成员属性的内存特性与底层内存优化方案
这篇博客主要分享一下python成员属性的内存特性,也就是python底层节约内存的优化方案
|
26天前
|
传感器 物联网 Linux
物联网设备的操作系统之争:Linux vs RTOS
【6月更文挑战第4天】在遥远的数码星球,物联网城中的Linux先生与RTOS小姐展开激烈角逐,分别在操作系统领域各显神通。Linux先生以其开源、兼容性强、功能丰富占据服务器、桌面及嵌入式设备市场,适合处理复杂任务和需要强大计算能力的设备。而RTOS小姐以实时性、高效响应和低资源占用见长,适用于资源有限、强调实时性的物联网设备。设备制造商在两者间抉择,引发物联网设备操作系统的选择大战。通过Python与FreeRTOS示例,展现了两者在智能家居和生产线控制等场景的应用。在物联网世界,Linux与RTOS共同推动设备智能化,为生活带来更多便捷。
68 3
|
5天前
|
安全 物联网 网络安全
智能家居安全:物联网设备的风险与防护策略
【6月更文挑战第25天】在智能家居技术迅猛发展的今天,物联网(IoT)设备已成为现代生活的一部分。然而,随着这些设备的普及,安全问题也日益凸显。本文将深入探讨智能家居中物联网设备所面临的安全风险,并针对这些风险提出有效的防护策略。我们将从技术、用户教育以及政策制定三个层面,分析如何构建一个更加安全的智能家居环境。
|
28天前
|
物联网 传感器 安全
物联网设备的能效管理与优化
【6月更文挑战第2天】在物联网时代,能效管理成为关键议题。有效管理能避免设备过度消耗能源,减少浪费并保护环境。通过动态调整能源供应、选用低能耗硬件、智能算法优化及高效数据处理,可实现能效优化。示例代码展示了软件控制节能模式。能效管理应用于农业和城市,实现精准操作和节能。这是科技与环保的融合,助力可持续未来,让物联网世界更美好。
32 2

相关产品

  • 物联网平台