用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/)

相关文章
|
1月前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
279 2
|
1月前
|
JavaScript 前端开发 API
探索后端技术:Node.js的优势和实际应用
【10月更文挑战第6天】 在当今数字化时代,后端开发是任何成功软件应用的关键组成部分。本文将深入探讨一种流行的后端技术——Node.js,通过分析其核心优势和实际应用案例,揭示其在现代软件开发中的重要性和潜力。
123 2
|
2天前
|
存储 缓存 JavaScript
如何优化Node.js应用的内存使用以提高性能?
通过以上多种方法的综合运用,可以有效地优化 Node.js 应用的内存使用,提高性能,提升用户体验。同时,不断关注内存管理的最新技术和最佳实践,持续改进应用的性能表现。
|
21天前
|
数据可视化 JavaScript 前端开发
数据可视化进阶:D3.js在复杂数据可视化中的应用
【10月更文挑战第26天】数据可视化是将数据以图形、图表等形式呈现的过程,帮助我们理解数据和揭示趋势。D3.js(Data-Driven Documents)是一个基于JavaScript的库,使用HTML、SVG和CSS创建动态、交互式的数据可视化。它通过数据驱动文档的方式,将数据与DOM元素关联,提供高度的灵活性和定制性,适用于复杂数据的可视化任务。 示例代码展示了如何使用D3.js创建一个简单的柱状图,展示了其基本用法。D3.js的链式调用和回调函数机制使代码简洁易懂,支持复杂的布局和交互逻辑。
62 3
|
1月前
|
机器学习/深度学习 自然语言处理 JavaScript
信息论、机器学习的核心概念:熵、KL散度、JS散度和Renyi散度的深度解析及应用
在信息论、机器学习和统计学领域中,KL散度(Kullback-Leibler散度)是量化概率分布差异的关键概念。本文深入探讨了KL散度及其相关概念,包括Jensen-Shannon散度和Renyi散度。KL散度用于衡量两个概率分布之间的差异,而Jensen-Shannon散度则提供了一种对称的度量方式。Renyi散度通过可调参数α,提供了更灵活的散度度量。这些概念不仅在理论研究中至关重要,在实际应用中也广泛用于数据压缩、变分自编码器、强化学习等领域。通过分析电子商务中的数据漂移实例,展示了这些散度指标在捕捉数据分布变化方面的独特优势,为企业提供了数据驱动的决策支持。
70 2
信息论、机器学习的核心概念:熵、KL散度、JS散度和Renyi散度的深度解析及应用
|
26天前
|
JavaScript 前端开发 开发者
探索JavaScript原型链:深入理解与实战应用
【10月更文挑战第21天】探索JavaScript原型链:深入理解与实战应用
28 1
|
1月前
|
JavaScript 前端开发 API
Vue.js:打造高效前端应用的最佳选择
【10月更文挑战第9天】Vue.js:打造高效前端应用的最佳选择
18 2
|
1月前
|
设计模式 JavaScript 前端开发
探索JavaScript中的闭包:从基础概念到实际应用
在本文中,我们将深入探讨JavaScript中的一个重要概念——闭包。闭包是一种强大的编程工具,它允许函数记住并访问其所在作用域的变量,即使该函数在其作用域之外被调用。通过详细解析闭包的定义、创建方法以及实际应用场景,本文旨在帮助读者不仅理解闭包的理论概念,还能在实际开发中灵活运用这一技巧。
|
1月前
|
缓存 JavaScript 前端开发
深入了解JavaScript的闭包:概念与应用
【10月更文挑战第8天】深入了解JavaScript的闭包:概念与应用
|
18天前
|
前端开发 JavaScript
JavaScript新纪元:ES6+特性深度解析与实战应用
【10月更文挑战第29天】本文深入解析ES6+的核心特性,包括箭头函数、模板字符串、解构赋值、Promise、模块化和类等,结合实战应用,展示如何利用这些新特性编写更加高效和优雅的代码。
38 0
下一篇
无影云桌面