用JS轻应用与HaaS 600实现语音播报音箱

简介: 聚焦设备端,干货讲述IoT JS轻应用和HaaS600硬件平台实现播报音箱方案

1、播报音箱介绍

播报音箱主要功能为语音播报,需要和云端保持连接,接收云端播报消息,设备端按照指定规则进行播报。常见的播报场景有支付到账信息、动态更新的定制化音频内容、用户操作回应和提醒等。播报音箱方案涉及云端、设备端的开发,属于端云一体化解决方案。本文聚焦于设备端,主要讲述基于IoT JS轻应用和HaaS600硬件平台实现播报音箱方案。

image.png

2、硬件

HaaS600是基于移远EC100Y-CN通信模组的LTE Cat 1开发板,专为M2M 和IoT应用而设计,可应用于共享控制、金融支付、智能语音、泛工业等场景的智能硬件产品开发(详情可参考HaaS600平台介绍)

3、软件框架

image.png

4、应用开发

4.1、连接云平台
使用JS轻应用的IoT API,传入三元组信息,即可快速建立和云端的连接,示例:

var iot = require('iot');

const productkey = '';

const devicename = '';

const devicesecret = '';

var iotdev = iot.device({

productKey: productkey,

deviceName: devicename,

deviceSecret: devicesecret,

success: function() {

console.log('success connect to aliyun iot server');

},

fail: function() {

console.log('fail to connect to aliyun iot server');

}

});
接收云端播报消息(类型为service),示例:

iotdev.on('service', function(serviceid, request) {

console.log('received cloud serviceid is ' + serviceid + '\r\n');

console.log('received cloud request is ' + request + '\r\n');

});

4.2、播报语音
IoT轻应用提供音频播放组件audioplayer,使用相关API可实现本地和在线音频文件的播放及控制。示例:

var audioplayer = require('audioplayer');

var source = "/test.mp3"

audioplayer.play(source);

var sourceList = ["/test1.mp3", "/test2.mp3", "/test3.mp3"];

audioplayer.listPlay(sourceList);
单个文件的播报,例如广告、TTS合成语音等,可通过audioplayer.play()接口,传入音频文件地址(支持本地文件以及http、https网络音频)
多个文件拼接组合播报,例如金额的拼接,将需要拼接播放的音频文件存放在数组中,通过audioplayer.listPlay()接口,将音频文件进行拼接和播放。

4.3、按键处理

var gpio = require('gpio');

var led_network = gpio.open({

id: 'led_network'

});

var key_function = gpio.open({

id: 'key_function'

});

var key_volumeup = gpio.open({

id: 'key_volumeup'

});

var key_volumedown = gpio.open({

id: 'key_volumedown'

});

key_function.onIRQ({

trigger: 'rising',

cb: function() {

console.log('key function pressed');

}

});

key_volumeup.onIRQ({

trigger: 'rising',

cb: function() {

console.log('key volumeup pressed');

}

});

key_volumedown.onIRQ({

trigger: 'rising',

cb: function() {

console.log('key volumedown pressed');

}

});

4.4、低功耗
当系统空闲时自动进入低功耗状态。

var pm = require('pm');

pm.setAutosleepMode(1)

5、物模型

5.1、播报金额
物模型:

{

speechs:["alipay","{$100}","yuan"], id:"123", timestamp:"1595765968612" } 定义: id: 消息id,用于判断是否是重复推送 timestamp:交易时间 speechs:表示需要拼接的内容,有3类 1. {$+数字}:表示按照金额进行播放

  1. {N+数字}或{n+数字}:表示按照数字进行播放
  2. 其它:表示需要播放的语料的标识 播放

5.2、播放音频链接
物模型:

{

url:"http://*****",

id:"123",

}
定义:
url:音频内容url,设备端收到后通过该url下载并播放
id: 编号,用于判断是否是重复推送

5.3、本地语料更新(SpeechPost)

{

speechs:[{"id":"test","url":"http://****"}],

jobcode:"123"

}

字段:
speechs:需要更新的语料列表,每个元素包括id和url,其中id表示语料标识、url是语料下载地址
jobcode:表示语料更新任务id,用于云端和设备同步语料更新任务执行状态

6、功能实现

6.1、连接云平台

var iot = require('iot');

var iotdev = iot.device({

productKey: productkey,

deviceName: devicename,

deviceSecret: devicesecret,

success: function() {

console.log('success connect to aliyun iot server');

},

fail: function() {

console.log('fail to connect to aliyun iot server');

}

});
执行完成后,和云端的连接通道建立。

6.2、物模型处理

iotdev.on('service', function(serviceid, request) {

console.log('received cloud serviceid is ' + serviceid + '\r\n');

console.log('received cloud request is ' + request + '\r\n');

if (serviceid.indexOf("AudioPlayback") != -1) {

voiceboxPlayContent(request);

} else if (serviceid.indexOf("SpeechBroadcast") != -1) {

voiceboxPlayReceipt(request);

} else if (serviceid.indexOf("SpeechPost") != -1) {

voiceboxResUpdate(request);

}

});

6.3、语音拼接
数字拼接
按照普通数字发音规则进行拼接,例如手机号。
按照金额类数字发音规则进行拼接,例如收款金额。
本地语音拼接
通过音频标识查找本地文件。
拼接结果:
例如,

{

speechs:["alipay","{$100}","yuan"],

id:123,

timestamp:"1595765968612"

}
拼接后:

图.png

6.4、语料更新
下载并更新本地语料文件

function voiceboxResUpdate(resource)

{

var resource = eval('(' + resource + ')');

var speechArray = resource.speechs;

for (var speechIndex = 0; speechIndex < speechArray.length; speechIndex++) {

var speech = speechArray[speechIndex];

console.log('update local speech id: ' + speech.id + ', url: ' + speech.url);

var resourcePath = toneDir + speech.id + tonenameSuffix;

http.download({

  url: speech.url,

  filepath: resourcePath,

  method: 'GET',

  headers: {

    'Accept':'*/*'

  },

  success: function (data) {

    if(data === defaultMessage) {

      console.log('http: [success] http.download');

    }

  }

});

}

}

7、开发者技术支持

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

更多技术与解决方案介绍,请访问阿里云AIoT首页 (https://iot.aliyun.com/)

相关文章
|
5月前
|
JavaScript 前端开发
如何减少Node.js应用中的全局变量?
如何减少Node.js应用中的全局变量?
351 133
|
5月前
|
监控 负载均衡 JavaScript
有哪些有效的方法可以优化Node.js应用的性能?
有哪些有效的方法可以优化Node.js应用的性能?
316 69
|
2月前
|
存储 监控 JavaScript
基于布隆过滤器的 Node.js 算法在局域网电脑桌面监控设备快速校验中的应用研究
本文探讨了布隆过滤器在局域网电脑桌面监控中的应用,分析其高效空间利用率、快速查询性能及动态扩容优势,并设计了基于MAC地址的校验模型,提供Node.js实现代码,适用于设备准入控制与重复数据过滤场景。
94 0
|
28天前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
159 3
|
2月前
|
资源调度 负载均衡 JavaScript
使用PM2工具部署Vue.js应用于服务器
以上步骤完成之后,你就成功利⽤ PM⼆工具将 Vuejs 应⽰程序部署至服 务 器,并且配合反向代理实现了高效稳定访问及负载均衡功能。
120 0
|
6月前
|
前端开发 搜索推荐 JavaScript
如何通过DIY.JS快速构建出一个DIY手机壳、T恤的应用?
DIY.JS 是一款基于原生 Canvas 的业务级图形库,专注于商品定制的图形交互功能,帮助开发者轻松实现个性化设计。适用于 T 恤、手机壳等多种商品场景。它自带丰富功能,无需从零构建,快速集成到项目中。通过创建舞台、添加模型、定义 DIY 区域和添加素材四个步骤即可完成基础用法。支持在线演示体验,文档详细,易上手。
229 57
|
5月前
|
监控 算法 JavaScript
公司局域网管理视域下 Node.js 图算法的深度应用研究:拓扑结构建模与流量优化策略探析
本文探讨了图论算法在公司局域网管理中的应用,针对设备互联复杂、流量调度低效及安全监控困难等问题,提出基于图论的解决方案。通过节点与边建模局域网拓扑结构,利用DFS/BFS实现设备快速发现,Dijkstra算法优化流量路径,社区检测算法识别安全风险。结合WorkWin软件实例,展示了算法在设备管理、流量调度与安全监控中的价值,为智能化局域网管理提供了理论与实践指导。
150 3
|
6月前
|
存储 JavaScript 前端开发
|
7月前
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
7月前
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~