开发者学堂课程【AliOS Things 物联网开发教程:python 轻应用开发】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/835/detail/13992
python 轻应用开发
内容介绍
一、应用案例: Python 轻应用打造播报音箱
一、应用案例: Python 轻应用打造播报音箱
下图为播报音响整体的框图,播报设备是 Haas EDU K1的设备外接一个喇叭,其可以通过 IoT 连接到阿里云 IoT 平台,阿里云 IoT 设备主要需要使用千里传音服务(阿里云 IoT 针对具有语音播报能力设备提供的云端一体的解决方案:包括语料生成、语料推送、设备管理、OpenAPI)能帮住用户更快的进行播报类设备的开发。
下图为播报音响的实现图,这里 Haas EDU K1 的设备在连接云端后,用户可以根据云端创建用户语料,并且把语料从云端推送到设备,用户还可以指定播报的内容,让设备进行播报。
硬件连接:这是实验播报用到的喇叭和 EDU 相关硬件的连接。第一根 GND 的线需要连接到第1个30GND 的线路,第二根 VCC(电源)的线需要连接到3.3v上,还有一个 IN(信号输入口)连接到 SPKLP,也就是第6个接口上。
1.千里传音服务能力
(1)项目管理:
客户通过项目形式管理不同应用场景中的设备和语料。
(2)智能语料生成
通过人工智能算法帮助客户快速完成文字到固定播报语料的生成,支持 wav 和 mp3格式输出。
(3)语料组合播报
通过远程命令,告知特定设备将本地语料以特定顺序组合后播报,并支持加入动态数字内容。
(4)动态语料合成、
支持用户通过 API 生成动态播报语料,推送到端侧播报。此类语料设备端采用在线播放的形式,将不固化到设备中。
(5)语料空中推送
为客户提供语料空中推送到单个和项目中全量设备的能力,实现设备端固化语料的更新。使设备播报语音内容变得可以运营。
(6)云端 API
为客户提供平台能力对应 API,以实现上述播报能力的云端控制。
2.播报音响使用步骤
首先需要在云端创建一个千里传音的项目,在项目中生成语料,同时创建设备,并且将生成的语料和设备对应起来,然后再去运行 Hass EDU 设备。运行好之后就可以进行动态语料的更新、播报以及远程组合的播报之类相关的动作。
3.云端平台使用
可以通过链接直接进入官方平台直接访问千里传音产品,或者通过阿里云 IoT 平台到企业物联网平台到控制台到增值服务到 IoT 云端一体服务,就可以进入“千里传音”产品界面。
创建项目:创建项目时,需要输入产品名称、产品来源及项目描述,之后会在实际创建中展示如何操作。进入干里传音服务控制台后,可以看到相关管理页面,用户可以在此创建不同的项目以区分设备对应的不同场景或交付项目。在完成项目创建后,系统将帮助用户创建一个与项目名相同的产品,以便后续加入设备。同时,如果用户希望为设备增加千里传音以外的能力,也可以直接到物联网平台的设备管理界面中,为设备添加物模型能力。在项目列表中,点击需要配置的项目,可以对项目内容进行配置管理。
找到界面以后便创建项目,需要输入项目名称,产品来源以及项目描述。
创建好之后需要进行一个管理服务,在“千里传音”的管理页面去新建语料,语料可以任意输入内容,但需要输入一个标识符,因为在推送设备时需要将标识符对应相关语料的场景,将标识符推送到设备中的时候,它会将相关内容推送下去,在调试的过程中会用到。千里云服务默认了很多合成能力,可以根据自己的选择进行配置,之后会演示。
●语料标识:将作为生成语料的文件名,以及后续组合播报时的语料组合索引。建议按照播报内容的拼音首字母编写,如:“银行到账”可将语料标识定义为“YHDZ"。 ●语料内容:需要播报的语料内容。
●语音场景:千里传音服务为用户提供了5个场景下的45种不同语音合成能力,用户可以根据场景需求,选择对应的语音进行语料合成。
创建设备:创建好之后,再去创建相关的设备,在设备里主要是将当前的设备与语料进行关联,使得识别到设备的时候可以知道相关语料。
获取四元组:创建好之后,去获取四元组,四元组可以在场景管理中查找到,接下里进行实际操作。
点开 Visual Studio Code,重新创建一个工程,重新选择路径,在/Users/zeta/Documents/test1路径下进行创建,选择 Haas EDU K1,再选择 remote_speaker,这就是播报音响的项目,点击立即创建。完成之后发现这里有 resource,这个 resource 等下也会推送到设备当中来进行播报,先看一下代码。
if _name_ =='_main_':
Init_audio() play(tonepathPowerOn)
do_connect_lk()
从 main 函数开始看,第一步从 init_audio(将外接的喇叭驱动起来,这样它可以进行数据的传输,也可以进行正常的播报的功能),接着第二步进行 play(tonepathPowrOn)tonepathPowrOn = “fs:” + resDir + “PowrOn.wav”这个就是将文件传输到设备端之后在 data/app/resource 这样的文件。
其实 data/app/resource 就是刚才 Powron.wav 推到了设备端。播放完 tonepathPowrOn 后系统会做一个 do_connect_lk 的动作,可以找到它的实现,看到其描述为通过物联网平台连接千里传音服务,同时其定义了一些全局变量: productkey,devicename,devicesecret,on_request,on_play,初始化了 inkkit sdk,并且把下面的值输入上去。
#物联网平台相关的 key 和 serect 定义:
productKey = "xx"
deviceName= "xx"
devidesecret= "xx"
这些值的定义在上文中提到过,可以看到值后有“xx”,此处是要求填写进数值。填入的值是刚才介绍到的阿里云物联网平台创建的项目和设备中需要获取的四元组或三元组。
填入完成后再连接 lk 平台的时候,会把参数发送到服务端,服务端会根据信息进行认证,否则将不能连接平台,所以接下来要去云端申请三元组并且将其填写在此处。接着往下看,观察到有 region:cn-shanghai 这是华东地区,填好之后做一个 iot.Device(key_info)这是在初始化 iot 平台,到目前为止,已经将从设备端连接云端完成了封装,将其封装到iot的模块里,所以从代码一开始就引入了 import 的 iot 进来,这也正是 python 的简介应用之处,就是将很多分散的小代码以及许多复杂的代码封装在一起,需要时可以直接进行调用。
现在直接调用 iot.Device,其自动会做一个连接物联网平台的动作。在进行此动作时会进行两个回调函数分别为 on_connect,这个的意思就是成功的连接到了云端然后进行播放 tonepathconnected = “fs:”+resDir + “connected .wav”这样一个资源文件,其实就是连接后播放语音。
连接好之后这里可以看到 on_service 的动作,这就是事件的接收函数,不论你是千里传音或者做一些远程的 led 的控制或者做一个远端设备的继电器的控制都是通过 on_service 来进行一个处理。Service 主要就是接受从服务端发送到设备端的消息,服务端发送的 json 的消息来对应消息进行处理,这里把 json 消息进行处理,并且解析出来。这里创建一个 data,用data去获取 json 里的参数,再等下实验的过程中把相关的 json 读取出来,这里读取出来比如说speechpost 就把 data 赋给on_request,比如说speechBroadcast 就把data赋给 on_play,这是两个不同条件的函数,也是服务发的两个不同的命令 speechpost 与speechBroadcast,而 Broadcast 含义就是广播,就是说可以直接从服务端调用让其直接播送每一条语音,从而让设备播放每一条语音。另外一个就是刚才提到的语调推送(speechpost),也就是如果在服务端配制好某些语调后,可以直接从服务端将语调推送到设备上来。
接受到消息后,就在下方对这两条消息做一个处理。第一个on_request 的消息处理,这个消息处理可以看出是一个 download_resource_file,服务端在推送的时候,其实是在发了这条命令之后会带一个链接(加密的 resource 链接),设备端在接受了链接之后,它其实会访问此链接,把当前的资源文件(语音文件)下载下来。
另外是一个 on_play 的动作,这个则是调用 play_voice也就是 play 函数将其播放出来,最后执行完就可以断开连接。当前的实验则是让其一直处于一个循环,其实可以看到在封装好之后用python 开发非常简单,仅仅是用几行函数,可以实现很多功能。
while(True):
device.do_yield(1000)
if on_request:
download_resource_file(on_request,resDir)
on_request= False
elif on_play:
play_voice(on_play,resDir)
on_play = False
接下来学习服务端的创建,首先进入物联网平台的官方主页,也就是在 lot.console.aliyun.com 的网站。
进去之后先登录页面,没有账号需要自己创建,进来之后点击增值服务,在增值服务里点击使用 IoT 云端一体服务,进去就可以看到千里传音的配置页面,在这里创建项目,选择名称、项目配套产品来源、项目描述后点击确定就可以完成创建。完成创建后需要进行配置,点击管理服务,管理服务就是对预料的配置的界面。
点击新增语料,选择语料类型,例可以添加语料标识“HYHAAS”,语料内容“欢迎参加 HaaS 训练营”,语音场景等等,不同的场景有不同的合成。
假设设置完成后点击确定。当前创建的语料在这个地方,这里只是创建千里传音的语音和语料。
需要将语料和设备进行关联,例如我们点击推送到设备,此时其实是没有设备提供选择的,可以点击下方的创建设备。也可以在上一个界面的设备管理创建设备。输入一个测试设备,名称“testdev”,随便输入一个备注,点击确定。创建完后可以点击完成和查看。
创建设备完成后是一个未激活的状态,可以在后方的操作处进行查看,再查看的页面可以看到产品的名称,是千里传音项目的产品,也可以看到产品关联的设备,在上方有一个 DeviceSecret 点击查看可以看到设备的三元组,在代码中需要修改的三元组就是需要填入的数值填入其中。
即:
productKey="a1wTaZI5atI"
deviceName ="testdev"
deviceSecret “d85f5f2832899f8cfc9efd72ab584a54"
修改好之后,目前三元组需要填入的已经完成。下面还有productSecret 也是可以看到的,需要在千里传音的产品证书处复制填写到代码处。
'region":'cn-shanghai',
'productkey': productkey,
'deviceName': deviceName,
'deviceSecret': deviceSecret,
'productSecret': “CLaNWPxpwjtqwUFf"
这样代码修改就已经完成了,接着将其烧录到设备当中,这里烧录之前还需要考虑这个 lot 的模块封装可能只单独针对物联网平台,也就说代码在执行的过程中可能直接连接物联网平台,所以这里有一个问题就是没有考虑到 wifi 连接的情况,所以在后面还需要加上 wifi的判断与连接的条件与代码在最后执行。
因为此处实验可以手动连接 wifi,所以暂时不添加代码,不加的情况下先更改main的名称为 test_main,因为代码在执行的时候如果有 main 的函数,它会直接执行 main.py,如果当时 wifi 还没有连接上就去执行,有可能导致陷入死循环无法继续,因为测试代码并没有添加保护代码,所以更改名称为 test_main 来手动执行,接着也更改一下 resource 的路径,进行烧录,记得串口先断开。烧录完成后,在函数中找到 pyamp 的文件。首先连接 wifi,然后执行 python-app/main.py。
在wifi链接成功后直接执行 pyamp,可以听到音箱播报的系统启动成功,wifi 启动成功这样的提示语。
接下来做推送的实验,先推送刚才创建的“欢迎加入 Haas 训练营”的语音,点击推送到刚才创建的设备,点击确定,网页提示成功以后,转会并查看 load,可以看到这便下载成功了 download,所以已经推送成功后在云端进行一个播放的控制,需要进入云端的管理控制台。 这时进入阿里云的云端控制平台,在这里点击可视化调试,点击搜索千里传音的项目调试 api(speechbycomination)选择 Regionld,刚才默认为华东,并且填入代码中的 productkey 和 devicename。并且在 combinationList 处填入之前的语音标识。发起调用后便可以听到正常的播报。
即:
productKey ="a1wTaZI5atI"
deviceName = "testdev"
deviceSecret =“d8515f2832899f8cfc9efd72ab584a54"
接着进行实验,选择“支付宝到账一百元”的语音,将他其推送到设备中,并且在接口处选择“支付宝到账一百元”的语音标识,发起调用可以看到播报音响已经完成了,可以直接通过云端对设备进行语调的推送以及播放控制,当然这份代码还有很多可以完善和改进的地方,拿到设备的同学可以去做实验,将代码改进的更加完美。
4.修改四元组:
(1)修改如下四个变量:
①productSecret="xxx产品密钥
②productKey="xxx” 产品key
③deviceName=“xxx”设备名字
④deviceSecret=“xxx“设备密钥
5.下载到设备:
可以通过 IDE 工具进行下载。
6.推送语料到设备
语料需要在执行前推送到设备,推送方法是点击推送到设备。
7.远程调试
在线 API 调试地址,修改其中的 ProductKey 和 DeviceName 以及需要发送的语料完成参数配置后,点击“发起调用”,即可将组合播报命令发送至设备端。
8.更多代码示例参考
https://g.alicdn.com/HaaSAI/PythonDoc/apps/index.htmlz
在 python 应用的官方主页上。











