検索
特集

Google HomeにRSSを読み上げさせよう:完成編特集:Google Homeプログラミングを始めよう(1/3 ページ)

Dialogflowの会話機能とAzure Functionsを組み合わせて、Azure Table Storageに保存したRSSフィードのデータを実際に読み上げさせてみよう。

Share
Tweet
LINE
Hatena
「Google Homeプログラミングを始めよう」のインデックス

連載「Google Homeプログラミングを始めよう」

 前回は、Google HomeにRSSを読み上げさせるための準備編として、Azure Logic AppsやAzure Functionsを使用してRSSフィードのデータをAzure Table Storageに保管した。このデータを今回は実際に読み出してみよう(以下、「Logic Apps」「Functions」のように「Azure」は省略して表記する)。

 実際の様子は次のような感じだ。

Google Home miniにRSSを読み上げさせてみた(コンテキストを利用)


 ここでは本フォーラム「Insider.NET」と「Windows Server Insider」フォーラムのどちらかを指定して、直近10件のフィードから何番目のものを読み上げるかを指定できるようにしている。

Azure Table Storageへのデータの追加

 前回作成したLogic Appsでは本フォーラムのRSSを決め打ちで読み出して、それをFunctionsに投げ、「insider.net rss feed item」というパーティションキーをやはり決め打ちで指定してAzure Table Storage(以下、Table Storage)に追加していた。これらを少し改変して、サンプルデータとして「Insider.NET」と「Windows Server Insider」の2つのフォーラムのデータをTable Storageに保存した。

 このとき、「Windows Server Insider」フォーラムのRSSフィードについてはパーティションキーを「windows server insider rss feed item」として保存することで、「Insider.NET」フォーラムと区別するようにした。

別々のパーティションキーで2つのフォーラムのデータを保存
別々のパーティションキーで2つのフォーラムのデータを保存

 なお、前回作成した最初のLogic Appsアプリの動作だが、後日、Logic Apps側から受け取ったフィードデータを正しくTable Storageに保存できたことを確認した。

 Azure Storage Explorerで実際に保存されているデータを一覧したのが以下だ。

Table Storageに保存されたデータ
Table Storageに保存されたデータ

 DialogflowとFunctionsを組み合わせて、ユーザーとGoogle Homeとの間で次のような対話を実現するのが今回の目的だ。

  • ユーザー:「.NETの3番目の記事は?」
  • Google Home:「Insider.NETの3番目の記事ですね。タイトルは……」
  • ユーザー:「5番目は?」
  • Google Home:「Insider.NETの5番目の記事ですね。タイトルは……」
  • ユーザー:「Windowsは?」
  • Google Home:「Windows Server Insiderの5番目の記事ですね。タイトルは……」

 以下では、このような会話を実現するために、Dialogflowでどのような設定を行うか、Functionsアプリ側ではどんなコードを書けばよいかについて見ていこう。

Dialogflowでの会話の設定

 これまでにも見てきたように、Dialogflowでは「インテント」と「エンティティ」の2つを利用して、会話を組み立てる。今回必要になるエンティティは「forum」と「index」だ。前者は「どちらのフォーラムかを判断する」ために、後者は「そのフォーラムの何番目の記事を読み上げるのかを判断する」ために必要となる。つまり、「<forum>の<index>の記事」とユーザーに指定してもらったら、必要なRSSフィードをTable Storageに格納されているデータからより分けて、読み上げデータをユーザーに返送する。「5番目は?」とか「Windowsは?」といったどちらかのエンティティが不足していた場合の処理については後述する。

 実際に作成した2つのエンティティを以下に示す(実際には「article」エンティティも作成したが、これについては何も使用していない)。

作成した「forum」エンティティ
作成した「index」エンティティ
作成した「forum」エンティティと「index」エンティティ
上がforumエンティティで、下がindexエンティティ。

 見れば分かるように、フォーラムやインデックスを判断するための語彙群を定めている。「ドットネット」「dotnet」などがあるのは、筆者が試したところでは「Insider.NET」という語をうまく認識してくれないことがあったからだ(トレーニングを行うことで、改善可能と思われる)。右側に列挙されている語をユーザーが入力すると、それらは左側にある「insider.net」「windows server insider」「first」「tenth」などの語として認識され、最終的にFunctionsアプリへと送信される。

 これらのエンティティを利用する基本のインテントとして作成したのが以下に示す「readout-forum-rss」インテントだ。

「readout-forum-rss」インテント
「readout-forum-rss」インテント

 [Training Phrases]セクションには上で述べた「<forum>の<index>」という形式に合致するようなフレーズを入力してある(「記事」がハイライトされているのは上で述べた「article」エンティティにマッチするようにしてあるからだ。ただし、その下の[Action and parameters]セクションを見ると分かるように、必須ではないし、Functionsアプリの側でも使用していない)。

 [Action and parameters]セクションでは、「forum」と「index」の2つが必須であること(左端のチェックボックスがオン)、指定がなかった場合に入力を促すプロンプトの定義を行っている(「何番目の記事ですか?」など)。ここで指定されたフォーラムとindexの値がFunctionsアプリに送信されるデータに含まれるので、Functionsアプリ側ではこれら2つの値からユーザーに返送するRSSフィードのデータを特定する。

 上の画像にはないが、[Fulfillment]セクションで[Enable webhook call for this intent]チェックボックスをオンにして、このインテントが実行された場合にはFunctionsアプリを呼び出すようにしておく必要もある。ウィンドウ左側(もしくはハンバーガーメニュー)に表示される[Fulfillment]を選択して、FunctionsアプリのURLを設定しておく必要もある(この方法については前々回の記事を参照してほしい)。

 基本となるインテントの設定については以上だ。次に、Functionsアプリのコードを見てみよう。

       | 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

ページトップに戻る