爆肝一周,用Python在物联网设备上写了个智能语音助手
Posted HaaS技术社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爆肝一周,用Python在物联网设备上写了个智能语音助手相关的知识,希望对你有一定的参考价值。
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 软件功能
整个方案支持:
- HaaS小程序配网;
- HaaS HaaS离线语音唤醒;
- 云端智能语音交互;
- 自定义问答、闲聊、多轮对话、知识库等对话流管理。
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 | |
microUSB数据线 | 1 | 普通microusb线即可 |
模拟MIC | 1 | |
喇叭 | 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在物联网设备上写了个智能语音助手-创建阿里云账号》完成以下两个步骤:
- 注册阿里云账号
- 获取AccessKey和Secret
5.1.2 智能语音交互开通及配置
参考《爆肝一周,用Python在物联网设备上写了个智能语音助手-阿里云智能语音交互》完成以下三个主要步骤:
- 智能语音交互功能开通
- 完成语音识别和语音合成功能进行配置
- 获取智能语音交互Appkey
5.1.3 智能对话机器人开通及配置
参考《爆肝一周,用Python在物联网设备上写了个智能语音助手-阿里云智能对话机器人》完成以下四个主要步骤:
- 创建会话机器人
- 配置机器人知识库
- 发布机器人
- 在机器人管理页获取对话机器人实例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:
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小程序配网
- 确认OLED上显示"Enter WiFi Smart Config...";
- 打开手机支付宝,搜索HaaS小程序,同时打开手机蓝牙功能;
- 点击扫描待配网设备;
- 选择Wi-Fi SSID;
- 填入Wi-Fi密码;
- 点击发起配网;
- 等待设备端连接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在物联网设备上写了个智能语音助手的主要内容,如果未能解决你的问题,请参考以下文章