欲しいアプリは自分で作る!

Power Platform や Azure などを利用して作成した業務アプリや趣味アプリなどをご紹介します。

(1. Alexa スキル編) 買い物メモを Alexa から LINE に送信する仕組みを Power Automate で作る

「あ、あれ買わなきゃ!」って気付くのは、台所に立っている時が多い気がします。




どうも、じゅんじゅんです。


我が家は私も妻も LINE をよく利用しています。
頻繁に使うアプリということもあり、他者とのメッセージのやり取り以外にも、自分だけのグループを作成して買い物メモ代わりにしたりしています。

そんなある日、妻から
「料理とか皿洗いとかしている時でも簡単に LINE にメモできるようにしたい」
と要望があり、Alexa から LINE にメモを送信できるツールを作ってみました。


この処理はすべてノンコーディングで作成できますので、このツールの作り方をご紹介します。


全体像

このツールはこんな構造で構成されています。
ツールを動かすのに必要なものは、Alexa スキル、Power Automate のフロー、そして LINE の公式アカウントです。

f:id:jn-kodama:20200911213732p:plain


「ラインメモ」という Alexa スキルを呼び出して登録したいメモ情報を話すと、Alexa スキルが Power Automate の Webhook URL に POST リクエストを送信します。
Power Automate は POST リクエストをトリガーに、 以下の処理を実行します。

  • LINE に対して、公式アカウントから特定ユーザへ Push メッセージを送信するよう要求する
  • Alexa スキルに対して、「ラインメモを追加しました」と応答するよう要求する


各サービスで行う作業は以下の通りです。

サービス 作業
Alexa スキル メモ情報を受け付けるスキル「ラインメモ」の作成、Power Automate にアクセスするためのエンドポイントの設定
Power Automate LINE へのメッセージ送信と Alexa スキルへの応答を行うフローの作成
LINE 公式アカウントの作成


作成手順

データが流れる順番に、手順をご紹介していきたいと思います。
今回は、Alexa スキルの作成部分です。

Alexa スキルの作成

Alexa スキルの作成部分(および Power Automate 部分)は、ひらりんさん(@himarin269)の以下の記事を大いに参考にさせていただきました!
qiita.com

上記記事と重複する箇所が多いですが、重複も含め全工程を下記でご紹介します。


手順の前に…「スキル」「インテント」「スロット」とは?

Alexa スキルを作成するにあたり、以下の用語が登場します。

私はこの意味が分からずしばらくフリーズしていたので、先に解説しますね。

この言葉の意味は、こんなイメージで表現できると思います。
(あくまで私の理解ですので、相違があるかもしれません) f:id:jn-kodama:20200911223851p:plain


スキルは、機能全体を表します。既存のスキルでは、天気予報のスキルや、クイズのスキルなど様々あります。

インテントとは、そのスキルで実行したいアクションのようなものです。
家計簿の例のように、1つのスキルには複数のインテントを定義することができます。
アクションさせるためにはいくつか言い回しがあった方が使いやすいので、1つのインテントに複数の"サンプル発話"と呼ばれる文例を定義します。

スロットとは、アクションに必要とされる可変な内容のことで(今回でいうとメモをする中身)、それをスロットという変数のようなもので定義することができます。
図にあるように、アクションに必要な情報に可変な内容がないケースもありますので、スロットを持たないインテントもあり得ます。


これらを踏まえて、実際に手順を見てみましょう。


作成手順

  1. https://developer.amazon.com/alexa/console/ask にアクセスし、「スキルの作成」をクリックします。
    Amazon 開発者アカウントをお持ちでない方は、無料で作れますので是非。 f:id:jn-kodama:20200911213940p:plain

  2. スキル名に、実際に呼び出したい名前を入力します。
    今回は「ラインメモ」としました。 f:id:jn-kodama:20200911213947p:plain

  3. 「1.スキルに追加する~」が「カスタム」になってことを確認の上、「2.スキルのバックエンドリソースを~」で「ユーザー定義の~」を選択し、画面上部の「スキルを作成」をクリックします。 f:id:jn-kodama:20200911215113p:plain

  4. テンプレートが「Hello World」になっていることを確認し、「選択」をクリックします。 f:id:jn-kodama:20200911215121p:plain

  5. 少し待つと、スキルの設定画面(以下)に遷移します。
    スキルの呼び出し名は先ほどスキル名として設定したので、続いてメモを追加するためのアクションである「インテント」を設定します。
    「対話モデル」をクリックし、「インテント」をクリックします。 f:id:jn-kodama:20200911215516p:plain

  6. インテントを追加」をクリックします。
    なお、既存のインテントにはサンプル(Hello World)が含まれてますので、邪魔な人は削除して OK です。 f:id:jn-kodama:20200911224132p:plain

  7. お好きなインテント名を入力し、「カスタムインテントを作成」をクリックします。
    今回は、「LINEMemo」としました。
    なお、ここで入力したインテント名は、Power Automate の分岐処理で利用します。 f:id:jn-kodama:20200911224213p:plain

  8. 続いてサンプル発話を…となるのですが、先に画面最下部にスクロールしてスロットを登録しておきます。
    今回は、最大3つのメモを同時に登録できるようにするため、
    「slotMemoFirst」
    「slotMemoSecond」
    「slotMemoThird」
    の3つのスロットを登録します(数字は利用不可)。
    スロットの登録は、スロット名を入力し、右側の「+」をクリックすれば OK です。 f:id:jn-kodama:20200911224220p:plain 3つ登録しました。 f:id:jn-kodama:20200911224225p:plain

  9. スロットには、どのような値が入るのかを定める「スロットタイプ」というものを選択する必要があります(人名なのか、地名なのか、空港名なのか、食べ物なのか…)。
    今回は該当するものがないのですが、特に関係ないタイプを選んでも問題なく認識するようですので、適当に選択しておきます。
    なお、今回のように同じものを複数一括で指定するのはイレギュラーなのか、複数のスロットに同じタイプを選択することはできませんのでご注意ください。
    ということで、今回は適当に上から1つずつ選択しました。 f:id:jn-kodama:20200911224233p:plain これでスロットの登録は終了です。

  10. 続いて、サンプル発話を設定します。
    今回は、「●●を登録して」のように設定していきます。
    「{」を入力すると先ほどのスロットを選択できるようになりますので、スロットとそれ以外の言葉を以下のように入力します。
    入力したら、Enter で登録できます。 f:id:jn-kodama:20200911225104p:plain f:id:jn-kodama:20200911225110p:plain

  11. 自分が言いそうなフレーズ分だけ、お好きなように登録します。
    今回は最大3つまでメモしたいので、1つの時、2つの時、3つの時を分けて以下のように登録してみました。
    登録が終わったら、画面上部の「モデルを保存」をクリックし、「モデルをビルド」をクリックします。 f:id:jn-kodama:20200911225117p:plain

  12. 40秒ほど待つと、「完全ビルドが完了しました」と表示されます。
    続いてテストを行いますので、画面上部の「テスト」タブをクリックします。 f:id:jn-kodama:20200911225131p:plain

  13. まず、ステージを「非公開」から「開発中」に変更します。以後、この設定はこのままにしてください。 f:id:jn-kodama:20200911230008p:plain

  14. まずは、スキルを呼び出してみます。「ラインメモ」と入力し、Enter を押してみましょう。 f:id:jn-kodama:20200911230015p:plain

  15. Alexa から「Launch Request」と返ってくれば、ひとまずスキルの呼び出しは成功です。
    続けて「牛乳を登録して」などと入力してみて、返答内の「slotMemoFirst」の後に"牛乳"と表示されていれば、まずは1つのメモの認識はバッチリです。 f:id:jn-kodama:20200911230422p:plain

  16. 今度は2つのメモを。「牛乳と卵を追加して」などと入力してみて、返答内の「slotMemoFirst」に"牛乳"が、「slotMemoSecond」に"卵"が表示されていれば成功です。 f:id:jn-kodama:20200911230030p:plain

  17. 最後に3つのメモを。「牛乳と卵とチーズを登録して」などと入力してみます。
    …あれ?なぜか、2つ目のスロット「slotMemoSecond」に、"卵とチーズ"が登録され、3つ目のスロット「slotMemoThird」に何も入らない。 f:id:jn-kodama:20200911230037p:plain その後も色々やってみたのですが、「AとBとC」のように同じ等位接続詞(と)が続くと認識されないのか、うまくいきませんでした。

  18. そこで、今回は以下のように異なる等位接続詞を利用することにしました。
    登録済みのサンプル発話にカーソルを置き、2つ目の「と」を「そして」に変更。改めて「モデルを保存」と「モデルをビルド」をクリックします。 f:id:jn-kodama:20200911231610p:plain

  19. ビルドが終わったら、再度テストを行います。スキルを呼び出した後、「チーズと卵そして牛乳を登録して」などと入力してみて、各スロットにそれぞれ内容が入ったら成功です。
    成功したら、画面中央にある「JSON入力1」の中身を全選択し、コピーしておきます。この情報は、Alexa スキルから Power Automate に渡ったデータを解析するために必要になります。 f:id:jn-kodama:20200911231616p:plain


これで、Alexa スキルの作成はほぼ終了です。

Alexa スキルから Power Automate にアクセスするためのエンドポイントの設定が残っていますが、Power Automate のフロー作成後に行いますので一旦ここまでです。


参考:1つのスロットを複数回使用するとどうなる?

実は上記手順にたどり着く前に、「わざわざスロットを3つ使わなくても、1つのスロットだけでできるんじゃね?」と思い、実験していたのでした。
結論から言うと NG でした。

こんな感じで、1つのスロットを複数回使用すると… f:id:jn-kodama:20200911232341p:plain

こうなります。
スロットの値が JSON 上で配列になってくれることを期待したのですが、どうやら3つのメモ内容が文字列結合されてしまうようです。 f:id:jn-kodama:20200911232352p:plain


まとめ

本記事では、買い物メモを Alexa から LINE に送信する仕組みを Power Automate で作るための、Alexa スキルの作成方法について紹介しました。

次回は、Alexa スキルから Power Automate にデータが渡った先の、Power Automate のフローの作成方法について紹介します。


参考文献

手順内でもご紹介した、ひらりんさん(@himarin269)の記事です。Alexa に限らずスマートスピーカーのスキル開発にご興味ある方は是非ご一読ください。
(私が Alexa を活用するきっかけになった記事でもある) qiita.com