DialogflowとGoogleHomeを使って筋トレログアプリを作った

この記事は『LITALICO Engineers Advent Calendar 2021』の16日目の記事です。

今日は、DialogflowとGoogle Homeを使った音声入力で筋トレの記録をつけるアプリを作った話をします。

## 何を作ったか

タイトルのとおりですが、筋トレ後にGoogle Homeに

**「OK, Google. 筋トレログ開始 スクワット10レップ3セット」**

と唱えたら、スプレッドシートにその実績が記載され、
Githubの草のようなものを表示させてニンマリすることを目的としたアプリです。

**記録されたスプシ**
![スプ氏](//images.ctfassets.net/hxpvgdsklqwn/7xHUzUWgkAcUjkalLzlEhu/f204f611852b48a0686ee645137bf17f/____________________________2021-12-14_19.12.56.png)

**記録に基づく草**
![草](//images.ctfassets.net/hxpvgdsklqwn/6QySYezaEgGrguUT6ZZbnY/99fe8dfb74a14625a130b6bbec93f322/____________________________2021-12-14_19.12.16.png)

## なんで作ったか

コロナが始まってから、弊社でもリモートワークを前提とした業務がスタートしました。
リモートワークをやっていて、多くの方が共感するであろう問題として **運動不足** が挙げられます。

私もご多分に漏れず運動不足に陥りました。
肉体の衰えが精神の衰えにつながるかのように、
どんどん気持ちの落ち込みの加速を感じていたのです。

人間の脳は狩猟民族の時代からほとんど進化していないと言われていますが、
画面越しの人間と会話をし、コードを書き、ほとんどデスクから動かずに一日が終わるなど、
**本来の人間のあるべき姿からはかけ離れており、調子を崩すのも当然です。**

また、質の高いアウトプットには高い集中力が必要ですが、
高い集中力を生み出すのは良質な肉体です。
つまり**良いコードは、良い筋肉から生まれる**と言っても過言ではないのです。

**「このままではいけない・・・。運動習慣を取り戻さねば！！」**

という熱い情動に突き動かされ、運動の習慣づくりを支援するアプリケーションを作ることにしました。
(はよ筋トレしろ)

習慣をつけるのは人それぞれのやり方があると思いますが、
自分の場合は記録をつけて振り返るというのが最も効果があった施策なので、

**「筋トレ実績の記録を楽しく、簡単にできる！」**

をテーマに記録アプリを作ることにしました。

## なぜ音声入力か？

自宅にGoogleHomeがあり、日常的に使用していた事が前提としてありますが、

**アプリを開かず即座に記録ができる**

というのが一番の理由です。

筋トレで追い込んだあと、事務作業とかしたくないです。
汗かいた体で椅子にも座りたくないし、スマホの画面も汗でスワイプうまく動きません。

また、記録もすごく複雑な内容ではなく、タイムスタンプ+αのメタデータ程度でよいので、手と目を使ったUIなどオーバースペックです。

何より、

**「Ok, Google」**

の一言で記録が始まるの**どう考えてもスマートだなと。かっこいいなと。**

そういう理由で音声入力をベースにしました。

## Dialogflowって何

音声入力のタスクを実現するにあたって、今回はDialogflowを使用しました。

[Dialogflow](https://cloud.google.com/dialogflow/docs)は、Googleが提供する自然言語理解プラットフォームです。
会話形のUIを簡単に設計でき、Web・モバイル・botなどの外部の音声応答システムと簡単に統合できるサービスです。
ノーコードでChatbotを作る際などによく使われている印象ですが、応用先の用途は多岐にわたります。

Dialogflowは、エンドユーザーからの入力内容を分類し、Dialogflowのエージェントごとに定義された複数の **インテント** (ユーザーがやりたい事をまとめた意図を表すデータ)を結合し、エンドユーザーからの入力内容とマッチングします。

![intent-match-forecast](https://cloud.google.com/dialogflow/es/docs/images/intent-match-forecast.svg)

基本的なインテントには以下の要素が内包されており、エージェントはユーザーの入力にマッチするインテントとそれに対応するアクションを実行し、定義されたレスポンスを返します。

* **トレーニングフレーズ**
  * エンドユーザーの発言に含まれる可能性のあるフレーズのサンプル
  * エンドユーザー表現がこれらのフレーズのいずれかと似ている場合、Dialogflowによってインテントがマッチされる
* **アクション**
  * 各インテントに対するアクションが定義できる。
  * インテントが一致すると、Dialogflowによってシステムにアクションが提供される。
* **パラメータ**
  * 実行時にインテントが一致した際に、エンドユーザーの入力情報から抽出された値をパラメータとして提供
  * 日時、場所、人名など定義した値を構造化データとして使用できる
* **レスポンス**
  * テキスト、音声、視覚的なレスポンスなど、ユーザーに返却するレスポンスを定義
  * 入力内容の詳細の質問をしたり、会話を終了するなど

以下がインテントのマッチングとエンドユーザーへのレスポンスの基本フローです

![intent-match-respond-basic](https://cloud.google.com/dialogflow/es/docs/images/intent-match-respond-basic.svg)

インテントのマッチング後のアクションは、slackやGoogleChatなど主要なサービスへのインテグレーションが用意されており、
webhookを利用して自前のシステムと連携することも簡単に行うことができるので、任意の環境で簡単に会話形UIを構築することができるのです。

Dialogflowの詳細内容は、公式ドキュメントや詳しくかかれたブログ記事などがあるためそちらにまかせて省略することにします。

[参考: 公式ドキュメント](https://cloud.google.com/dialogflow/es/docs/basics)
※ DialogflowはDialogflow ESとDialogflow CSという2サービスがありますが、今回はESを使っています。

## システム構成

システムの構成は以下です。

記録をして内容を眺めるというユースケースのみなので、
今回はGoogleSpreadsheetとGASを使って作ったサーバーレスAPIと、
Dialogflowを連携させることでやりたい事を実現しています。

![DialogflowとGoogleHome連携の構造](//images.ctfassets.net/hxpvgdsklqwn/2kMaoXR1BhHnik5OLuwvcH/84f323eb3f2e409d63ebfc71e3150fa0/____________________________2021-12-14_18.45.47.png)

もっとかゆいところに手を届かせたくなったら、自前のWebアプリと連携させるなどしてもよいのかもしれませんが、サクッと作るにはこれで十分。

## 筋肉記録の流れ

Google Homeへ「OK, Google」してから記録完了までの具体的な流れを書いてみました。

![音声入力フロー](//images.ctfassets.net/hxpvgdsklqwn/6xuhiBIKvRUmpzR01vWIiX/5976fcd85d7742179de361698d0d4f32/____________________________2021-12-14_18.45.56.png)

こんな感じで、GoogleHomeに伝えた音声情報を、Dialogflowが認識、インテントとマッチングすることで、応答やGoogle Spreadsheetへのやり取りを行っています。

今の所は、記録を開始した日時のタイムスタンプ、実施した種目、具体内容という3種類の項目を記録できるようにしていますが、
レップ数やセット数などを個別の構造化データとして記録できるようにしたり、
「ベンチプレス 10レップ3セット、ダンベルフライ 10レップ3セット」のように、一度に複数種目の記録に対応するなど、
工夫次第でどんどん便利にできるのでDialogflowは奥が深いです。

## 使ってみてどうだったか

このアプリを作ってからまだ1週間ほどしか経過していませんが、
**音声記録したいが為に筋トレするまである。**
くらいには、ほぼ毎日何かしらトレーニングを行っているので、この記録アプリはひとまず成功したといえるでしょう。
楽しいんですよ、記録が。

今後の展望としては、筋トレの記録ついでに自分のコンディションを記録できると良いかもしれません。
体の調子や精神的な調子が、筋トレの実績とどのように関連しているのかを把握できると良いですよね。
Fitbitなどの生体情報のログと連動するなども良さそうです。

また、Googleカレンダーに筋トレスケジュールを記載しておいて、予定と実績との乖離が発生したら、GoogleHomeからお叱りを受けるなど、
より継続性を高める施策も検討したいですね。

スマートスピーカー楽しいなぁ。

## おわりに

Dialogflowとスマートスピーカのコンボはかなり優秀で、日常行っている任意のタスクをスマートスピーカー経由で実行できるようになるのがイケすぎてて脳汁が出ます。

真面目な業務での応用でいうと、福祉施設向けに提供(自社・他社含め)での支援記録の音声入力対応なんかもチャレンジできるかもなと考えています。福祉業界に特化した自然言語処理プラットフォームを作るなど、夢が広がりますね。

ということで、本記事はこれにて終了。

明日は [@sakagurachan](https://qiita.com/sakagurachan)さんがなにか書いてくれるみたいなので、是非見てみてください。