Node.jsを噛み砕く編スポンサーリンクプログラミング2019.02.25Alexaスキル「あかちゃんきろく」リリースしました!初アレクサスキル開発で、色々学びながらなんとかかんとかリリースできました。そんな学習で得た知識・メモでっす。Node.js)を噛み砕いて知りたいとこまで調べたメモになっとります。スキル「あかちゃんきろく」は↓で紹介しています。Alexaスキル「あかちゃんきろく」~声でもタッチでも!手がふさがっててもしっかり育児記録&確認~「あかちゃんきろく」はAPLによる画面表示対応しており、APLメモも別途まとめてます↓。Node.jsの内容を噛み砕いてメモしていったもの。SDK提供のAPIや、フレームワーク、機能について取り上げる。SDK環境セットアップ方法等は他を参照。これ見れば、ざっくりとはすぐ作れる。skillBuilderでスキルを作成Skillのコンフィギュレーションメソッドを備えたSkillBuilderが提供されている。lambda向けの関数ハンドラを返すメソッドがある(lambda())ので、Lambda関数本体をこれで設定する。サンプルの最後の方に書いてあるやつがそれ↓。.lambda();custom()メソッドにより、CustomSkillBuilderが使われている。この他にstandard()でStandardSkillBuilderを使うことも可能。Standardがあるが、それぞれまとめたインターフェース一覧は以下。this;最初のうちは、サンプルのテンプレ通りに作るならあまり意識する必要はない。Response、所在地情報、等を使い出すとコンフィギュレーション設定が必要。その場合は、PersistenceAdapterやApiClientなどを参照しながらカスタマイズした機能をもつスキルとする。基本はStandardSkillBuilderを使っておけば大体事足りそう。デフォルトでDynamoDbPersistenceAdapterとDefaultApiClientを使用し、DynamoDbPersistenceAdapterの設定に役立つ便利なメソッドを提供します。InterceptorsやErrorHandlerを使うとRequestHandler全てに必要な処理や例外処理を統一的に扱えて便利。userIdとrequest内容のログ出力とかを1つの処理にまとめられるとか。スキル属性handlerInpputとはまず、ベースとなるのが、サンプルの各Handlerに渡されているhandlerInput。handlerInputのプロパティとして提供されているのが以下。RequestEnvelope:スキルの送信されるリクエスト本文全体を含みます。AttributesManager:リクエスト、セッション、永続アトリビュートへのアクセスを提供します。APIの呼び出しが可能なサービスクライアントを構築します。ResponseBuilder:応答を作成するヘルパー関数を含みます。Context:ホストコンテナが渡すオプションのcontextオブジェクトを提供します。Lambda関数のcontextオブジェクトになります。HandlerInputどれも重要でそれぞれ以降で詳細化。上のRequestEnvelopeに当たる中身。JSONオブジェクトで、JSではそれぞれプロパティとしてアクセス。以下が実際のリクエスト本文例。{}}リクエスト本文の構文セッション中保持や永続保存等、様々な情報の管理(アトリビュート管理)上記handlerInputからとれるAttributesManagerで、寿命に応じた情報(=アトリビュート)の管理ができる。永続アトリビュートの取得と保存を簡単に行える3つのメソッドが用意されています。setPersistentAttribute保存したいアトリビュートを設定します。処理高速化のため、このメソッドを実行した時点ではアトリビュートはローカルのみにキャッシュされていて、永続ストレージには保存されていないことに注意が必要です。savePersistentAttributeローカルにキャッシュされているアトリビュートを永続ストレージに保存します。構文で使う必要があります。getPersistentAttributes保存してあるアトリビュートを取得します。非同期処理なので、async/await構文で使う必要があります。永続アトリビュート(DB保存データ)を利用可能。}}ResponseBuilder上記の応答本文を構築するヘルパークラスがResponseBuilder。以下のようなメソッドがある。ResponseBuilderよく使いそうなのは以下。セッション継続するかの設定これらの必要なものを組み合わせて使ったのがいつもの↓となる。.getResponse();Directiveで専用処理ResponseにDirectiveを適切に設定することで専用の特殊処理が可能。特定のインターフェース(音声ストリーミング用のAudioPlayerインターフェースなど)を使用してデバイスレベルで実行するアクションを指定する、ディレクティブの配列です。ディレクティブResponseBuilderのaddDirectiveにDirectiveオブジェクトを設定。Directiveのタイプ定義は以下。require('./data.json')})(node_modules/ask-sdk-model/index.d.tsを参照)他オーディオやビデオの詳細は以下のリンクAudioPlayerインターフェースのリファレンスVideoAppインターフェースのリファレンスDisplayインターフェースのリファレンスDialogインターフェースのリファレンスセッション維持・終了の設定セッションを維持する場合は、上記responseBuilderで以下の対応どちらかを行えば良い。truewithShouldEndSessionは画面付き端末処理をするかどうかで等でデフォルト設定値が変化する。reprompt指定がない場合は基本的に明示的に設定するべき。(スキル審査でもひっかかる案件)userIdの取扱いAmazonアカウントのユーザーIDをキーにするが、スキルを有効化し直すと変化するらしいので、スキルごとのユニークキーっぽい永続アトリビュートは、永続ストレージ上でユーザーIDをプライマリキーとして保存されます。ユーザーIDはAlexaアプリのAmazonアカウントごとに一意ですが、ユーザーが一度スキルを無効化してから再び有効化すると変化するので注意が必要です。個人的に今後の発展性で考えているのが、UserIdのスキル間連携。スキルごとにユニークではなく、Amazonアカウント単位でユニークに取れる手法がないか模索。SDKのuserId取得箇所をいじったスキルをshowさんが作成しているのは、何かのとっかかりにはなるかも↓。上記ResponseBuilderのCard系のメソッドで設定スキルの応答にカードを追加するダイアログモデル必須スロットの要求スロット内容の確認インテント内容の確認などを設定に基づいて自動で組み込める。インテントで必須スロット情報なしで解釈されることもあるので、組み込んでおくとより安定しやすいかも。確認ダイアログは、確実性があがるけどやりとりが増えるので使い所を見極めたいところかも。dateとかも日本時間とずれる。https://qiita.com/nullian/items/39ecf1f6d0194b72e8e6一歩上の上のスキル開発Database連携(DynamoDB)ちょっと凝った便利系スキルを作ろうとすると案件にあがるのがDatabaseを利用したデータ保存。AWSのサービスであるDynamoDBが最も手近でやりやすいDB(な気がする)。Language)を使うと自分で画面表示カスタマイズ可能APLはイメージはHTML/CSSのAlexa版APLについては別途まとめてます。↑タイマーの経過時間発話に使おうと思えばいけないこともなさそう。リスト(やることリスト・買い物リスト)と連携Alexaの買い物リストとやることリストにアクセスするリスト操作が可能で、スマホ側で表示等の拡張した対応も。発話の音声調整ができるhttps://developer.amazon.com/ja/blogs/alexa/post/ff4f8bf0-4c86-4c5f-9c50-467816b0a017/jptraining6plus開発環境Nodejsでの開発環境構築についてのメモ。SDKは用意されており、同様に開発は可能。v2上でもろもろメモしてるAlexaスキルを作るためのNode.jsのSDK。TypeScriptで作成されており、Type情報等もあるので、TypeScriptで開発してもよし。以下の記事でわかりやすくSDKの特徴が解説されている。特徴を引用させていただくと以下の通り。SDKの特徴は、次のように列挙できます。CLI)スキルの新規作成、クローン、デプロイ等が行えるCLI。デプロイが楽ちんになるので、基本入れる。Skill開発AWSのアカウントや設定なしで、Lambda、DynamoDB、S3などが無料枠で勝手に使える超開発しやすくなるサービス。Skill開発を選択する。DBがっつり使ったり、すでにAWSをしっかり使ってるならそっちのほうがいいか。Alexa-hostedスキルを使用してスキルをエンドツーエンドで作成するNOIDノードエディタでプログラミング不要でスキル開発ができるサービス。無料枠を超えると月1万円~でちょっとつらそう。Alexa開発をお試しするにはいいのかも。Supportアメリカではじまった、赤ちゃんの行動記録系のサポートライブラリ。コメントをキャンセルメールアドレスが公開されることはありません。(1)お問い合わせタイトルとURLをコピーしました。