🔊watchOS 6の騒音レベルとともにライブを振り返る ~ 心拍数もあるよ ~

ばんじゅんです。最近はZOZOTOWNiOSアプリの実装のリアルと技術的に向き合うお仕事をしています。この記事はZOZOテクノロジーズ #2 Advent Calendar 2019の12日目の記事です。昨日の記事はymd_aaaさんの「SpringAnimationを気軽に使おう」でした。こちらの記事も是非ご覧ください。

これまでのあらすじ

banjun.hatenablog.com

アイマスライブをはじめとしていくつかのライブにApple Watchを付けていって、心拍数を記録し、ログをみて振り返りをしたり、1年後のライブBlu-rayの発売後にそれを再生しつつ同時刻の心拍数グラフを重ねて表示するためのライブラリ banjun/YesBDTimeやそのアプリmzp/HeartVoiceを作成した。

今年の試み

Apple Watch Series 4 + watchOS 6では、耳の健康(ヒアリングヘルス)を守るために、騒音レベル(またはノイズレベルやAudio Exposureと呼ばれる)の測定と警告通知の機能が搭載された。この騒音レベルはHealthKitに記録され、ヘルスケアアプリで見ることができるし、APIから取得もできる。

support.apple.com

Apple Watch を装着している間は、Apple Watch が一日を通して騒音レベルを定期的に測定します。これにはマイクを使いますが、音声の録音や保存は行いません。

ライブ会場で常時録音機能があると、持ち込みのレギュレーションに心配があるが、Appleの公式仕様によれば録音機能を持たないので安心である(※私が安心と思っているの意でありいずれかの組織の確認が取れた情報ではありません)。

ヘルスケアアプリで見るとdBで細かく記録されているが、概要レベルのグラフしか見ることはできないので、HealthKitのAPIを利用して騒音レベルを全て取得し、ライブが開催されていた時間帯について、心拍数のグラフと騒音レベルのグラフを並べて表示してみたい。

データ収集

各地でライブに行ってデータ収集をしていたが、ここではTHE IDOLM@STER CINDERELLA GIRLS 7thLIVE TOUR Special 3chord♪のツアーの幕張・名古屋の計4日間のデータを使用した。チケット連番で現地に連れていってくれたり余らせたチケット連番を受けてくれた方々に感謝します。

f:id:banjun:20191211003114j:plain
千葉公演 Comical Pops!の会場となった幕張メッセ国際展示場 9-11ホールにて(背景はZOZO・ZOZOテクノロジーズ(幕張オフィス)の入居するビル)

開発 ~ アイマスハッカソンにて ~

imas.connpass.com

12/7(土)にアイマスハッカソン2019 in 関東 があったので、その場で開発した。レポジトリは前回心拍数を取得してMacに送るために開発した banjun/DOKIDOKI-Rhythm

f:id:banjun:20191211004806j:plain
アイマスハッカソンの名札

developer.apple.com

前回の実装から2年近く経っていたので今年のWWDCでのHealthKitのセッションをざっくり見るところから始めた。どうやらデータ構造が無駄の少ないように変わったらしい。メリットしかない(フラグ)。実装の様子はもくもくとやっていただけなので割愛。

HealthKitの最近(2017-2019)の変更点

(心拍数や騒音レベルを上記目的で取得するだけの観点において)

  • 騒音レベルが追加されている: environmentalAudioExposure - HKQuantityTypeIdentifier | Apple Developer Documentation
  • プライバシーの使用目的に最低文字数制限が追加され、短い文字列を使っていた場合はリビルドするだけでクラッシュするようになる。長くすると通る(2倍にコピペするとか): The string "心拍数を表示します" is an invalid value for NSHealthShareUsageDescription
  • 一連の測定値のメタデータをまとめるためにQuantity Seriesという構造が導入されている
  • 全測定値は HKQuantitySeriesSampleQuery で取得するようになっている
  • HKAnchoredObjectQuery はかつては全測定値を返したがリビルドすると返さなくなっている (詳細未確認)

実現された実装

github.com

各ライブの開催時間に対して心拍数のログ(ピンク)と騒音レベルのログ(青)を表示できるようになった。

グラフの心拍数のピークから、どの曲で反応してるか分かる人には分かるが、騒音レベルからなにかを推定するのは難しい? 果たして有用性はあるのか・・・?

残されている課題

  • Catalina以降ではMac Blu-ray Playerのバージョンを上げる必要があり、そこではYesBDTimeによる再生時刻取得の手法が使えなくなっている。 help wanted
  • 騒音レベルのさらなる活用法を探る必要がある

所感

騒音レベルはヘルスケアの全てのデータで見るだけだとdBでの数値リストしか見えないので、全部取得したらおもしろいデータが取れると思っていたが、グラフにしてみるとそれほど分かりやすいデータではなかった。ライブ中は常に一定の範囲のうるささに収まっているようだ。音量が上がってないのに心拍数がやたら上がっているとか、音量の下がったところでBD再生位置合わせの補助になるかもしれないとか、そういう活用がありうるのか、試してみたい。

少ないサンプルの感覚値では、騒音レベルは自分の席の近傍の影響をよく反映するようで、ライブ開演前のCMコーナーでの謎の(?)盛り上がり&歓声で既にライブピーク値と同じくらいの騒音レベルを記録している可能性もある。

WWDCのHealthKitのセッションをみて、便利になったのだなと思っていたが、既存の実装だと得られるデータの粒度が大幅に粗くなっていた。あえて従来コードコピペによる別タブ逃がしをしてから新規コードを書いたので、それに気付けたので良かったが、まさかデータ構造が新しくなったということ自体がデグレのフラグだったとは?? となった。

7thライブツアー最終地は2月の大阪!どういう構成になるのか本当に楽しみ。

おわりに

みなさんもHealthKitに保管されているデータを使って今年あったイベントを振り返ってみてはいかがでしょうか? 明日は_sa_chi_03さんの記事が公開予定です。是非そちらもご覧ください!