Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Alexa Hostedおさらい&Blueprintsでスキルリリースしてみた / Alexa...
Search
Kuniaki Shimizu
February 28, 2019
Technology
0
580
Alexa Hostedおさらい&Blueprintsでスキルリリースしてみた / Alexa Hosted & Blueprints review
【大阪】スマートスピーカーミーティング 2019/02/28(
https://osaka-driven-dev.connpass.com/event/117481/
) のLTの資料です
Kuniaki Shimizu
February 28, 2019
Tweet
Share
More Decks by Kuniaki Shimizu
See All by Kuniaki Shimizu
RAGのretrievalの評価を “ranx”で行う / Evaluate retrival of RAG using "ranx"
kun432
1
3.1k
VoiceLunchJP#27 Voiceflow Updates 2022 (EN)
kun432
0
210
VoiceLunchJP#27 Voiceflow Updates 2022
kun432
0
210
Voiceflowではじめる音声アプリ・チャットボット開発〜2022年版〜 / Introduction to Developing Voice Apps & Chatbots with Voiceflow
kun432
1
1.5k
VoiceLunchJP#3 VoiceflowでAudioPlayerスキルを作ろう!ハンズオン / VoiceLunchJP3 Alexa's Audio Player Hands-on using Voiceflow
kun432
0
220
Skill Connections やってみた / Introduction to Alexa Skill Connections
kun432
1
1.9k
Skill Connectionsやってみた / Introduction to Alexa's Skill Connection
kun432
0
530
ノンコーディングで始めるAlexaスキル開発 / Introduction to Alexa Skill Development with non-conding
kun432
0
360
Alexaでもparタグ使いたい!〜Alexaで発話とサウンドを並列再生する〜 / Speak with Background Music on Alexa
kun432
0
2k
Other Decks in Technology
See All in Technology
Jakarta Agentic AI Specification - Status and Future
reza_rahman
0
110
re:Invent2025 3つの Frontier Agents を紹介 / introducing-3-frontier-agents
tomoki10
0
230
多様なデジタルアイデンティティを攻撃からどうやって守るのか / 20251212
ayokura
0
480
AI駆動開発の実践とその未来
eltociear
0
130
NIKKEI Tech Talk #41: セキュア・バイ・デザインからクラウド管理を考える
sekido
PRO
0
140
子育てで想像してなかった「見えないダメージ」 / Unforeseen "hidden burdens" of raising children.
pauli
2
260
エンジニアリングをやめたくないので問い続ける
estie
2
1.2k
AIプラットフォームにおけるMLflowの利用について
lycorptech_jp
PRO
1
170
今からでも間に合う!速習Devin入門とその活用方法
ismk
1
750
mairuでつくるクレデンシャルレス開発環境 / Credential-less development environment using Mailru
mirakui
5
540
re:Invent2025 コンテナ系アップデート振り返り(+CloudWatchログのアップデート紹介)
masukawa
0
390
5分で知るMicrosoft Ignite
taiponrock
PRO
0
390
Featured
See All Featured
Thoughts on Productivity
jonyablonski
73
5k
GraphQLとの向き合い方2022年版
quramy
50
14k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
A designer walks into a library…
pauljervisheath
210
24k
GitHub's CSS Performance
jonrohan
1032
470k
Being A Developer After 40
akosma
91
590k
Rails Girls Zürich Keynote
gr2m
95
14k
A better future with KSS
kneath
240
18k
Building Applications with DynamoDB
mza
96
6.8k
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
Transcript
おさらい でスキル リリースしてみた
アジェンダ • 自己紹介 • おさらい • おまけ) でスキルリリースしてみた
自己紹介
@kun432 通信事業者系ISPのインフラエンジニア 最近はWiFIのシステム開発・運用全般 - Twitter/Facebook/Github/はてなブログ/Alexa - ポートフォリオ: https://kun432.github.io/ I ❤
Alexa: 8 (JP:7, US:1) Google: 1 Clova: 1 今しがた一つリジェクトされました、、、 個までの道のりは長い、、、
JAWS DAYS 2019に行ってきました。 - コンテナ人気すごい。でもAlexa関連も良かったです。 - Alexaハンズオン最高。資料はQiitaで公開されてます。オススメ。 →「Qiita: CodeStar+Twilio PayでAlexa経由の電話決済を実装する」
(by 岡本さん) - パブリックスペースでの導入事例を作りたい - 導入事例(商店街・ホテル)の現地レポをブログ載せてます。 - Alexa居酒屋、池袋パルコ、名古屋松坂屋、行きたい、、、
おさらい
これまでの スキル開発 開発者コンソール 対話モデル設計 /エンドポイント 設定/公開申請 静的コンテンツ (画像/音声/動画) 永続データ等 アカウント
アカウント バックエンド 実装 エラー時の 解析等 権限、ロー ルの管理
これまでの スキル開発 開発者コンソール 対話モデル設計 /エンドポイント 設定/公開申請 静的コンテンツ (画像/音声/動画) 永続データ等 アカウント
アカウント バックエンド 実装 エラー時の 解析等 権限、ロー ルの管理
これまでの スキル開発 AmazonとAWSの両方のアカウントが必要。 Amazon.comのアカウント持っててハマる。 AmazonとAWSで画面行ったり来たり。 AWSのサービスごとに画面行ったり来たり。 AWSいろいろ知らなくていいことがたくさん出てくる。 - Lambdaでnpmパッケージ追加するならローカル環境必要。 -
S3で静的ファイル扱うにはバケットのCORS設定が必要。 - S3、Alexaからはパブリックアクセス前提? - CloudWatch Logs見にくい。 - DynamoDB、RDBとは違う。 初心者にはやさしくない
そこで
スキルの作成、編集、公開がAlexa開発者コンソール で完結、ブラウザだけあればよい フロントエンド(対話モデル) バックエンド(Lambda相当) ファイルストレージ(S3相当) セッションストレージ(DynamoDB相当) ロギング(CloudWatch Logs相当) AWSアカウント不要、AmazonアカウントだけでOK 権限管理とかない(IAM)
シンプル!
開発者 コンソール 相当 相当 相当 Amazon.co.jp アカウント
None
※カスタムスキルのみ ※ 分程度で作成される
None
None
必ず忘れないで実施!
これだけ
超簡単
さぁ、コードを 書こう!
その前に・・・
特有の やり方や制限がある
今日の本題
おさらい 自分向けまとめ
自分向けまとめ • スキル開発に慣れてくるといろいろやりたくなる。 ◦ 静的ファイル、セッション、 、などなど ◦ ここが最初のハードル • いろいろ調べるけど、情報が多すぎる。
◦ リソース使う前提のものが多い ◦ でそれできるんだっけ? • 楽したい ◦ 使う場合に特化した情報がほしい ◦ コード頻繁に書かないので、コピペで済ませたい • とはいうものの、 ◦ まあ一応 も知って起きたいよね。 ◦ 違いを把握しておけばよい 完全にLGTMなまとめです!
画像、動画、音声、等 静的ファイル使いたい
静的ファイル(これまで) S3でホストが一般的 リージョン選択可能、東京リージョンが一般的 バケットにCORS設定必要 オブジェクトにパブリックアクセス権を付与 コードからは画像、音声、動画それぞれのやり方で呼び出す const imageUrl = 'https://s3-ap-northeast-1.amazonaws.com/xxxxxx/sample.png';
const myImage = new Alexa.ImageHelper() .addImageInstance(imageUrl) .getImage(); const url = 'https://s3-ap-northeast-1.amazonaws.com/xxxxxx/sample.mp4'; return handlerInput.responseBuilder .speak(speechText) .addVideoAppLaunchDirective(url, 'title', 'subtitle') .getResponse();
静的ファイル( ) Alexa Hosted専用のS3でホスト。スキルごとにバケットが用意される。 リージョンは米国東部(バージニア北部)のみ。 → レイテンシー注意 設定変更一切不可(アクセス権付与、バージョニング、暗号化)。 → 逆に言うと何も気にせずアップロードだけで良い
コードからは署名付きURLで呼び出す必要があり。 → 有効時間60秒固定、変更不可。問題になるケースがあるかも? const Util = require('util.js'); ... handle(handlerInput){ const pictureUrl = Util.getS3PreSignedUrl("Media/picture.jpg"); return handlerInput.responseBuilder .speak('画像付きのハローワールドです ') .withStandardCard('card title', 'card text', pictureUrl) .getResponse(); }
静的ファイル( ) const AWS = require('aws-sdk'); const s3SigV4Client = new
AWS.S3({ signatureVersion: 'v4' }); module.exports.getS3PreSignedUrl = function getS3PreSignedUrl(s3ObjectKey) { const bucketName = process.env.S3_PERSISTENCE_BUCKET; const s3PreSignedUrl = s3SigV4Client.getSignedUrl('getObject', { Bucket: bucketName, Key: s3ObjectKey, Expires: 60*1 // the Expires is capped for 1 minute }); console.log(`Util.s3PreSignedUrl: ${s3ObjectKey} URL ${s3PreSignedUrl}`); return s3PreSignedUrl; }
静的ファイル( ) const AWS = require('aws-sdk'); const s3SigV4Client = new
AWS.S3({ signatureVersion: 'v4' }); module.exports.getS3PreSignedUrl = function getS3PreSignedUrl(s3ObjectKey) { const bucketName = process.env.S3_PERSISTENCE_BUCKET; const s3PreSignedUrl = s3SigV4Client.getSignedUrl('getObject', { Bucket: bucketName, Key: s3ObjectKey, Expires: 60*1 // the Expires is capped for 1 minute }); console.log(`Util.s3PreSignedUrl: ${s3ObjectKey} URL ${s3PreSignedUrl}`); return s3PreSignedUrl; } ・util.jsでaws-sdkを使っている ・よいところ - 環境変数からS3のバケット名を とってきている - Github等でコードを公開する場合、 このほうが都合が良い - 普通にLambda使う場合でもこのほう がいいんでは?
静的ファイル( )
静的ファイル( )
静的ファイル( )
静的ファイル( )
セッション使いたい
セッション(これまで) 3種類 Request attributes (1回のリクエスト中) Session attributes (1回のセッション中) Persistent attributes
(セッション跨ぎ) Persistent attributes DynamoDBが一般的(S3でもできなくはない) LambdaのIAMロールにDynamoDBアクセス権付与 DynamoDBPersistentAdapterを使う SkillBuilders内でテーブル名を指定 テーブル自動作成も可(要権限) 読み書きする
セッション(これまで) const Alexa = require('ask-sdk'); ・・・ exports.handler = Alexa.SkillBuilders.standard() .addRequestHandlers(
・・・ .withTableName("sampleTableName") .withAutoCreateTable(true) .lambda(); const Alexa = require('ask-sdk-core'); const Adapter = require('ask-sdk-dynamodb-persistence-adapter'); exports.handler = Alexa.SkillBuilders.custom() .addRequestHandlers( ・・・ .withPersistenceAdapter( new Adapter.DynamoDbPersistenceAdapter( {tableName: 'sampleTableName', createTable: true })) .lambda(); (全部入り) を使う場合 (ミニマム) を使う場合
セッション(これまで) async handle(handlerInput) { ・・・ const attr = await handlerInput.attributesManager.getPersistentAttributes();
const info = attr.info; ・・・ } async handle(handlerInput) { ・・・ const attr = await handlerInput.attributesManager.getPersistentAttributes(); attr.info = "foo"; handlerInput.attributesManager.setPersistentAttributes(attr); await handlerInput.attributesManager.savePersistentAttributes(); ・・・ } 読み 書き
セッション( ) • Persistent attributes ◦ DynamoDBは使えない、S3のみ ◦ S3-persistence-adapterを使う ▪
パッケージ追加必須 ▪ バケット名を指定する必要がない ▪ バケット内にユーザIDごとのファイルが作成 される
セッション( ) 必ず実施! npmパッケージを使いたい場合も同じです。
セッション( ) const Alexa = require('ask-sdk-core'); const persistenceAdapter = require('ask-sdk-s3-persistence-adapter');
・・・ exports.handler = Alexa.SkillBuilders.custom() .addRequestHandlers( ・・・ .withPersistenceAdapter( new persistenceAdapter.S3PersistenceAdapter( {bucketName:process.env.S3_PERSISTENCE_BUCKET})) .lambda(); .lambda(); 読み書きは 使う場合と同じ
セッション( ) const Alexa = require('ask-sdk-core'); const persistenceAdapter = require('ask-sdk-s3-persistence-adapter');
・・・ exports.handler = Alexa.SkillBuilders.custom() .addRequestHandlers( ・・・ .withPersistenceAdapter( new persistenceAdapter.S3PersistenceAdapter( {bucketName:process.env.S3_PERSISTENCE_BUCKET})) .lambda(); .lambda(); 読み書きは 使う場合と同じ ・util.jsを思い出してほしい ・環境変数からS3のバケット名を とってきている
セッション( )
セッション( )
セッション( ) “amzn1.ask.account.〜”というファイルが作成される ユーザID単位であることがわかる 中身を見たい場合はチェックしてダウンロード、テキストエディタ等 で見る(ブラウザからは見れない)
セッション( ) exports.handler = Alexa.SkillBuilders.custom() .addRequestHandlers( ・・・ .withPersistenceAdapter( .withPersistenceAdapter( new
persistenceAdapter.S3PersistenceAdapter( {bucketName:process.env.S3_PERSISTENCE_BUCKET, objectKeyGenerator: deviceIdKeyGenerator})) .lambda(); function deviceIdKeyGenerator(requestEnvelope) { if (requestEnvelope && requestEnvelope.context && requestEnvelope.context.System && requestEnvelope.context.System.device && requestEnvelope.context.System.device.deviceId) { return requestEnvelope.context.System.device.deviceId; } throw 'Cannot retrieve device id from request envelope!'; } デバイスごとにセッションを保存したい場合
セッション( ) exports.handler = Alexa.SkillBuilders.custom() .addRequestHandlers( ・・・ .withPersistenceAdapter( .withPersistenceAdapter( new
persistenceAdapter.S3PersistenceAdapter( {bucketName:process.env.S3_PERSISTENCE_BUCKET, objectKeyGenerator: deviceIdKeyGenerator})) .lambda(); function deviceIdKeyGenerator(requestEnvelope) { if (requestEnvelope && requestEnvelope.context && requestEnvelope.context.System && requestEnvelope.context.System.device && requestEnvelope.context.System.device.deviceId) { return requestEnvelope.context.System.device.deviceId; } throw 'Cannot retrieve device id from request envelope!'; } デバイスごとにセッションを保存したい場合 objectKeyGeneratorにIDを生成する 関数を指定する デバイスIDの場合
セッション( ) “amzn1.ask.device.〜”というファイルが作成される デバイスID単位であることがわかる
セッション( ) • Persistent attributes ◦ DynamoDBは使えない、S3のみ → 結果整合性には注意かも ◦
S3-persistence-adapterを使う ▪ パッケージ追加必須 ▪ バケット名を指定する必要がない → 環境変数も勝手に設定されるので便利 → コード内に書く必要がなくて便利 ▪ バケット内にユーザIDごとのファイルが作成 される → デバイスIDも可能、いろいろできる 再掲 DynamoDB高いので普通に Lambda 使う場合でもS3でやればいいという声 もあり
デバッグしたい
デバッグ( )
デバッグ( ) ここはそんなに変わらない。ロググループ探さなくてよいのは楽。
デバッグ( )※余談 ロググループの中を見ると、 codebuild のログが出てて、 AWSリソースがいろ いろいじられるさまが見えて面白い
無料枠について
無料枠( ) アカウントごとに適用 → スキル単位ではない → たくさんスキルを作る場合は注意! 超えた場合は1ヶ月の猶予期間内にAWSに要移行 → 事前に通知が来るらしい
→ エンドポイント変更が必要になるはず?再審査? 詳細は公式サイトを参照
無料枠( ) AWS Lambda - スキルの利用頻度 (時間&回数) リクエスト100万件/月 コンピューティング時間 320万秒/月
AWS CodeCommit - コードのサイズと更新頻度 ストレージ 50 GB Gitリクエスト 10,000件/月 ほとんど問題ないと思うけど、音声・動画ファイルを使う場合と永続 セッションを使う場合は気をつけたほうが良いかも。 Amazon S3 - スキル内からのファイル の利用頻度 ストレージ容量 5GB GETリクエスト 20,000件/月 PUTリクエスト 2,000件/月 データ転送量 15 GB/月
まとめ
まとめ AWSアカウント不要、開発者コンソールで完結する のでとても楽ちん ブラウザだけあればOK、ローカル環境構築不要 ハンズオンとかで良さげ 基本的なことはAlexa Hostedでも全部できる ハンズオンとかで良さげ ハンズオンとかで良さげ 個人レベル・小規模な開発なら問題なし
それ以外はAWSで。
スキルを作って どんどん公開しよう!
None
None
Any questions?
おまけ) でスキルリリースしてみた
None
• 予め用意されたテンプレートから、必要な値だけを変更 して、スキルを作成する。 • テンプレートいろいろ ◦ クイズ ◦ ◦ トリビア
◦ フラッシュブリーフィング ◦ などなど、現在 種類以上 • 現時点( 年 月末) オンリー ◦ アカウントでしか作れない ◦ スキルしかリリースできない
None
• 超かんたん! ◦ テンプレベースだからバグることがない ◦ 本当の意味でスキルの中身に集中できる ◦ テンプレの種類が豊富、ありがちなものはほぼカバー ▪ よくある案内スキルとかならすぐできる
◦ 審査リジェクトの可能性は低い • デメリット ◦ 日本ではまだ使えない(そのうち使えるようになるはず) ◦ 多言語もできない ◦ 凝ったことはできない ◦ 統計情報へのアクセスができない • その他 ◦ テンプレを作って公開できるといいな
None
※楽しかったので 超オススメ!
導入事例レポ
導入事例レポ
None