RailsでAPI作ってGoogle Home Miniに喋らせてみた


会社で技術発表の順番が回ってきた・・・
正直技術関係は苦手w

でもやるからには面白いことをやりたい!
ってことで、最近ちょっと気になっていたスマートスピーカー開発をしてみることにした

と雑談はこの程度で

今回使った最低限のもの

・PC(自分はmac)
・Ruby on Rails(gem grape)
・Googleアカウント
・Actions on Google
・Dialogflow(V2)
・Google Home Mini
・スマホ
・ネット環境

準備

・スマホのGoogleホームアプリからGoogle Home Miniをデバイス登録(これでアカウントが同期される)
dialogflowに登録

イメージ


何か間違ってるかもだけどたぶんこんな感じw
(Actions on Googleは後から気づいたので後付け・・・)

簡単手順(詳しく知りたい人は他のサイトを参考にしてください)

  1. Actions on Googleでプロジェクト作成
  2. 右下にあるconversationalを選択
  3. 呼ぶ名前を決める
  4. Actionの作成
  5. 自動でDialogflowが立ち上がるので、Agent(プロジェクトみたいなもの?)を作成する
  6. Intents(実際処理するところ)の作成を行う
  7. しゃべる内容(フレーズ)を設定する(複数設定可能)
  8. パラメーターの設定 フレーズの中で変数のように扱いたいものをなぞるとパラメーターが設定可能 必須にしたいならチェックを入れる (一応もう一つのフレーズのパラメーターもなぞっておいた)
  9. レスポンスの設定 パラメーターを利用していろんなパターンを返せる(返される会話はランダム)
  10. 試してみる

名前を設定してSAVE

右上でしゃべってみる

結果が返ってくることを確認

APIと連動

APIの用意

ざっくり書くとこんな感じ

  desc 'POST /api/qiita_sample/test'
  params do
  end
  post '/test' do
    # UTF-8を指定しないと文字化けで返って読み上げてくれない
    content_type 'application/json; charset=UTF-8;'

    ret = %w(サンプル テスト 本気 本物)
    prms = JSON.parse(request.body.read, symbolize_names: true)[:queryResult][:parameters]
    present fulfillmentText: "これが#{ prms[:any] }?これは#{ ret[Random.new.rand(0..3)] }です"
  end

重要なのはPOSTで作成して、

{ fulfillmentText: 'hoge' }

の形式で返すこと(Dialogflowのversionで変わるので注意。これはV2)

Dialogflowに戻る

  1. Fulfillmentを設定 Enabledにして、APIのURL(適当なやつだとダメみたい)を入力して右下のSAVE
  2. 先ほど作ったIntentsを選択
  3. 一番下にあるFulfillmentを有効にする(レスポンスは無視されるようになる) SAVEを忘れずに
  4. IntegrationsからSimulatorを起動 スイッチONしてTEST起動
  5. 自動でSimulatorが立ち上がるのでテスト

終わり

これだけで自分のGoogle Home Miniに話しかけると、Simulatorと同じように動かすことが可能!
設定したパラメーターをうまく処理してくれなかったりするので、本来はEntitiesなどを利用したほうがいいと思う

Dialogflowのバージョンが変わったばかりなのかネットにあまり情報がなくてすごい苦労しました。。。
V1が結構わかりづらいように感じたけど、V2はだいぶシンプルなので、今後バージョンがあがってもそれほど変更はないとは思うけど、動かなかった場合にはバージョンを注意するといいと思う