要点 


SiriとGoogle Apps Scriptを用いて、Siriに話しかけて対話的に音声で質問に答えていき、その結果をGoogle SpreadSheetにログとして保存する仕組みを作りました。

下記のデモはSiriに話しかけて体調不良度を0〜5で音声入力し、0でなければ症状を追加で音声入力するものです。更新結果が表示されるまでは手動操作をしておらず、全て音声のみで操作しています。

Tool

はじめに 


自身の体調のこまめな記録は体調管理をする上で非常に役に立つ反面、アプリを毎回開いて入力する手間や、そもそも自分に合ったアプリを探すのが大変です。

また入力の手間やアプリの相性によっては三日坊主にすらならないほど短期間で辞めてしまうこともあり、自分にあった体調情報の記録はなかなか習慣化しにくいものです。

そこでSiriとGoogle Apps Script(GAS)を利用して、Siriと対話することでその情報をGoogle SpreadSheetに保存することにしました。

Siriを使うことでHey Siriと話しかけて記録する事ができるため、朝のウトウトしていて携帯を開く気力がないときですら記録が出来る手軽さがあります。

GASを利用して自分好みの情報をSpreadSheetに保存することが出来るため、後で記録を元に好きに分析等をしやすいです。

また今回はユースケースとして体調管理にしましたが、薬の服用記録や朝食に食べたパンの数の記録など応用の幅は広いです。

使用するのはiPhoneとGoogleアカウントのみで料金がかからず、無料で出来るので非常に敷居が低いです。そうiPhoneならね。

というわけで今回やった仕組みの概要と、ベストプラクティスなどを書いて行こうと思います。

前提知識 


今回はSiriと2018年末にAppleからリリースされたアプリ『ショートカット』とGASとSpreadSheetを利用します。

ショートカットは聞き覚えのない人も多いと思いますのでリンクを見ていただきたいのですが、ざっくりいうとユーザーがiPhone上で行う複数の動作を一連の流れとして実行することが出来るアプリです。公式では【海の波情報を取り込み、ビーチまでの所要時間をチェックし、サーフミュージックのプレイリストを再生する、という「サーフタイム」ショートカットを構築できます。】という説明がなされています。ここでポイントなのが、ガジェットやアプリ同士を起動させてガチャガチャやるだけではなく、極めて自由度が高いということです。

変数を設定出来るだけではなく、iPhone上からsshを利用することまで出来るので本当に面白いと思います。残念なことにまだエンジニア界ではアプリ自体が広まっておらず、ガジェットブロガーの方は意外とショートカットを知っていたりするのですが、プログラマライクな変数の利用に慣れていらっしゃらない印象があり、まだまだ開拓余地が残されたアプリと感じます。

ショートカットについて別の説明をするのであれば、分かる人にしか分からない説明ですが、MITメディアラボが開発したScratchのようなビジュアルプログラミングでエージェントのタスクを作成するアプリです。

Google Apps Script(GAS)にも触れておきますと、GoogleのDocumentやその他のサービスに対してスクリプトを書くことで処理出来るというものです。AWS経験者向けに分かりやすく言うと、信頼性は下がるもののGoogleのアカウントさえ持っていれば誰でも利用可能で無料なAWSのlambdaです。データソースが主にGoogleの各サービスになるイメージです。

仕組み 

  • Siriによってショートカットの起動、及び対話的に音声入力を行います。
  • ショートカットでは一連の動作を定義します。Siriを利用してユーザからどういった情報を取得するか。どういうアクションを行うか。ビジュアルプログラミングを行い、動作を定義します。
  • GASではショートカットによってiPhoneから送られてきたHTTP RequestをWebServerとして処理を行い、処理結果をSpreadSheetに書き込みます。
  • SpreadSheetではGASから書き込まれたデータの保持を行います。

一連の流れをぽんち絵で表すと下記のような感じです。

ポンチ絵

今回紹介したのは音声入力方式ですが、声を出しにくい時用にSiriを利用しない手動入力バージョンもあります。

ベストプラクティス 

GAS 

Local開発のすすめ 

ショートカットから送られてきたデータに対してそのままExcelに流し込んでも気にならない人であれば、ブラウザ上のエディタで事足りますし直ぐに終わります。 しかしバリデーションや色々と処理を追加していきたいのであれば、グーグルが作成したGASローカル開発用CLIのclaspを利用し、慣れた自身のエディタで開発することを強くおすすめします。私はTypescriptとVSCodeを利用して開発するようにしました。というのもやはりブラウザ上のエディタは機能が貧弱ですし、GASはJavascriptライクな言語ですが、Javascriptの最近のSyntaxが使えないので、モダンなSyntaxをよく使う人にはかなり苦痛となります。

ショートカット 

なんちゃってモジュール化 

変数やIF文を利用しているとアクションが肥大化していきます。ただUI的に肥大化すると視認性・操作性が低いためフラストレーションがたまります。例えば新規のアクションを序盤に追加したいなどのときは、アクションをドラッグして画面上部に持っていき指を固定し、一つ一つアクションの上に移動していくのを眺めているしかありません。擁護するとしたら、さすがにビジュアルプログラミングをするのに、iPhoneの画面は狭すぎるということでしょう。ということで、なるべくなんちゃってモジュール化を意識して作ることです。

最初はなかなか気が付かなかったのですが、別のショートカットをショートカット中で呼び出すことが出来ます。また別ショートカットの結果を取得する事ができるので、一つのショートカットが肥大化することを抑えられます。なんちゃってモジュール化というのは、そのモジュールに対してパラメータを渡すことが出来ない(?)ので、汎用性に乏しいためです。

入力フォームの代替 

ショートカットは一連のアクションを自動化する役割がありますが、それと同時に入力フォームを気軽に作成することが出来る便利アプリでもありました。今までは入力フォームとしてわざわざアプリ作成やWebページを作ったりする必要がありましたが、ショートカットアプリを使えば簡単に代替とすることが出来ます。入力値に対し、正規表現によるバリデーションも可能なので、入力フォームのコモディティが加速したように感じました。自分用の入力フォームとして積極的に利用できますし、配布が用意になったらより実益が高まると考えています。

主要外部ライブラリ 

fullname star star/day created_at updated_at license language description url
epoberezkin/ajv 6,162 3.92 2015-05-19 2019-09-07 MIT License JavaScript The fastest JSON Schema Validator. Supports draft-04/06/07 link
google/clasp 1,778 2.77 2017-12-05 2019-09-07 Apache License 2.0 TypeScript 🔗 Command Line Apps Script Projects link

後は主な型定義として "@types/google-apps-script": "0.0.58" などを利用しました。

おわりに 


SiriとGASを用いて音声入力型の記録自動化を行いました。

ショートカットアプリはエージェントのタスク作成をユーザに対して一般開放したものと考えて良いです。例えばAmazonのAlexaではスキルという、ユーザーの入力に対する行動定義がありますが、AppleもSiriに対して類似の事をショートカットアプリで行えるようにした、という意味です。ただショートカットはあえてSiriを介在させる必要はなく、ただのアクションの一連実行として使うことが出来ます。

応用の幅は広く、一時期流行ったAmazonDashボタンによるIoT化がありましたが、それと同様のことがボタン押下を検知するコンピュータを必要としないためより簡易に出来ます。今後ショートカットを利用した面白いアイディアは、敷居の低さも相まってどんどんと出てくると思います。