AlexaにAWSの最新Feedを読み上げてもらう(Lambda Python)
年末にAmazon Echo Dotを購入しましたので、練習がてらAlexaスキルを作ってみました。
Alexaスキルを自分のEchoで使うためにやるべきことは2つです。
- AWS Lambdaで関数を作成する。
- Amazon Developer Consoleでスキルを設定する。
今回はやっていませんが、審査に通って公開すれば日本のすべてのEchoで使用することも出来ると思います。
目次
Alexaスキルの概要
AlexaにFeedlyでタグ付けしているFeedのタイトルを読み上げてもらいます。
タグはAWSか、全てかのいずれかです。
AWS Lambdaで関数を作成する
- ランタイムはPython3.6です。
alexa-skill-kit-color-expert-pythonを元に必要な箇所だけ書き換えて作成しました。
ソースコードはこちらGitHubにあります。
トリガーはAlexa Skills kitを選択します。
環境変数
FeedlyのAPIを使っているのでFeedlyのユーザーIDとトークンが必要です。
FeedlyのAPIについてはこちら「feedlyでタグ付けした記事を自動でメール配信する」や
「Feedlyのフィードを自動でSlackへ投稿する(AWS Lambda , Amazon DynamoDB)」をご参照ください。
- FEEDLY_ID : FeedlyのユーザーID
- FEEDLY_TOKEN : Feedlyのトークン
- FEED_COUNT : 記事の件数
- INTERVAL_DAYS : 過去何日前までを対象とするか
- LOG_LEVEL : ログ出力レベル
- ERROR_SLACK_URL : エラーを出力するSlackのURL
- ERROR_SLACK_CHANNEL : エラーを出力するSlackのチャンネル
コード
ほとんどサンプルのままですが、理解したことを書きます。
1 2 3 4 5 6 7 |
if event['request']['type'] == "LaunchRequest": return on_launch(event['request'], event['session']) elif event['request']['type'] == "IntentRequest": return on_intent(event['request'], event['session']) elif event['request']['type'] == "SessionEndedRequest": return on_session_ended(event['request'], event['session']) |
- リクエストのeventの[‘request’][‘type’]に発言に基づくタイプが文字列で入ってくるのでそれに応じて、レスポンスを返すようにコードを書きます。
- スキルが最初に呼び出されたときはLaunchRequestで、Amazon Developer Consoleで設定されたインテントからのリクエストはIntentRequestになるようです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
def on_intent(intent_request, session): logger.info("on_intent requestId=" + intent_request['requestId'] + ", sessionId=" + session['sessionId']) intent = intent_request['intent'] intent_name = intent_request['intent']['name'] if intent_name == "OtherNewsIntent": return get_feed_speech(intent, session, '0mail') elif intent_name == "AWSNewsIntent": return get_feed_speech(intent, session, 'aws') elif intent_name == "AMAZON.HelpIntent": return get_welcome_response() elif intent_name == "AMAZON.CancelIntent" or intent_name == "AMAZON.StopIntent": return handle_session_end_request() else: raise ValueError("Invalid intent") |
- インテントからのリクエストは発言に応じて設定さいたインテント文字列がevent[‘request’][‘intent’][‘name’]にあるのでそれで判定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
def build_speechlet_response(title, output, reprompt_text, should_end_session): return { 'outputSpeech': { 'type': 'PlainText', 'text': output }, 'card': { 'type': 'Simple', 'title': "SessionSpeechlet - " + title, 'content': "SessionSpeechlet - " + output[0:7000] }, 'reprompt': { 'outputSpeech': { 'type': 'PlainText', 'text': reprompt_text[0:7000] } }, 'shouldEndSession': should_end_session } def build_response(session_attributes, speechlet_response): return { 'version': '1.0', 'sessionAttributes': session_attributes, 'response': speechlet_response } |
build_speechlet_responseは、ほぼほぼサンプルのままですが、outputとreprompt_textを7001文字で切るようにだけしてます。
これは、8000文字制限があるようなので余裕を持たせてそうしてます。
厳密な検証はしてません。
スキルを呼び出してから、Alexaと会話形式でつなげていきたい場合は、sessionAttributesを使えば、前の応答から次の応答へ値を引き渡すことが出来そうです。
Amazon Developer Consoleでスキルを設定する
日本のアカウントに紐付けているAmazon Echo Dotで使うため、Amazon Developer Consoleにamazon.co.jp(日本のamazon)のアカウントでログインします。
[Alexa Skills Kit]を選択します。
[新しいスキルを追加する]をクリックしました。
言語は[Japanese]、スキル名を任意で、呼び出し名はスキルを呼び出すときの文字を入力しました。
次にインテント(対話モデル)を設定します。
Intentsの[add]ボタンから作成します。
まず、AWSのfeedを読み上げるようのインテントを作成しました。
このインテントが発動するときに発言されるであろうメッセージパターンを文字列で入力していきます。
AWSのようなアルファベットの略語は「a w s」と半角スペースで区切ればいいようです。
もう一つAWSに縛らないfeedを読み上げるようのインテントも作成しました。
インテントが作成出来たら、[Save Model][Build Model]でビルドしました。
Amazon Developer Consoleには[Configration]ボタンから戻れました。
先ほど作成したAWS Lambdaのarnをエンドポイントのデフォルトに入力しました。
これで設定が完了しました。
テキスト入力でコンソール上からテストをしてみます。
うまくメッセージが返っているようです。
実機でテストしてみる
Alexaアプリで確認してみると作成したスキルが一覧に表示されています。
話しかけてみました。
予定どおりの動作をしました。
Alexaアプリにも動作記録が残りました。
AWS Lambdaを使って簡単にスキルを作成することが出来ました。
いろんな企業が提供しているAPIやインターネット上の情報を使って、情報提供をしたり、Lambdaから実行出来るアクションを声で操作したり、というようなユースケースであれば、サービスとして色々展開出来そうです。
【嵌ったこと】Amazon Developer Consoleでamazon.comのアカウントでログインしてしまって嵌りました
自分の場合はamazon.comとamazon.co.jpで同じメールアドレス、パスワードを使っていたので、Amazon Developer Consoleにログインしたのがamazon.com扱いになっていました。
なので、amazon.co.jpに紐付けているAmazon Echo Dotでアプリ一覧に出なくて、使えなくて理由がわからなくて少し嵌りました。
amazon.co.jpのパスワードを変更して、Amazon Developer Consoleに改めてログインして設定をやり直して無事使えました。
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。

「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。

「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。

「AWSではじめるLinux入門ガイド」という本を書きました。


開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
-
kintoneに登録されたアカウントの電話番号にGoogleカレンダーの予定をAmazon Pollyが読み上げてTwilioから電話でお知らせする(AWS Lambda Python)
Google Calendar Twilio Reminder Googleカレ …
-
-
CodeDeployでECR、ECSにデプロイするパイプラインのチュートリアル
チュートリアル: Amazon ECR ソースと、ECS と CodeDeplo …
-
-
Systems Manager パッチマネージャでベースラインを作成して適用する
ベースラインの作成 Systems Managerのパッチマネージャーでパッチベ …
-
-
AWS Systems Managerパラメータストアで「Parameter name must be a fully qualified name.」
パラメータストアでパラメータ階層を作成しようとして、パラメータ名に例えば「wor …
-
-
Amazon Location Service入門ワークショップ-マップの操作
関連記事 Amazon Location Service入門ワークショップの前提 …
-
-
PyCharmにAWS CloudFormationプラグインをインストールして入力補完してみる
JetBrainsのPython統合開発環境(IDE)のPyCharmを1年ちょ …
-
-
GoogleフォームからAPI Gatewayで作成したREST APIにPOSTリクエストする
「API GatewayからLambdaを介さずにSNSトピックへ送信」の続きで …
-
-
ブログの画像を別アカウントのS3に移動するためにIAMロールでクロスアカウントアクセス
ずっと先延ばしにしていたのですが、このブログの画像はEC2から直接配信しています …
-
-
ALBにWAFを関連付けて特定のヘッダー以外はブロックする
おかげさまで、ブログのアクセスも増えてきて、t3.nano EC2インスタンス単 …
-
-
EFSのマウントターゲットがデフォルトで作成されるようになってました
ひさしぶりにAmazon EFSファイルシステムを作成しました。 作成手順がすご …