×

带有AWS Alexa语音控制和IR火力的Blaster

消耗积分:0 | 格式:zip | 大小:3.24 MB | 2023-01-31

分享资料个

描述

Stormtroopers Blaster:粒子和 AWS

当我第一次看到 hackster.io 星球大战主题比赛时,我知道我必须提交参赛作品。作为《星球大战》的长期粉丝和制作者,这似乎是一个很好的机会,也是我接触粒子光子的机会。

几年前,我制作了一个纸质冲锋队头盔,这是最初想法的来源。这个概念是升级头盔并将其连接到 AWS Alexa Skill/Echo 以远程发出命令。有了这个概念,我很幸运地收到了光子!在考虑如何实际实施该解决方案时,我决定不戴头盔,而使用冲击波枪会更有趣,并提供一些不同的交互。 

Particle 应用程序非常简单,我很惊讶设置粒子以从 Alexa Lambda 函数接收命令是多么容易。基本上是一个物联网设备在不同的线程上接收值。现在,在冲击波/粒子方面,该设备通过与 MP3 触发器的串行连接接受命令来播放不同的音频剪辑,并且通过命令可以更改您按下触发器时播放的剪辑(眩晕或正常)。注意,我在Photon和MP3板之间的串行连接上纠结了很长时间,一定要 在.ino文件中包含:#include "application.h" 并且一定要连接两块板之间的GND。

将来,我计划包括一个可以查询的温度探测器,并保留将在 Web GUI 上更新的触发器拉动计数器。

在 Amazon Echo 方面,我构建了一个 Alexa Skill 来与 blaster 交互。这同样非常容易设置,需要注意的是您实际上只需要更改 index.js 文件中的一些内容,否则不要触及 alexaskill.js 文件。此外,您还需要将索引、alexaskill、node_modules 文件夹和 package.json 文件压缩在一起,并作为一个集合上传到 AWS Lambda 函数。它在故障排除期间有点痛苦,但在你掌握了它之后又能正常工作。 

示例语句:

用户:Stormtrooper,启动你的冲击波 BLASTER:启动效果

用户:Stormtrooper,将你的冲击波枪设置为眩晕 BLASTER:'Set for stun'

用户:Stormtrooper,站岗 BLASTER:“你站岗”

用户:冲锋队,你爸爸是谁?BLASTER:'我是你的父亲'

要创建新的 Alexa 技能集,您需要创建

  • 将处理语音输入的服务(带有 NodeJS 的 AWS Lambda)
  • 定义语音输入操作的 Intent Schema
  • 示例话语文件,其中包含所有可能的语音输入及其相应的意图。

以下是应用程序的示例话语、意图模式和槽:

BlasterCommand Power {on|onoff} your blaster
BlasterCommand Power {on|onoff}
BlasterCommand Begin power {on|onoff}
BlasterCommand Power {up|onoff} your blaster
BlasterCommand Power {up|onoff}
BlasterCommand Begin power {up|onoff}

BlasterCommand Power {off|onoff} your blaster
BlasterCommand Power {off|onoff}
BlasterCommand Begin power {off|onoff}
BlasterCommand Power {down|onoff} your blaster
BlasterCommand Power {down|onoff}
BlasterCommand Begin power {down|onoff}

BlasterCommand Set your blaster to {stun|strength}
BlasterCommand All blasters set to {stun|strength}
BlasterCommand Set to {stun|strength}
BlasterCommand Set your blaster to {normal|strength}
BlasterCommand All blasters set to {normal|strength}
BlasterCommand Set to {normal|strength}

BlasterCommand Don't {fail|motivation} me again
BlasterCommand Stand {guard|motivation}
BlasterCommand Who is your {daddy|father}
BlasterCommand Tell me about your {daddy|father}
BlasterCommand Who is your {dad|father}
BlasterCommand Who is {father|father}

HelpIntent help
HelpIntent help me
HelpIntent what can I ask you
HelpIntent get help
HelpIntent to help
HelpIntent to help me
HelpIntent what can you do
HelpIntent what do you do
HelpIntent how do I use you
HelpIntent how can I use you
HelpIntent what can you tell me

 

{

  "intents": [

    {

      "intent": "BlasterCommand",

      "slots": [

        {

          "name": "onoff",

          "type": "LITERAL"

        },

        {

          "name" :"strength",

          "type": "LITERAL"

        },

        {

          "name": "motivation",

          "type": "LITERAL"

        },

        {

          "name": "father",

          "type": "LITERAL"

        }

      ]

    },

    {

      "intent": "HelpIntent",

      "slots" : []

    }

  ]

}

 

pYYBAGPXWbSAdb4sAACqdp5osdc858.jpg
 

从上面可以看出,应用程序有两个意图 BlasterCommand 和 HelpIntent 当您告诉 Alexa(或Stromtrooper  /blaster)执行任何命令时,将调用 BlasterCommand。 HelpIntent 在您寻求帮助时被调用。

在意图架构中,您可以看到插槽部分。这些是传递给 AWS Lambda 函数的参数。这些参数的值在话语文件中定义。在这里你可以看到这些包括{stun|strength} , {daddy|father} 等...   

当 Alexa 处理您的语音输入时,它会为所有指定的插槽调用 AWS 技能。然后,Node.js 应用程序使用托管的 AWS Lambda 函数。您可以在下面链接的 GitHub 存储库中查看这些文件中的每一个和 Node.js 应用程序。

安装

这些安装步骤取自 Alexa 技能集示例之一。

AWS Lambda 设置

  • 转到 AWS 控制台并单击 Lambda 链接。注意:确保您位于美国东部,否则您将无法将 Alexa 与 Lambda 一起使用。
  • 单击创建 Lambda 函数或立即开始按钮。
  • 将 Lambda 函数命名为“Stormtrooper_Blaster”。
  • 转到 src 目录,选择所有文件然后创建一个 zip 文件,确保 zip 文件不包含 src 目录本身,否则 Lambda 功能将无法运行。
  • 将 .zip 文件上传到 Lambda
  • 将处理程序保留为 index.handler(这是指 zip 中的主 js 文件)。
  • 创建一个基本执行角色并单击创建。
  • 返回 Lambda 主页面,点击“Actions”->“Add Event Source”
  • 选择 Alexa Skills Kit 并点击提交。
  • 单击您的 Lambda 函数名称并复制 ARN,以便稍后在 Alexa 技能设置中使用

Alexa 技能设置

  • 转到 Alexa 控制台 ( https://developer.amazon.com/edw/home.html ) 并单击添加新技能。
  • 将“Stormtrooper_Blaster”设置为技能名称,将“storm trooper”设置为调用名称,这是用来激活你的技能的。例如你会说:“Alexa,告诉风暴骑兵站岗”
  • 为技能端点选择 Lambda ARN 并粘贴从上面复制的 ARN。点击下一步。
  • 从包含的 IntentSchema.json 中复制 Intent Schema。
  • 从随附的 SampleUtterances.txt 中复制示例话语。点击下一步。
  • [可选]返回技能信息选项卡并复制appId。将 appId 粘贴到变量 APP_ID 的 index.js 文件中,然后使用此更改更新 lambda 源 zip 文件并再次上传到 lambda,此步骤确保 lambda 函数仅服务于来自授权源的请求。
  • 您现在可以开始测试您的示例技能了!您应该能够访问 Echo 网页 ( http://echo.amazon.com/#skills ) 并查看您的技能已启用。
  • 为了对其进行测试,请尝试说出下面“示例”部分中的一些示例话语。
  • 您的技能现已保存,一旦您完成测试,您就可以继续发布您的技能。

建造冲击波

 
 
 
poYBAGPXWbaAUxkBAABrOlYP9Vk939.jpg
 
1 / 5Blaster 结束与扬声器特写
 

演示 

 

 

 

 

 

更新

随着提交时间的延长,我添加了一个简洁的功能。我在发射器的尖端安装了一个 IR LED,并将其连接到由发射器的触发器控制的威廉希尔官方网站 /逻辑。这使得玩具枪可以“射击”Arduino 驱动的 Stormtrooper 以及打开/关闭电视。如果有人正在观看您不喜欢的节目(请参见上面的演示),这将特别有用...

pYYBAGPXWbqAE_XIAALg6y2OIJk620.jpg
带 IR 尖端的 Blaster 和带伺服/IR 接收器的 Stormtrooper 
 

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'带有AWS Alexa语音控制和IR火力的Blaster',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);