Alexa-SDKについて
Alexaサロン 東京 (岩本町)
2018年6月14日
Alexaのスキル開発では、「セッション情報の扱い」「レスポンスの組み立
て」「データの永続化」「処理のルーティング」など多くの煩雑な作業が必要
になります、しかし、Alexa SDKを使用すると、その殆どを任せることができ
るようになり、開発者は、ロジックにより集中すことができます。
本セッションでは、このSDKの使い方について紹介させて頂きます。また、4
月に公開された新しいバージョン(Version2)についても、その変化した内
容を中心にお話させて頂きます。
自己紹介
クラスメソッド(株)Alexa事業部
アプリケーションエンジニア
平内真一/SIN
・ 2017.2 〜 Alexaスキル、AVS(iPhone)
・ 2016.1〜 iPhoneエンジニア
・ 〜2016.1 陸上自衛隊
・ 2013/1〜 Microsoft MVP
[日本語Alexa] Alexa SDK V1のコードをV2に移植した。そして、ついでにTypeScriptにしてみた。
DialogflowのWebhookをAPI Gateway + Lambdaで作成し、Alexa-SDK(V2)みたいに書けるようにしてみた(TypeScriptで)
[日本語Alexa] Alexa-SDK Ver2をTypeScriptで書く時のタグ付き共用体の取扱要領について
[Alexa] 動画を再生するスキルを作ってみました
[日本語Alexa] Alexa-SDK Ver2(その7) ディスプレイ表示
[日本語Alexa] Cognito User Pool によるアカウントリンク
[日本語Alexa] Alexa-SDK Ver2 をTypeScriptで使う
[日本語Alexa] Alexa-SDK Ver2(その6) 所在地情報
[日本語Alexa] ビルトインスロットが大量に追加され、新垣結衣とかスターウォーズがヒットする
[日本語Alexa] Alexa-SDK Ver2(その5) ダイアログモード
[日本語Alexa] Alexa-SDK Ver2(その4) スキル属性
[日本語Alexa] Alexa SDK for Node.js Ver2入門(その3)レスポンスの作成
[日本語Alexa] Alexa SDK for Node.js Ver2入門(その2)ハンドラの登録
[日本語Alexa] Alexa SDK for Node.js Ver2入門(その1)はじめの一歩
[日本語Alexa] iPhoneとスキルを連携して、プッシュ通知やE-Mailを送ってみた
[日本語Alexa] Alexaで実際に読ませて確認しながら編集できるSSMLエディタを作ってみました
[日本語Alexa] Alexaスキル「ビンゴ大会」を公開しました。
[日本語Alexa] SessionEndedRequestの正しい料理法
[日本語Alexa] ダイアログモードの途中で別のインテントに遷移、そして再び戻って来る
[Alexa日本語] プログレッシブレスポンスを使用して応答待ちの間に音楽やメッセージを流してユーザーを幸せにする
[日本語Alexa] AudioPlayerで署名付きURL(Pre-Signed URL)を使用する
[日本語Alexa] スロット値の誤認識をバリデートする
[日本語Alexa] ダイアログモデルでスロットを自由自在に操作するためのドキュメント
[日本語Alexa] 強制的にステータスをCOMPLETEDに遷移させることで、複雑なダイアログモデルを作成してみる
[日本語Alexa] Google会議室予約スキルを作ってみました
[日本語Alexa] スキルで利用可能なサウンドライブラリが公開されました
[日本語Alexa] 受付スキル 〜小規模オフィスの無人の受付にEchoを置くとしたら〜
[日本語Alexa] 4桁の数字を確実に受けとるためには 〜より自然に会話できるスキル作成のために〜
[日本語Alexa] スマフォで録音した音声をEchoで再生するスキルを作ってみました。 〜家族の伝言板〜
[日本語Alexa] SSMLのAudioタグで応答に効果音を挿入する
[日本語Alexa] 本日から利用可能になった新しいコンソールでアカウントリンクを設定してみました
[日本語Alexa] ダイアログモデルでAMAZON.YesIntentとAMAZON.NoIntentが利用可能になりました
[日本語Alexa] 新登場スロット(フレーズ/Phrase)で自由な検索ワードを受け取る
[日本語Alexa] SSMLの組み立てが超便利なssml-builderについて
[日本語Alexa] AMAZON.RepeatIntentを実装して「もう一回」「もう一度言って」に対応する〜より自然に会話できるスキル作成のために〜
[日本語Alexa] APIGatewayをプロキシーとして設定し、アカウントリンクをデバッグする
[日本語Alexa] Office365会議室予約スキル
[日本語Alexa] AMAZON.Numberで作成した必須スロットで適当な数(たくさん!とか、いっぱい!)を受け付ける〜より自然に会話できるスキル
作成のために〜
[日本語Alexa] 発話の揺れをカスタムスロットで吸収する〜より自然に会話できるスキル作成のために〜
[日本語Alexa] 私の部屋の蛍光灯のリモコンが壊れたので・・・Echoで操作できるようにした
[日本語Alexa] スキルで利用可能な各種IDの一意性調査
[日本語Alexa] Alexa Skills Kit for Node.js 次の一歩(データ保存)
[日本語Alexa] Alexa Skills Kit for Node.js はじめの一歩
[日本語Alexa] 日本語スキルを公開しました。審査提出から公開まで 〜あなたの味方〜
[Alexa] 本日公開された Test Simulator(Beta)を使ってみました
Alexa for Business API を使用してみました #reinvent #Alexa
Alexa for Business 用のエンタープライズ向けスキル #reinvent #Alexa
Alexa for Business ユーザーの招待編 #reinvent #Alexa
Alexa for Business プライベートスキルでアカウントリンクをやってみました #reinvent #Alexa
Alexa for Business スキル管理編 #reinvent #Alexa
Alexa for Business プライベートスキルを作ってみました #reinvent #Alexa
[Alexa] DynamoDBによるiPhoneと連携(暗証番号の取得)
Alexa for Business 部屋の管理編 #reinvent #Alexa
Alexa for Business デバイスのセットアップ編 #reinvent #Alexa
[Alexa] Microsoft Graph にアカウントリンクしてみました 〜AlexaでOffice 365を操作するために〜
[Alexa] 遂に出た日本語Alexa 〜そして今日、半端ない量の日本語情報が吹き出してきた〜
[Alexa] LINEログインでAccount Linkingしてみた
[Alexa] Login with Amazon との Account Linking で名前を呼びかける挨拶とかメールを送信するスキルを作ってみました
[Alexa] Account Linking を使用してスキルからFacebookに投稿してみました
[Alexa] ask-cliを使用してスキルのクローンを作成してみました
[Alexa] Responseオブジェクトを利用した応答の作成
[Alexa] 遂にでた! Alexa Skill Kit のCLIでデプロイまでやってみた
[Alexa] Amazon LexのスキーマからAlexaスキルを作成する
[Alexa] スキルからTo-doリストやShoppingリストを操作する
[Alexa] Skillの応答にカードを追加して、詳細情報を提供する
[Alexa] VUI Testing Toolを試してみました
[Alexa] Live後のスキルの設定項目で、変更できるものと出来ないもの
[Alexa] SkillのEndpointは、Alias付きのARNがおすすめです。
[Alexa] Flash Briefing Skill でDevelopers.IOの最新情報を読ませてみた
[Alexa] スロット値にシノニム(同義語)を設定してみる
[Alexa] SkillBuilder(Betaリリース)を使用してDialogモデルを使ってみた
[Alexa] SSMLのAudioタグで応答に効果音を挿入する
[Alexa] SSMLの組み立てが超便利なssml-builderについて
[Alexa] MyCounterスキルを公開しました
Amazon AlexaのSkillにおける、applicationId,userId,deviceIdの一意性の調査
Developers.IO 2017セッション「iPhoneによるAlexa/Lex/Pollyを利用した音声対応アプリの作成方法」で話しました #cmdevio2017
Alexa Skills Kit for Node.js 次の一歩(DynamoDB)
Alexa Skills Kit for Node.js はじめの一歩
Amazon Alexa用のクライアントをiOSで作ってみた
2017/3/14から80本
2017/11/14 日本語登場
AWS re:invent 2017/11
SDK バージョン2 2018/4/18
アジェンダ
アジェンダ
• Alexa SDKとは
• バージョン1と2
• バージョン1の実装
• バージョン2の実装
• TypeScriptでの実装
• 最後に(どっちがいいの?)
スキル開発の経験は?Ver1とVer2どちらを使ってますか?
Alexa SDKとは
Alexa SDKとは
煩わしい作業をSDKに押し付けて、開発者はロジックに集中できてウハウハ
ロジック
Alexa
SDK
Alexa SDKとは
何をやってくれるの
• リクエスト・レスポンスJSONの抽象化
• データの保存(セッション、永続化)
• 処理のルーティング(ハンドラ登録)
• ステート(状態)
Alexa SDKの対応言語は、Node.jsとJava(Ver2のみ)
その他は、自前で頑張ってください。
ロジック
Alexa
SDK
バージョン1と2
バージョン1
っで、何が違うの・・・? どっちが美味しいの?
• 4月18日以前
• はじめてのAlexaスキル開発
• Blog情報など、まだまだ
• Lambdaのテンプレート
バージョン2
結構美味しそう!!
• ハンドラの実装方法が変わった
• データ永続化の記述が明確になった
• コア機能のみの利用可能
• Node 8対応 (async/await) Ver.1はcallback
• DynamoDB以外も利用可能
• AlexaサービスAPIのラッパー提供
• Java+Node.js
バージョン1の実装
インストール
npm
参考:https://dev.classmethod.jp/cloud/alexa-sdk/
$ npm install --save alexa-sdk
$ ls node_modules/
alexa-sdk i18next-sprintf-postprocessor querystring
aws-sdk ieee754 sax
base64-js isarray url
buffer jmespath uuid
events lodash xml2js
i18next punycode xmlbuilder
簡単なサンプル
参考:https://dev.classmethod.jp/cloud/alexa-sdk/
簡単なサンプル
参考:https://dev.classmethod.jp/cloud/alexa-sdk/
簡単なサンプル
参考:https://dev.classmethod.jp/cloud/alexa-sdk/
require
簡単なサンプル
参考:https://dev.classmethod.jp/cloud/alexa-sdk/
ハンドラオブジェクト
生成
簡単なサンプル
参考:https://dev.classmethod.jp/cloud/alexa-sdk/
ハンドラ作成
簡単なサンプル
参考:https://dev.classmethod.jp/cloud/alexa-sdk/
インテント名
簡単なサンプル
参考:https://dev.classmethod.jp/cloud/alexa-sdk/
発話
簡単なサンプル
参考:https://dev.classmethod.jp/cloud/alexa-sdk/
ハンドラ追加
簡単なサンプル
参考:https://dev.classmethod.jp/cloud/alexa-sdk/
ハンドラへの
ルーティング
リソース
参考:https://dev.classmethod.jp/cloud/alexa-sdk/
リソース
参考:https://dev.classmethod.jp/cloud/alexa-sdk/
リソース
tellとask
言い切るか、問い合わせるか
参考:https://dev.classmethod.jp/cloud/alexa-sdk/
ステート
ステートごとにハンドラを定義できる
参考:https://dev.classmethod.jp/cloud/alexa-sdk/
データの保存
テーブル名を定義するとうまくやってくれる
参考:https://dev.classmethod.jp/cloud/alexa-sdk-dynamodb/
バージョン2の実装
バージョン1からの変更点
結構ダイナミックに変わってます
• tell、askの廃止 => ResponseBuilder
• ステートの廃止
• ハンドラのインターフェース canHandle
• データ永続化の要領
• 例外時の処理
簡単なサンプル
ハンドラの登録について
参考:https://dev.classmethod.jp/cloud/alexa-sdk-v2-second/
1. 標準処理の追加
addRequestHandlers
2. 前処理及び後処理の追加
addRequestInterceptors/addResponseInterceptors
3. エラー「例外」処理の追加
addErrorHandlers
レスポンスの作成
1. スピーチとリプロンプト
speak / reprompt
2. カード情報
withSimpleCard/withStandardCard
3. レスポンス取得
getResponse
参考: https://dev.classmethod.jp/cloud/alexa-sdk-v2-seventh/
属性
参考: https://dev.classmethod.jp/cloud/alexa-sdk-v2-fourth/
1.1回のリクエスト中のみ有効)
Request attributes
2.セッション継続間に有効
Session attributes
3.セッションを跨いで永続化 DynamoDB等が必要
Persistent attributes
ダイアログモード
参考: https://dev.classmethod.jp/cloud/alexa-sdk-v2-fifth/
所在地情報
非常に簡単になりました
参考: https://dev.classmethod.jp/cloud/alexa-sdk-v2-sixth/
所在地情報
非常に簡単になりました
参考: https://dev.classmethod.jp/cloud/alexa-sdk-v2-sixth/
const consentToken =
requestEnvelope.context.System.user.permissions.consentToken;
if (!consentToken) {
return responseBuilder
.speak('住所の利用が許可されていません。')
.withAskForPermissionsConsentCard(PERMISSIONS)
.getResponse();
}
所在地情報
非常に簡単になりました
参考: https://dev.classmethod.jp/cloud/alexa-sdk-v2-sixth/
const { deviceId } = requestEnvelope.context.System.device;
const deviceAddressServiceClient =
serviceClientFactory.getDeviceAddressServiceClient();
const address = await deviceAddressServiceClient.getFullAddress(deviceId);
const speechText = '郵便番号’ +
address.postalCode +
address.stateOrRegion +
address.city;
ディスプレイ表示
参考: https://dev.classmethod.jp/cloud/alexa-sdk-v2-seventh/
ディスプレイ表示
参考: https://dev.classmethod.jp/cloud/alexa-sdk-v2-seventh/
ディスプレイ表示
参考: https://dev.classmethod.jp/cloud/alexa-sdk-v2-seventh/
ビデオ表示
参考: https://dev.classmethod.jp/cloud/alexa-video-skill/
ビデオ表示
参考: https://dev.classmethod.jp/cloud/alexa-video-skill/
TypeScriptでの実装
TypeScriptでの実装
参考: https://dev.classmethod.jp/cloud/alexa-sdk-v2-typescript/
TypeScriptでの実装
参考: https://dev.classmethod.jp/cloud/alexa-sdk-v2-typescript/
import * as Alexa from 'ask-sdk';
import
{ RequestEnvelope, ResponseEnvelope, services }
from 'ask-sdk-model';
TypeScriptでの実装
参考: https://dev.classmethod.jp/cloud/alexa-sdk-v2-typescript/
TypeScriptでの実装
参考: https://dev.classmethod.jp/cloud/alexa-sdk-v2-typescript/
TypeScriptでの実装
参考: https://dev.classmethod.jp/cloud/alexa-sdk-v2-typescript/
TypeScriptでの実装
かなり幸せになれるかも知れません
参考: https://dev.classmethod.jp/cloud/alexa-sdk-v2-typescript/
最後に
最後に
っでどっちがいいのか・・・?
• Ver1の方が簡単に書ける
• Ver1に未来はあるのか・・・?
• これから取り掛かるならVer2でいいかも
• 個人的には、Ver2押し
• データ永続化が明確
• canHandleも慣れると悪くない
• Alexa APIへのアクセスが超簡単
• async/await 最高
• TypeScriptで書ける
ご清聴ありがとうございました
Alexa SDKについてのお話はいかがだってしょうか・・・
少しでも、皆様の理解の助けになれていれば嬉しいです。
本日は、ありがとうございました。
Alexaサロン 東京 (岩本町)
2018年6月14日

Alexa SDK Alexa Salon