11
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Alexaで365スケジュール読み上げ機能をAutomateで作る

Last updated at Posted at 2021-02-03

#2021年4月29日 更新
スケジュールの開始時刻も読み上げるようバージョンアップしました。

#はじめに
###Amazon echo 使ってますか?
我が家は、家電のON/OFF、天気予報やニュースの読み上げ、食事や運転や睡眠中のBGM、fire tv stickとの連携・・・etc.
本格的なリモートワークにシフトした今では、生活には欠かせない必需品です。

そんなechoの頭脳ともいえるAlexaに、O365 の予定表を読み上げてもらうことで、いつでもどこでも、声だけでスケジュールの確認をしてみたいと思いつきました。

本ツール作成の作成には、Microsft MVPのJunichi Kodamaさん(@KodamaJn)の(1. Alexa スキル編) 買い物メモを Alexa から LINE に送信する仕組みを Power Automate で作るを大変、大いに参考にさせていただきました。
いつもありがとうございます

#概要
以下の構造で構成します。
image.png

①「スケジュールの確認」というスキルを作成し、AutomateへリクエストをPosting
②Automateフローでカレンダスケジュールを取得
③スキルに取得したスケジュールを読み上げるよう応答

実際にはこんな感じです。

それでは実際に作成していきます。

#Alexa スキルの作成

alexa developer consoleにて作成します。
Junichi Kodamaさん(@KodamaJn)の(1. Alexa スキル編) 買い物メモを Alexa から LINE に送信する仕組みを Power Automate で作るにて大変丁寧に解説されていますので、参考にスキルを作成してください。
ただし、今回は呼びかけと応答は1つのみですので、スロットの定義は不要です。
またサンプル発話も一つだけ設定しました。
image.png

スキルの呼び出し名も任意ですが、今回は「スケジュールの確認」としておきました。
image.png

#Automate フローの作成
Automateにて、365のスケジュールを取得し、Alexaスキルに応答するフローを作成します。
こちらも、Junichi Kodamaさん(@KodamaJn)の(3. Power Automate 編) 買い物メモを Alexa から LINE に送信する仕組みを Power Automate で作るにて丁寧に解説されていますので、参考にしてください。

全体像です。
image.png

###HTTP要求の受信時
トリガーに「HTTP 要求の受信時」を選択し、
image.png

image.png
「サンプルのペイロードを使用してスキーマを作成する」に下記を入力し、JSONスキーマの定義を作成します。

{
    "type": "object",
    "properties": {
        "version": {
            "type": "string"
        },
        "session": {
            "type": "object",
            "properties": {
                "new": {
                    "type": "boolean"
                },
                "sessionId": {
                    "type": "string"
                },
                "application": {
                    "type": "object",
                    "properties": {
                        "applicationId": {
                            "type": "string"
                        }
                    }
                },
                "attributes": {
                    "type": "object",
                    "properties": {
                        "locale": {
                            "type": "string"
                        }
                    }
                },
                "user": {
                    "type": "object",
                    "properties": {
                        "userId": {
                            "type": "string"
                        }
                    }
                }
            }
        },
        "context": {
            "type": "object",
            "properties": {
                "Viewports": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "type": {
                                "type": "string"
                            },
                            "id": {
                                "type": "string"
                            },
                            "shape": {
                                "type": "string"
                            },
                            "dpi": {
                                "type": "integer"
                            },
                            "presentationType": {
                                "type": "string"
                            },
                            "canRotate": {
                                "type": "boolean"
                            },
                            "configuration": {
                                "type": "object",
                                "properties": {
                                    "current": {
                                        "type": "object",
                                        "properties": {
                                            "mode": {
                                                "type": "string"
                                            },
                                            "video": {
                                                "type": "object",
                                                "properties": {
                                                    "codecs": {
                                                        "type": "array",
                                                        "items": {
                                                            "type": "string"
                                                        }
                                                    }
                                                }
                                            },
                                            "size": {
                                                "type": "object",
                                                "properties": {
                                                    "type": {
                                                        "type": "string"
                                                    },
                                                    "pixelWidth": {
                                                        "type": "integer"
                                                    },
                                                    "pixelHeight": {
                                                        "type": "integer"
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        },
                        "required": [
                            "type",
                            "id",
                            "shape",
                            "dpi",
                            "presentationType",
                            "canRotate",
                            "configuration"
                        ]
                    }
                },
                "Viewport": {
                    "type": "object",
                    "properties": {
                        "experiences": {
                            "type": "array",
                            "items": {
                                "type": "object",
                                "properties": {
                                    "arcMinuteWidth": {
                                        "type": "integer"
                                    },
                                    "arcMinuteHeight": {
                                        "type": "integer"
                                    },
                                    "canRotate": {
                                        "type": "boolean"
                                    },
                                    "canResize": {
                                        "type": "boolean"
                                    }
                                },
                                "required": [
                                    "arcMinuteWidth",
                                    "arcMinuteHeight",
                                    "canRotate",
                                    "canResize"
                                ]
                            }
                        },
                        "mode": {
                            "type": "string"
                        },
                        "shape": {
                            "type": "string"
                        },
                        "pixelWidth": {
                            "type": "integer"
                        },
                        "pixelHeight": {
                            "type": "integer"
                        },
                        "dpi": {
                            "type": "integer"
                        },
                        "currentPixelWidth": {
                            "type": "integer"
                        },
                        "currentPixelHeight": {
                            "type": "integer"
                        },
                        "touch": {
                            "type": "array",
                            "items": {
                                "type": "string"
                            }
                        },
                        "video": {
                            "type": "object",
                            "properties": {
                                "codecs": {
                                    "type": "array",
                                    "items": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    }
                },
                "System": {
                    "type": "object",
                    "properties": {
                        "application": {
                            "type": "object",
                            "properties": {
                                "applicationId": {
                                    "type": "string"
                                }
                            }
                        },
                        "user": {
                            "type": "object",
                            "properties": {
                                "userId": {
                                    "type": "string"
                                }
                            }
                        },
                        "device": {
                            "type": "object",
                            "properties": {
                                "deviceId": {
                                    "type": "string"
                                },
                                "supportedInterfaces": {
                                    "type": "object",
                                    "properties": {}
                                }
                            }
                        },
                        "apiEndpoint": {
                            "type": "string"
                        },
                        "apiAccessToken": {
                            "type": "string"
                        }
                    }
                }
            }
        },
        "request": {
            "type": "object",
            "properties": {
                "type": {
                    "type": "string"
                },
                "requestId": {
                    "type": "string"
                },
                "timestamp": {
                    "type": "string"
                },
                "locale": {
                    "type": "string"
                },
                "reason": {
                    "type": "string"
                }
            }
        }
    }
}

image.png

###スケジュールイベントの取得
Office 365 Outlookより「イベントのカレンダービュー」を取得を選択し、
image.png

自身の予定表を選び、開始時刻と終了時刻を入力します。
下記の設定ですと、今から1日間のスケジュールを取得します。

image.png

image.png

スケジュールを開始時間順で取得したいので、並び替えに"start/dateTime"を入力します。
image.png

###スケジュールの件名を取得
上記で取得した複数のスケジュールより、件名のみを取得します。
ここでも、Applay to eachを回避し、処理の高速化を図ります。
データ操作の選択を選びます。
image.png

開始には、イベントのカレンダービュー取得より、Value
マップには、予定の開始時刻と件名をセットします。
開始時刻は下記を入力してください。

concat(substring(convertTimeZone(item()?['start'],'UTC','Tokyo Standard Time'),0,10),' ',substring(convertTimeZone(item()?['start'],'UTC','Tokyo Standard Time'),11,5))

image.png

さらに、データ操作の参加を選び、
image.png
上記の選択の結果を「と」という文字で結合していきます。
image.png

###Alexaへ応答
要求の応答を選びます。
image.png

ヘッダーに

Content-Type
application/json;charset=utf-8

本文に

{
  "response": {
    "outputSpeech": {
      "text": "[結合の出力]",
      "type": "PlainText"
    },
    "reprompt": {
      "outputSpeech": {
        "text": "[結合の出力]",
        "type": "PlainText"
      }
    },
    "shouldEndSession": true
  },
  "version": "1.0"
}

を入力します。
image.png

#エンドポイントの取得
作成したフローを保存し再度開くと、トリガーのHTTP要求の受信時にある「HTTP POST の URL」の値をコピーします。
image.png

alexa developer consoleに戻り、エンドポイントを選択し、HTTPSを選択し、デフォルトの地域に上記のURLをペーストします。
さらに、「開発用のエンドポイントは、証明機関が発行したワイルドカード証明書をもつドメインのサブドメインです」を選択します。
image.png

以上で設定は完了です。

#まとめ
「あれ、この後のスケジュールって何があったっけ?」といった時に役に立つスキルだと思います。
必要なスキルは自分で作る、ぜひ実感ください。

11
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?