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

播报音箱主要功能为语音播报,需要和云端保持连接,接收云端播报消息,设备端按照指定规则进行播报。常见的播报场景有支付到账信息、动态更新的定制化音频内容、用户操作回应和提醒等。播报音箱方案涉及云端、设备端的开发,属于端云一体化解决方案。本文聚焦于设备端,主要讲述基于IoT JS轻应用和HaaS600硬件平台实现播报音箱方案。
 
 
2、硬件
HaaS600是基于移远EC100Y-CN通信模组的LTE Cat 1开发板,专为M2M 和IoT应用而设计,可应用于共享控制、金融支付、智能语音、泛工业等场景的智能硬件产品开发(详情可参考HaaS600平台介绍
 
 
3、软件框架
 
 
 
4、应用开发
4.1、连接云平台
使用JS轻应用的IoT API,传入三元组信息,即可快速建立和云端的连接,示例:
 
  1. var iot = require('iot');
  2. const productkey = '<product-key>';
  3. const devicename = '<device-name>';
  4. const devicesecret = '<device-secret>';
  5. var iotdev = iot.device({
  6. productKey: productkey,
  7. deviceName: devicename,
  8. deviceSecret: devicesecret,
  9. success: function() {
  10. console.log('success connect to aliyun iot server');
  11. },
  12. fail: function() {
  13. console.log('fail to connect to aliyun iot server');
  14. }
  15. });
 
接收云端播报消息(类型为service),示例:
 
  1. iotdev.on('service', function(serviceid, request) {
  2. console.log('received cloud serviceid is ' + serviceid + '\r\n');
  3. console.log('received cloud request is ' + request + '\r\n');
  4. });
 
4.2、播报语音
IoT轻应用提供音频播放组件audioplayer,使用相关API可实现本地和在线音频文件的播放及控制。示例:
 
  1. var audioplayer = require('audioplayer');
  2. var source = "/test.mp3"
  3. audioplayer.play(source);
  4. var sourceList = ["/test1.mp3", "/test2.mp3", "/test3.mp3"];
  5. audioplayer.listPlay(sourceList);
 
  1. 单个文件的播报,例如广告、TTS合成语音等,可通过audioplayer.play()接口,传入音频文件地址(支持本地文件以及http、https网络音频)
  2. 多个文件拼接组合播报,例如金额的拼接,将需要拼接播放的音频文件存放在数组中,通过audioplayer.listPlay()接口,将音频文件进行拼接和播放。
4.3、按键处理
 
  1. var gpio = require('gpio');
  2.  
  3. var led_network = gpio.open({
  4. id: 'led_network'
  5. });
  6.  
  7. var key_function = gpio.open({
  8. id: 'key_function'
  9. });
  10.  
  11. var key_volumeup = gpio.open({
  12. id: 'key_volumeup'
  13. });
  14.  
  15. var key_volumedown = gpio.open({
  16. id: 'key_volumedown'
  17. });
  18.  
  19. key_function.onIRQ({
  20. trigger: 'rising',
  21. cb: function() {
  22. console.log('key function pressed');
  23. }
  24. });
  25.  
  26. key_volumeup.onIRQ({
  27. trigger: 'rising',
  28. cb: function() {
  29. console.log('key volumeup pressed');
  30. }
  31. });
  32.  
  33. key_volumedown.onIRQ({
  34. trigger: 'rising',
  35. cb: function() {
  36. console.log('key volumedown pressed');
  37. }
  38. });
 
4.4、低功耗
当系统空闲时自动进入低功耗状态。
 
  1. var pm = require('pm');
  2. pm.setAutosleepMode(1)
 
 
5、物模型
5.1、播报金额
物模型:
 
  1. {
  2. speechs:["alipay","{$100}","yuan"],
  3. id:"123",
  4. timestamp:"1595765968612"
  5. }
 
定义:
id: 消息id,用于判断是否是重复推送
timestamp:交易时间
speechs:表示需要拼接的内容,有3类
1. {$+数字}:表示按照金额进行播放
2. {N+数字}或{n+数字}:表示按照数字进行播放
3. 其它:表示需要播放的语料的标识 播放
 
5.2、播放音频链接
物模型:
 
  1. {
  2. url:"http://*********",
  3. id:"123",
  4. }
 
定义:
url:音频内容url,设备端收到后通过该url下载并播放
id: 编号,用于判断是否是重复推送
5.3、本地语料更新(SpeechPost)
 
  1. {
  2. speechs:[{"id":"test","url":"http://********"}],
  3. jobcode:"123"
  4.  
  5. }
 
字段:
speechs:需要更新的语料列表,每个元素包括id和url,其中id表示语料标识、url是语料下载地址
jobcode:表示语料更新任务id,用于云端和设备同步语料更新任务执行状态
 
6、功能实现
6.1、连接云平台
 
  1. var iot = require('iot');
  2. var iotdev = iot.device({
  3. productKey: productkey,
  4. deviceName: devicename,
  5. deviceSecret: devicesecret,
  6. success: function() {
  7. console.log('success connect to aliyun iot server');
  8. },
  9. fail: function() {
  10. console.log('fail to connect to aliyun iot server');
  11. }
  12. });
 
执行完成后,和云端的连接通道建立。
 
6.2、物模型处理
 
  1. iotdev.on('service', function(serviceid, request) {
  2. console.log('received cloud serviceid is ' + serviceid + '\r\n');
  3. console.log('received cloud request is ' + request + '\r\n');
  4. if (serviceid.indexOf("AudioPlayback") != -1) {
  5. voiceboxPlayContent(request);
  6. } else if (serviceid.indexOf("SpeechBroadcast") != -1) {
  7. voiceboxPlayReceipt(request);
  8. } else if (serviceid.indexOf("SpeechPost") != -1) {
  9. voiceboxResUpdate(request);
  10. }
  11. });
 
 
6.3、语音拼接
  • 数字拼接
按照普通数字发音规则进行拼接,例如手机号。
按照金额类数字发音规则进行拼接,例如收款金额。
  • 本地语音拼接
通过音频标识查找本地文件。
拼接结果:
例如,
 
  1. {
  2. speechs:["alipay","{$100}","yuan"],
  3. id:123,
  4. timestamp:"1595765968612"
  5. }
 
拼接后:
 
 
 
6.4、语料更新
下载并更新本地语料文件
 
  1. function voiceboxResUpdate(resource)
  2. {
  3. var resource = eval('(' + resource + ')');
  4. var speechArray = resource.speechs;
  5.  
  6. for (var speechIndex = 0; speechIndex < speechArray.length; speechIndex++) {
  7. var speech = speechArray[speechIndex];
  8. console.log('update local speech id: ' + speech.id + ', url: ' + speech.url);
  9. var resourcePath = toneDir + speech.id + tonenameSuffix;
  10. http.download({
  11. url: speech.url,
  12. filepath: resourcePath,
  13. method: 'GET',
  14. headers: {
  15. 'Accept':'*/*'
  16. },
  17. success: function (data) {
  18. if(data === defaultMessage) {
  19. console.log('http: [success] http.download');
  20. }
  21. }
  22. });
  23. }
  24. }
资料自取,无偿
资料自取,无偿
js       http://www.makeru.com.cn/live/1396_805.html?s=143793 http://www.makeru.com.cn/live/1396_806.html?s=143793
posted @ 2020-12-03 15:20  欧清辣哨  阅读(445)  评论(0编辑  收藏  举报