ããã«ã¡ã¯ã
ååã¯ãã¢ã¬ã¯ãµï¼Amazon Echoï¼ã§ä½ãã§ããã®ãï¼ãã«ã¤ãã¦è¨äºã«ãã¾ããã blog.wackwack.net
ãã®ä¸ã§ãèªåã§Alexaã¹ãã«ãä½ããï¼ãã¨ç´¹ä»ãã¦ãã¾ãã¦ãå®éã«èªåã§Alexaã¹ãã«ãä½ã£ã¦ã¿ã¾ããã
ã¨è¨ããã¨ã§ä»åã¯ãç§ãå®éã«ä½ã£ããAlexaãããã¤ãã¿ã¼ã«æ稿ããã¹ãã«ããä¾ã«ãAlexaã¹ãã«ã®ä½ãæ¹ãã¾ã¨ãã¾ãã
- ä½æããã¹ãã«
- Alexaã¹ãã«ã®éçº
- Alexaã¹ãã«éçºã骨ã¯æããã楽ãããï¼
ä½æããã¹ãã«
ä»åä½æããã¹ãã«ã¯ã
ã¨ããã·ã³ãã«ãªãã®ã§ãã
2018å¹´1æ18æ¥ 19æ8å38ç§ ã«å¸°ã£ã¦ãã¾ãããï¼Alexaã¹ãã«ã§ã¤ã¶ããã¦ãã¾ãï¼
— ããã£ã¨ (@quo1987) 2018å¹´1æ18æ¥
ã¤ãã§ã«Alexaããã¤ã¶ããã¾ãããã¨åãã¾ãã
ããã¤ãã¿ã¼ãã§ã®ããã°ãã¨ãããã¨ã§ãããã¤ãã°ãã¨åä»ãã¾ããã
- ãã¢ã¬ã¯ãµããã¤ãã°ã§è¡ã£ã¦ãã¾ãã
- ãã¢ã¬ã¯ãµããã¤ãã°ã§ãã ãã¾ã
ã¨ãä¸èªç¶ãªçºè©±ããããã¨ã§ãã¤ã¼ããã¾ãã
ãªãéçºç¨ã¹ãã«ã§ãããããå
¬éç³è«ã¯ãã¦ãã¾ãããï¼ã¨ãããä»åã®å®è£
å
容ã ã¨å
¬éã§ããªãï¼
ã¾ãä»åã®ã¹ãã«ã¯ãTwitterAPIã«å¿ è¦ãªã¢ã«ã¦ã³ãæ å ±ï¼ACCESS_TOKENãACCESS_TOKEN_SECRETï¼ãããã°ã©ã ä¸ã«åãè¾¼ããããã¢ããªé£æºè¨±å¯ãé£ã°ãã¦åºå®ã®Twitterã¢ã«ã¦ã³ãã§ãã¤ã¼ãããã¾ãã
å ¨ä½ã¤ã¡ã¼ã¸
Alexaã¹ãã«ã®ã¤ã¡ã¼ã¸ã¯ãããªæãã§ãã
ã¦ã¼ã¶ã¼ãAmazon Echoã«è©±ããããã¨ãAmazon Echoã¯Alexaã¹ãã«ï¼Alexa Skills Kitï¼ãèµ·åãã¾ããå®éã®ã¹ãã«ã¯AWS Lambdaä¸ã«å®è£ ããã¦ãããAWS Lambdaã®ããã°ã©ã ã¯TwitterAPIãå¼ã³åºãã¦ãã¤ã¼ããè¡ãã¾ãã
åèè³æ
æ¬å®¶Amazonãå ¨6åã§ãAlexaã¹ãã«éçºãã¬ã¼ãã³ã°ããå ¬éããã¦ãã¾ãã
ä¸æ¥ããã°å ¨é¨å¦ã¹ãããªã¥ã¼ã ã§ããã¤ãããè¦ãã°æä½éã®ã¹ãã«éçºãã§ããããã«ãªãã¾ããèå³ãããæ¹ã¯ã¾ãããããå§ãã¾ãããã
Alexaã¹ãã«ã®éçº
TwitterApplicationManagementã®ç»é²
ã¾ãåãã«ãå¤é¨ããTwitterAPIãå©ãããã®å種ãã¼ãåå¾ãã¾ãã
Twitter Application Managementã¸ã¢ã¯ã»ã¹ããèªåã®Twitterã¢ã«ã¦ã³ãã§ãã°ã¤ã³ãã¾ãã
次ã«å³ä¸ã®ãCreate New Appããã¯ãªãã¯ãã¾ãã
ï¼ç§ã®ç»é¢ã§ã¯ç»é²æ¸ã¿ã®ã¢ããªã±ã¼ã·ã§ã³ã表示ããã¦ãã¾ãããåå©ç¨æã«ã¯ãã®ç»é¢ã¯ç©ºç½ã§ããï¼
ç»é²ããã¢ããªã±ã¼ã·ã§ã³ã®å
¥åãã©ã¼ã ãåºã¾ãã
ãNameããDescriptionããWebsiteãã¯å¿ é å ¥åé ç®ã§ããé©å½ãªå 容ã§å ¥åãã¾ãã
- Nameï¼ã¢ããªã±ã¼ã·ã§ã³ã®ç»é²å
- Descriptionï¼ã¢ããªã±ã¼ã·ã§ã³ã®èª¬ææ
- Websiteï¼ã¢ããªã±ã¼ã·ã§ã³ã®åãåããå ãåãããããªURLãå ¥åãã¾ããç§ã®å ´åã¯ã¨ããããå½ããã°ã®URLãç»é²ãã¦ãã¾ãã
- CallbackURLï¼ä»åã¯è¨å®ä¸è¦ã§ãã
å ¥åããããã¼ã¸æä¸é¨ã®ãCreate your applicationããã¯ãªãã¯ãã¾ãã
ããã§ã¢ããªã±ã¼ã·ã§ã³ã®ç»é²ãå®äºãã¾ããã
ç¶ãã¦APIã®å©ç¨ã«å¿
è¦ã¨ãªãAccess Tokenã®çºè¡ãè¡ãã¾ãã表示ããããã¼ã¸ã®ã¿ããKeys And Access TokensããããCreate my access tokenããã¯ãªãã¯ãã¾ãã
ããã§æºåã¯å®äºã§ãããã¼ã¸ã«è¡¨ç¤ºããã¦ãããConsumer KeyããConsumer SecretããAccess TokenããAccess Token Secretããããã°ã©ã å
ã§å©ç¨ãã¾ãã
Amazonéçºè ã³ã³ã½ã¼ã«
ããããAlexaã¹ãã«ãä½æãã¦ããã¾ããã¾ãAmazonéçºè ã³ã³ã½ã¼ã«ã«ãã°ã¤ã³ãã¾ãã
ä¸æ®µã¡ãã¥ã¼ãALEXAããé¸æãã¦ãAlexa Skills Kitãã¸é²ã¿ã¾ãã
å³ä¸ã®ãæ°ããã¹ãã«ã追å ããããã¯ãªãã¯ãã¾ããï¼ä¸ã®ç»é¢ã«ã¯ä½ææ¸ã¿ã®ã¹ãã«ä¸è¦§ã表示ããã¦ãã¾ãããåãã¦ã®å ´åã¯ä½ãããã¾ãããï¼
ã¹ãã«ã®åºæ¬æ å ±ã¨ãã¦ãè¨èªããã¹ãã«åããå¼ã³åºãåããå ¥åãã¦ä¿åã次ã¸é²ã¿ã¾ãã
- è¨èªï¼ã¹ãã«ã®å¯¾å¿è¨èªã
- ã¹ãã«åï¼ãã®ã¹ãã«ã®ååãã¦ã¼ã¶ã¼ã«ã¯ã¹ãã«åã表示ãããã
- å¼ã³åºãåï¼ã¹ãã«ãå¼ã³åºãæã®ãã¬ã¼ãºããã¢ã¬ã¯ãµãâ¯â¯ãéãã¦ãã®ãâ¯â¯ãã®é¨åã
ç¶ãã¦å¯¾è©±ã¢ãã«ãè¨å®ãã¾ãããããAlexaã¹ãã«éçºã®ãã¤ã³ãã§ãããã¤ã³ãã³ãã¹ãã¼ããã¨ããµã³ãã«çºè©±ããè¨å®ãã¾ãã
ã¤ã³ãã³ãã¹ãã¼ã
ã¤ã³ãã³ãã¹ãã¼ãã¯ãAlexaã¹ãã«ã§å®è¡ããã¢ã¯ã·ã§ã³ã®ç¨®é¡ãã§ããJSONå½¢å¼ã§ä»¥ä¸ã®ããã«å ¥åãã¾ãã
{ "intents": [ { "intent": "GoOutTweet" }, { "intent": "ComeHomeTweet" }, { "intent": "AMAZON.HelpIntent" }, { "intent": "AMAZON.StopIntent" }, { "intent": "AMAZON.CancelIntent" } ] }
- GoOutTweetï¼ãè¡ã£ã¦ãã¾ããã«å¯¾å¿ããã¢ã¯ã·ã§ã³ã
- ComeHomeTweetï¼ããã ãã¾ãã«å¯¾å¿ããã¢ã¯ã·ã§ã³ã
- AMAZON.HelpIntentï¼ã使ãæ¹ããã説æãã«å¯¾å¿ããã¢ã¯ã·ã§ã³ã
- AMAZON.StopIntentï¼ãä¸æ¢ããåæ¢ãã«å¯¾å¿ããã¢ã¯ã·ã§ã³ã
- AMAZON.Cancelntentï¼ããã£ã³ã»ã«ãã«å¯¾å¿ããã¢ã¯ã·ã§ã³ã
ãAMAZON.ï½ãã¨ä»ãã¦ããã¤ã³ãã³ãã¯ãæ¨æºã§ç¨æããã¦ããããããæ¨æºã¤ã³ãã³ããã§ããã¤ã³ãã³ãã¹ãã¼ããå®ç¾©ããã ãã§ä½¿ããããã«ãªãã¾ãã
ä¸æ¹ã§ãGoOutTweetããComeHomeTweetãã¯ä»åä½æããAlexaã¹ãã«ã®ãªãªã¸ãã«ã¢ã¯ã·ã§ã³ã§ãããã«ã¹ã¿ã ã¤ã³ãã³ããã§ããã«ã¹ã¿ã ã¤ã³ãã³ãã¯æ¬¡ã«èª¬æãããµã³ãã«çºè©±ã§ãã¼ãã¬ã¼ãºãè¨å®ããå¿ è¦ãããã¾ãã
ãµã³ãã«çºè©±
ãµã³ãã«çºè©±ã§ã¯ã«ã¹ã¿ã ã¤ã³ãã³ãã«å¯¾ãã¦ããã®ã¤ã³ãã³ããã¢ã¯ã·ã§ã³ãèµ·ããããã®ãã¼ãã¬ã¼ãºããå®ç¾©ãã¾ããä¾ãã°ãè¡ã£ã¦ãã¾ããã£ã½ããã¨ãè¨ãã°GoOutTweetããããã ãã¾ãã£ã½ããã¨ãè¨ãã°ComeHomeTweetãèµ·åããã¤ã¡ã¼ã¸ã§ãã
ä»åã¯GoOutTweetãComeHomeTweetã«å¯¾ãã¦ä»¥ä¸ã®ããã«çºè©±ãã¬ã¼ãºãè¨å®ãã¾ãã
GoOutTweet è¡ã GoOutTweet è¡ã£ã¦ GoOutTweet è¡ãã¾ã GoOutTweet åºããã ComeHomeTweet ãã ãã¾ ComeHomeTweet 帰ã£ã ComeHomeTweet 帰ã£ã¦ ComeHomeTweet æ»ã£ã
å ¥åãå®äºããã次ã«é²ã¿ã¾ãã
AWS Lambda
ããã§ä¸åº¦Amazonéçºè ã³ã³ã½ã¼ã«ãé¢ããAWSã«ãã°ã¤ã³ãã¾ãããµã¼ãã¼ã¬ã¹ã§ããã°ã©ã ãå®è¡ãããã¨ãã§ãããAWS Lambdaããéãã¦ãAlexaã¹ãã«ãèµ·åããä»çµã¿ã§ãã
ãã°ã¤ã³ãããAWSãµã¼ãã¹ããLambdaãé¸æãã¾ãã
å³ä¸ã®ãé¢æ°ã®ä½æããå®è¡ãã¾ãã
ä½æãã©ã¼ã ã§ãä¸ããä½æããé¸æãã¾ãããååãã¯ä»»æã®ååãå ¥åãããã©ã³ã¿ã¤ã ãã¯Node.js 6.10ãé¸æãã¾ãã
ç¶ãã¦ãã¼ã«ã®é ç®ãããã«ã¹ã¿ã ãã¼ã«ã®ä½æããé¸æãã¾ãã
ãã¼ã«ã®ä½æç»é¢ã表示ããã¾ããå ¨ã¦ãã®ã¾ã¾ã§ã許å¯ããã¯ãªãã¯ãã¾ãã
ããã¾ã§ã§ãããå³ä¸ã®ãé¢æ°ã®ä½æããã¯ãªãã¯ã
å®éã«åããããã°ã©ã ãç´æ¥ã³ã¼ãã£ã³ã°ãããã¨ãã§ãã¾ãããä»åã¯zipãã¡ã¤ã«ãã¢ãããã¼ãããå½¢å¼ãåãã¾ããzipãã¡ã¤ã«ã¨ã³ã¼ãã¯githubä¸ã«ã¢ãããã¼ããã¦ãã¾ãã
github.com
ç»é¢ã®ä¸é ã«ãé¢æ°ã³ã¼ããã¨ããé ç®ãããã®ã§ãããã§ã³ã¼ãã¨ã³ããªã¼ã¿ã¤ãã.ZIPãã¡ã¤ã«ãã¢ãããã¼ãããé¸æãã¦ããã¡ã¤ã«ãskill.zipããã¢ãããã¼ããã¾ãã
ããã°ã©ã ã®ä¸èº«
skill.zipã®å 容ã«ã¤ãã¦å°ãã ã触ãã¦ããã¾ããindex.jsãã¡ã¤ã³ã®å®è¡ããã°ã©ã ã§ããAmazonéçºè ã³ã³ã½ã¼ã«ã§å®ç¾©ããã¤ã³ãã³ããã¨ã«Alexaã®æ¯ãèããã³ã¼ãã£ã³ã°ãã¾ãã
'use strict'; const Alexa = require('alexa-sdk'); const Twitter = require('twitter'); const APP_ID = undefined; // TODO replace with your app ID (OPTIONAL). const JSTOffset = 60 * 9 * 60 * 1000; // JSTæéãæ±ããããã®ãªãã»ãã const ErrorMessage = 'ããããªããã ã¤ã¶ããã¾ããã§ããã'; function calculateJSTTime() { var localdt = new Date(); // å®è¡ãµã¼ãã®ãã¼ã«ã«æé var jsttime = localdt.getTime() + (localdt.getTimezoneOffset() * 60 * 1000) + JSTOffset; var dt = new Date(jsttime); return dt; } const handlers = { 'LaunchRequest': function () { this.emit('AMAZON.HelpIntent'); }, 'GoOutTweet' : function() { var dt = calculateJSTTime(); var stringTime = dt.getFullYear() + "å¹´" + (dt.getMonth()+1) + "æ" + dt.getDate() + "æ¥ " + dt.getHours() + "æ" + dt.getMinutes() + "å" + dt.getSeconds() + "ç§ "; var message = stringTime + "ã«åºããã¾ãããï¼Alexaã¹ãã«ã§ã¤ã¶ããã¦ãã¾ãï¼"; Twitter.postTweet(message).then(()=>{ this.emit(':tell','ã¤ã¶ããã¾ããããã£ã¦ãã£ãããã '); },(error)=>{ console.log(error); this.emit(':tell',ErrorMessage); }) }, 'ComeHomeTweet' : function() { var dt = calculateJSTTime(); var stringTime = dt.getFullYear() + "å¹´" + (dt.getMonth()+1) + "æ" + dt.getDate() + "æ¥ " + dt.getHours() + "æ" + dt.getMinutes() + "å" + dt.getSeconds() + "ç§ "; var message = stringTime + "ã«å¸°ã£ã¦ãã¾ãããï¼Alexaã¹ãã«ã§ã¤ã¶ããã¦ãã¾ãï¼"; Twitter.postTweet(message).then(()=>{ this.emit(':tell','ã¤ã¶ããã¾ããããããããªããã '); },(error)=>{ console.log(error); this.emit(':tell',ErrorMessage); }) }, 'AMAZON.HelpIntent': function () { const speechOutput = 'ããã£ã¦ãã¾ããããã ãã¾ã ãã¨ã¤ã¶ããã¨ããã®æéããã¤ã¼ããã¾ãã'; const reprompt = speechOutput; this.emit(':ask', speechOutput, reprompt); }, 'AMAZON.CancelIntent': function () { this.emit(':tell', this.t('STOP_MESSAGE')); }, 'AMAZON.StopIntent': function () { this.emit(':tell', this.t('STOP_MESSAGE')); }, }; exports.handler = function (event, context) { const alexa = Alexa.handler(event, context); alexa.APP_ID = APP_ID; // To enable string internationalization (i18n) features, set a resources object. alexa.registerHandlers(handlers); alexa.execute(); };
Alexa.handlerãªãã¸ã§ã¯ãã®this.emit
ãå®è¡ãããã¨ã§ãAlexaãåãã¾ãã
ãã¤ãã¿ã¼ã«æ稿ããTwitter.postTweet
ã®é¨åã¯å梱ã®twitter.jsã«èªä½ã®OAuthããã°ã©ã ãå®è£
ãã¦ãã¾ãã
"use strict"; const AWS = require('aws-sdk'); const https = require('https'); const request = require('request'); const crypto = require('crypto'); const url='https://api.twitter.com/1.1/statuses/update.json'; function postTweet(message) { return new Promise((resolve,reject) => { const include_entities = { status: message, // include_entities: true }; const params = { oauth_consumer_key: process.env.CONSUMER_KEY, oauth_token: process.env.ACCESS_TOKEN, oauth_signature_method: 'HMAC-SHA1', oauth_timestamp: (() => { const date = new Date(); return Math.floor(date.getTime() / 1000); })(), oauth_nonce: (() => { const date = new Date(); return date.getTime(); })(), oauth_version: '1.0' }; let auth_params = Object.assign(include_entities,params); let encoded_auth_params = Object.keys(auth_params).map(function(key){ return `${encodeURIComponent(key)}=${encodeURIComponent(this[key])}`; },auth_params); encoded_auth_params.sort((a,b) => { if(a < b) return -1; if(a > b) return 1; return 0; }); const sigunature_base = `${encodeURIComponent('POST')}&${encodeURIComponent(url)}&${encodeURIComponent(encoded_auth_params.join('&'))}`; const keyOfSign = `${encodeURIComponent(process.env.CONSUMER_SECRET)}&${encodeURIComponent(process.env.ACCESS_TOKEN_SECRET)}`; const signature = crypto.createHmac('sha1',keyOfSign).update(sigunature_base).digest('base64'); params.oauth_signature = signature; let authorization = Object.keys(params).map(function(key) { return `${encodeURIComponent(key)}="${encodeURIComponent(this[key])}"`; },params); authorization.sort((a,b) => { if(a < b) return -1; if(a > b) return 1; return 0; }); const headers = { Authorization: `OAuth ${authorization.join(', ')}` }; const options = { url: url+"?status="+encodeURIComponent(message), headers: headers }; request.post(options ,(error,response,body) => { if(error) { reject("reject:"+error); } else if(response.statusCode!=200) { reject("reject:statusCode="+response.statusCode); } else { resolve(); } }); }); }; module.exports.postTweet=postTweet;
const AWS = require('aws-sdk');
ãå®è¡ãããã¨ã§process.env.CONSUMER_KEY
ã¨ããå½¢å¼ã§ãå¾è¿°ããAWS lambdaã«è¨å®ããç°å¢å¤æ°ãå©ç¨ãããã¨ãã§ãã¾ãã
ç¶ãã¦ç°å¢å¤æ°ãè¨å®ãã¾ãããCONSUMER_KEYããCONSUMER_SECRETããACCESS_TOKENããACCESS_TOKEN_SECRETãããã¼ã«ã¨ãã¦ãæåã«TwitterApplicationManagementã§åå¾ããããããã®å¤ãè¨å®ãã¾ãã
次ã«ç»é¢ä¸æ®µã®Designerã®ãããªã¬ã¼ã®è¿½å ããããAlexa Skills Kitããé¸æãã¾ãã
ç»é¢æä¸é¨ã«ãããªã¬ã¼ã®è¿½å ãã¡ãã¥ã¼ã表示ãããã®ã§ã追å ããå®è¡ãã¾ãã
æå¾ã«ç»é¢å³ä¸ã®ãä¿åããå®è¡ãã¾ãã
ããã¾ã§ã§é¢æ°ã®ä½æã¯å®äºã§ããæ£å¸¸ã«é¢æ°ãåä½ãããããã¹ããã¾ãã
ããã¹ãããã¯ãªãã¯ããã¨åç»é¢ã表示ãããã®ã§ããæ°ããã¤ãã³ãã®ä½æããé¸ã³ã¤ãã³ããã³ãã¬ã¼ããAlexa Start Sessionããé¸æãã¾ãã
ããã¨ä½ããã³ã¼ãã表示ããã¾ããã¤ãã³ãåã«é©å½ãªååãå ¥åããä½æããå®è¡ãã¾ãã
ç»é¢ã«æ»ãåã³ããã¹ãããå®è¡ãã¦ãå®è¡çµæï¼æåãã¨è¡¨ç¤ºãããã°é¢æ°ã®ãã¹ãã¯å®äºã§ãã
æå¾ã«ç»é¢å³ä¸ã«è¡¨ç¤ºããããARNããã³ãã¼ãã¦ããã¾ãããã®å¾ã®è¨å®ã«å©ç¨ãã¾ãã
Amazonéçºè ã³ã³ã½ã¼ã«ã§ä»ä¸ãã¨ãã¹ã
é¢æ°ã®ä½æãçµãã£ããAmazonéçºè ã³ã³ã½ã¼ã«ã«æ»ãã¾ãã
è¨å®ã¡ãã¥ã¼ã®é ç®ãã¨ã³ããã¤ã³ããã§ãAWS Lambdaã®ARNï¼Amazonãªã½ã¼ã¹ãã¼ã ï¼ããé¸æãã¾ããããã¨ãä¸ã®æ¹ã«ãããã©ã«ããã¨ãããã©ã¼ã ã表示ãããã®ã§ãå ã»ã©ã³ãã¼ããARNãè²¼ãä»ãã¦æ¬¡ã¸é²ã¿ã¾ãã
ãã¹ãç»é¢ã表示ãããã®ã§ãããã§æçµçãªåä½ç¢ºèªãè¡ãã¾ãããã®ç»é¢ã§ã¯ä½æããAlexaã¹ãã«ãèµ·åããç¶æ ã«ãªã£ã¦ãããããçºè©±ãµã³ãã«ã§è¨å®ãããã¼ãã¬ã¼ãºãå ¥åãã¾ãã
ãã©ã¼ã ã«ããã ãã¾ãã¨å ¥åããããã¤ãã°ãå¼ã³åºãããå®è¡ãã¾ãã
ããã¨å·¦å´ã«ã¯Alexaã¸éä¿¡ããå
¥åæ
å ±ãå³å´ã«ã¯Alexaãæ
å ±ãåãåãAWS Lambdaã§å®è¡ãããé¢æ°ã®çµæã表示ããã¾ããå³å´ã®ãoutputSpeechããAlexaãåãå
容ã§ããããã«æ³å®éãã®ã»ãªãã表示ããã¦ããã°OKã§ãï¼
AmazonEchoã«å°å ¥
ããã¾ã§ã§Alexaã¹ãã«ã®ä½æã¯å ¨ã¦å®äºã§ããæå¾ã¯å®æ©ã¸å°å ¥ãã¾ãã
次ã®ç»é¢ã¸é²ãã¨å
¬éæ
å ±ã®è¨å®ã«ãªãã¾ããä»åã¯æ¬å½ã«å
¬éããããã§ã¯ãªãã®ã§ãé©å½ã«å
¥åãã¾ãã
æå¾ã«ãã©ã¤ãã·ã¼ã¨ã³ã³ãã©ã¤ã¢ã³ã¹ã®è¨å®ã§ããã¨ãããããããããã¨ã輸åºã³ã³ãã©ã¤ã¢ã³ã¹ãã«ãã§ãã¯ããã°OKã§ãã
ä¿åãå®è¡ããã¨ç»é¢å·¦å´ã®ã¡ãã¥ã¼ãããã¹ãã«ã®ãã¼ã¿ãã¹ãããã¯ãªãã¯ã§ããããã«ãªãã¾ãã
ããã¹ã¿ã¼ã®ã¡ã¼ã«ã¢ãã¬ã¹ãã«èªåã®ã¢ãã¬ã¹ãå ¥åãã¦è¿½å ãã¾ããä»ã«ã使ã£ã¦ããããã人ãããã°æ大500件ã¾ã§ç»é²ã§ãã¾ãã
æå¾ã«ããã¹ããéå§ããå®è¡ãã¾ãã
èªåã®ã¢ãã¬ã¹ã«ã¡ã¼ã«ãå±ãã®ã§ããã®ä¸ã®ãªã³ã¯ãã¯ãªãã¯ãã¾ãããªãæ¥æ¬èªç°å¢ã§ã¯2çªç®ã®ãJP customerï½ããªã³ã¯ãé¸æãã¾ãã
Alexaã¹ãã«ã®ãã¼ã¸ï¼ã¢ããªç»é¢ï¼ã表示ãããã®ã§ãã¹ãã«ãã¹ããã§ã¹ãã«ãæå¹åãã¾ãã
Alexaã¹ãã«éçºã骨ã¯æããã楽ãããï¼
以ä¸ãèªä½ã®Alexaã¹ãã«ãéçºãã¦å®æ©ã«å°å ¥ããã¨ããã¾ã§ãç´¹ä»ãã¾ããã
Amazon Developerã³ã³ã½ã¼ã«ãAWSãå¿ è¦ã«å¿ãã¦ã¢ããªã®èªè¨¼ãå¿ è¦ãªã®ã§ãæ軽ã«ã§ããï¼ï¼ããã®ã§ã¯ããã¾ããã
ããããªããèªåã§ä½æããããã°ã©ã ã§Alexaãåã£ã¦ãããã¯ããªããªãã«éææãããã¾ãã
æãªäººãã¬ã¸ã§ãã好ããªäººããã²ããªãã®Alexaã«ãªãªã¸ãã«ã®ã¹ãã«ãè£ åããã¦ã¿ã¦ãã ããï¼
Amazon Echo (Newã¢ãã«)ããã£ã³ã¼ã« (ãã¡ããªãã¯)
- åºç社/ã¡ã¼ã«ã¼: Amazon
- çºå£²æ¥: 2017/11/15
- ã¡ãã£ã¢: ã¨ã¬ã¯ãããã¯ã¹
- ãã®ååãå«ãããã° (3件) ãè¦ã