hey Product Blog

こだわりを持ったお商売を支えるプラットフォーム「STORES」の開発チームによる技術ブログです。

フィットネスゲームの消費カロリーを Google Drive API を使った OCR 処理で自動記録しました

こんにちは。
STORES でバックエンドエンジニアをしている id:phayacell です。

いきなりですが、弊社にはテクノロジー部門のレビュー会という月次イベントがありまして、そこで「毎日のフィットネス記録を自動化した話」というテーマでライトニングトーク(LT)をさせていただきました。

f:id:phayacell:20220405162339p:plain

本記事は、その発表内容をブログ向けに編集したものです。
LT で発表した内容より少しだけ詳しく書いて、タイトルもリライトしました。

まず「テクノロジー部門のレビュー会って何なの?」という説明からさせていただきます。

hey はあたらしい仲間がどんどん増えており、エンジニア組織であるテクノロジー部門の人数は、業務委託の方も含めると100名をゆうに超える人数になってきています。

これだけの人数の組織になると各プロダクト・チームのことを知るのが難しくなってくる課題もあり、テクノロジー部門としてその月にあったリリースやイベントを振り返ったり、お互いのことを知ったり、労い合ったりすることを目的にした「レビュー会」という取り組みを実施するようになりました。

このレビュー会の中に LT 枠が設けられており、技術に関することでもそうでなくても良い好きなテーマで LT をできます。
2021年末にその枠組みを使って LT をさせてもらったのが「毎日のフィットネス記録を自動化した話」です。

対象読者は、日常のちょっとした手間を自動化することについて興味のある方です。
もしくは hey のエンジニアがやっているプライベートなことに興味がある人にも楽しんでいただけるかな〜と思っています。

緩めな記事ですので、気軽な気持ちで読んでいってください。

はじめに

さて、本題です。

本記事では「頻繁にやっていてちょっと手間なこと」を自動化してみた紹介をさせていただきます。
タイトルのとおり、わたしがやっているフィットネスゲームの消費カロリーの記録を自動化してみました。

世の中には便利なツールがたくさんあり、巨人の肩の上に乗ることで非常にかんたんに自動化の仕組みを作ることができます。
そのため内容は初学的なのですが、そういう使い方ができるんだなと気づいてもらえたり、「楽しそうだな」「やってみたいな」なんて思ってもらえることが、この紹介のゴールとなります。

こういった小さな自動化はアイデア勝負みたいなところがあると思っていまして、先述のとおり作り方はとても簡素化されてきているため、自動化できることに気づければほぼ完成くらいのニュアンスですね。

なので、概要レベルで「こんなことができるよ」という紹介までとさせていただければと思います。

Google Apps Script?

本記事で紹介させていただく自動化は Google Apps Script を使っています。
他にも使っているサービスはあるのですが、主要な部分は Google Apps Script が担っています。

Google Apps Script は Google プロダクトに繋ぎこむのがかんたんというメリットがあります。

A cloud-based JavaScript platform that lets you integrate with and automate tasks across Google products.

今回の自動化では、このメリットを大いに享受しました。

わたしの日常を構成する要素

では、自動化対象のフィットネスゲームについてのお話です。

わたしはフィットネスゲームを毎日やっています。
主に Nitendo Switch で「リングフィットアドベンチャー」と「フィットボクシング」をやっています。

リングフィットアドベンチャーは、本記事の記載時点で588日継続中です。
フィットボクシングは、シリーズ1からはじめていたので、シリーズ通算615日継続中です。

これだけ継続していますので、わたしの日常を構成する重要な要素となっています。
日常を占めるウェイトとしても相当量ありますので、自動化を取り入れる格好の標的というわけです。

フィットネス記録の自動化

もう少し掘り下げますと、こちらが毎日やっているフィットネスの一覧になります。

f:id:phayacell:20220405145329p:plain
毎日こんなフィットネスをしています

この中での自動化対象は、2と3のゲームのところです。
プレイ後のリザルト画面に消費カロリーが表示される機能がありまして、この記録を自動化しました。

消費カロリー記録の自動化

運動は生活習慣の改善ですが、改善と言えば計測(記録)から始めよ、ですね。

記録先は Apple のヘルスケア App にして、データを集約したいと考えました。

自動化 Before / After

早速ですが、こちらが自動化した結果の Before / After になります。

f:id:phayacell:20220405145407p:plain
自動化 Before / After

比較して、分単位のコスト削減が実現できています。
これが毎日のことですから、やっぱりコストパフォーマンスは抜群です。

自動化フロー / 図・説明

この結果をもたらした自動化を実現したフローについては、以下のように構成しました。
かんたんな図と説明を載せておきます。

f:id:phayacell:20220405145437p:plain
自動化フロー / 図

自動化フロー / 説明

  1. Nintendo Switch でキャプチャーしたリザルト画面を Twitter に投稿します
  2. Twitter に投稿した内容は Google Apps Script が Twitter API を使って取得します(トリガーによる定期実行)
  3. 投稿内容から画像を取得して Google Drive および Docs の機能を使って OCR 処理をかけます
  4. OCR 処理結果によって文字列で扱えるようになりますので、消費カロリーなどの記録用情報を抽出します
  5. その情報を IFTTT 経由でヘルスケア App に連携します

自動化フロー / スクリプト

細かい部分は省略しますが、肝要な部分のスクリプトはこんな感じです。

const activities = tweet.medias.filter(e => e.type === 'photo').map(photo => {
  const blob = UrlFetchApp.fetch(photo.url).getBlob()
  const file = Drive.Files.insert({ title: photo.url, mimeType: MimeType.JPG }, blob, { ocr: true, ocrLanguage: 'ja' })
  const text = DocumentApp.openById(file.id).getBody().getText().replace(/\s/g, '')
  Drive.Files.remove(file.id)

  const isRingFitAdventure = text.match(/本日の運動結果/) && text.match(/kcal/)
  const isFitBoxing2 = text.match(/TotalResult/)
  const isActivity = isRingFitAdventure || isFitBoxing2

  return isActivity ? new Activity(tweet, text) : null
}).filter(e => e)

Twitter API で画像 URL を取得できますので、画像の blob を取得します。
Drive に File insert するときのオプション指定で OCR 処理してくれる機能があり、これがこの自動化における肝です。

Drive.Files.insert(..., { ocr: true, ocrLanguage: 'ja' })

としている箇所ですね。

結果は Google Docs ファイルとして Drive に格納されますので、テキストを抜き出しています。
処理結果のテキストの精度はまあまあなので、余計な空白文字を除去してから正規表現で判定したり、上記コード外ですが消費カロリーを抜き出してたりしています。

たったこれだけのソースコードで、リザルト画面のスクリーンショットから消費カロリーを抽出し、テキストデータとして扱うことができるようになりました。便利ですね。

これは Drive API を使っている処理になりますので、ドキュメントのリンクを貼っておきます。

developers.google.com

自動化フロー / 結果

このスクリプトによる処理の結果、下図のようにヘルスケア App に取り込むことができました。

f:id:phayacell:20220405170531p:plain
自動化フロー / 図

運動時間・消費カロリーが記録されていますね。
図にあるヘルスケア App の表示は省略されていますが、消費カロリーの小数点以下も記録されています。

自動化して得られたこと

この自動化をして、得られたことがいくつかあります。

  • かんたんに運動量を記録できて、モチベーション継続
  • 別途、摂取栄養素も記録しているので、摂取 / 消費のバランス管理もかんたんになりました
  • Twitter で継続日数が可視化されるので、たまに「こんなにやっていてすごいですね」って褒められるようになりました

最後は副産物的な効果ですが、地味に嬉しいやつだったりします。

自動化って、良いですね。

おわりに

他にも自動化をしていまして、いずれもとっても楽しいです。

たとえば、こんなことをやっています。

  • FFXIV のレイド予定調整を Sheets / Discord で楽ちん通知
    • スプレッドシートで出欠管理して、予定調整結果を Discord に自動投稿してくれるものです
    • 直近のレイド攻略で役立ってくれています
  • 翌営業日の予定を自動投稿してくれる「明日の予定を教え太郎」
    • Google Apps Script で CalendarApp を使って、土日祝日を考慮した営業日の判定をしています
    • 次のおしごとの日がどんな予定なのか Slack の times に投稿して教えてくれるので、とても覚悟ができます
  • 室温が一定の範囲外になったら自動的にエアコン運転制御
    • これは SwitchBot を使ったノーコードの自動化です
    • 夏や冬のように空調が必要な季節で重宝しています
  • GPS で外出・帰宅を検知して電気・家電の電源を自動操作
    • これは iOS ショートカットによる位置情報をトリガーとしたノーコードの自動化です
    • お出かけ前、お出かけ後のちょっとした手間を削減してくれています

さまざまな日常のことを自動化して、日々の体験がとても良いです。

こんな LT もやっているヘイ株式会社では絶賛採用活動中です。ご応募をお待ちしております。