ユニファ開発者ブログ

ユニファ株式会社プロダクトデベロップメント本部メンバーによるブログです。

補聴器をハックしようとしてハマった話。

こんにちは、ユニファの開発・インフラエンジニアマネージャーの田渕です。

気づけば今年も10月になり、あと数ヶ月で2021年が終わりになろうとしています。 ここ数年は毎年恒例アドベントカレンダーもあるので、まだあと何回かブログを書く機会もあるのかなぁと思います。

2021年もコロナに翻弄された一年でしたが、個人的には前回の執筆記事で書いたように文明の利器を使って聴力を補えた!が割と大きなお話でした。 そんなわけで今回は、「補聴器をハックしようとしてハマった話」をお届けしようと思います。 あまりにもニッチすぎて市場の需要がないのは十分に理解しているのですが、私に需要があるので敢行します。

補聴器ハックしたる!

序章

先日の記事のころ、うちのCTOに、「補聴器使うことにしました〜。」って報告をしたら「せっかくだからハックしてみてよ」的な話になりまして。 まあ、そうですよね。こういうこと言うと怒られると思うんですけど、補聴器って高機能なIoT機器だと思ってますから私。 実際、Bluetoothを使ったりなんだりと、一般的なIoTで利用する技術も多く利用されています。 昨今の補聴器はモバイルのアプリケーションから専用のアプリを利用して制御や調節が行えるものも多くあり、ますますこれから便利になっていくのだろうと思います。

補聴器とiOSの関係

iOSはアクセシビリティの対応に結構力を入れています。 先日のWWDC21でもSwiftUIに関するアップデートがありました。 かなり多くの機能、メニューがあるので今回は私が利用する聴覚関連の話に絞りますが、視覚サポートをはじめとし、広く色々な方が利用できるように準備されています。 補聴器については「Made for iPhone」と言う仕組みがあり、対応している補聴器は次のようなことが行えます。

  • アプリを経由せず、直接iOSのメニューから設定変更、音量調整ができる

  • iOSデバイスからの音を補聴器にストリーミングできる support.apple.com

Androidでも一部で似たようなことができる補聴器も出てきていますが、現状ではiOSに対応している補聴器の方が多いようです。 私がサーバーサイドエンジニアであるにも関わらず、今回のタグに「Swift」をくっつけているのはそういうことでして、例えばMacと補聴器は直接繋がりません。

で、実際繋げるとどんな感じに見えるのか。

これは見てもらったほうが早いので、実際のiPad miniで繋げた時のメニュー画面をお見せします。ダークモード設定なので黒いです。

f:id:unifa_tech:20211010183353p:plain
メニュー画面
f:id:unifa_tech:20211010183419p:plain
さらに詳細
こんな具合に、繋がっているデバイスの設定が標準メニューから行えます。

で、今回は何をするのか。

「ハックする!」とは言ったものの、本気でハックできるほど情報開示されている訳がありません。当たり前です。(医療機器です。) と言うことで、怒られない程度に公式に公開されているもので遊んでみることにしました。

Appleの公式ドキュメントにある「Hearing Device Support」の内容を読み、そこで紹介されているAPIをいくつか使ってみることにします。 前段でお話しした通り、iOSデバイスは直接補聴器につながって音声を流し込める(ストリーミング)のですが、左右それぞれのデバイスに対してストリーミングするのかしないのかの設定ができます。 (私の場合は片耳難聴用の組み合わせなので、もともと右側にしかストリーミングできないのですが。) その設定状態を拾ってきて、表示するという簡単なコードを書いてみましょう。

 // iOS 15以上でしか使えないAPIなのでまずはバージョン判定
if #available(iOS 15.0, *) {
       let streamingStatus = AXMFiHearingDevice.streamingEar()
       if (streamingStatus == AXMFiHearingDevice.Ear.both) {
           return "both"
      } else if (streamingStatus == AXMFiHearingDevice.Ear.left){
           return "left"
      } else if (streamingStatus == AXMFiHearingDevice.Ear.right){
           return "right"
      } else {
         return "nothing"
      }
} else {
       return "Please update to iOS 15."
}

AXMFiHearingDevice.streamingEar()はストリーミングが有効化されているものを返してくれます。戻ってくるのは「両方」「右」「左」のどれかです。 右にだけストリーミングするようになっていたら「右」を表す値が戻ります。 一応画面も作ったので、プレビュー画面も貼っておきます。

f:id:unifa_tech:20211010191340p:plain
SwiftUIのプレビュー
プレビュー画面ではデバイスの設定は取得してこれないので、nothingが表示されています。 あとはこれを実際に接続しているデバイスで動かしてみれば、値が出てくるでしょう!と言う感じです。

何にハマったの?

さて、こんなシンプルなプログラムの何にハマったのか、と言う話です。 私が実機で動かしたらこう出てきたのです。

f:id:unifa_tech:20211010191855j:plain
実機で動かした結果

これを見た私は思いました。

「なぜboth???右しか繋がってないのに?」

色々デバッグしたりしてやっと分かったのですが、どうやら片側しか繋げていない場合、繋げていないもう片方(今回の場合は左ですね)は、常にストリーミングが有効になっているという判定になるようなのです。えー。えー。と思いながらも、まあストリーミングの設定を変えるとちゃんと表示される値が変わることは確認できたのでとりあえず良しとします。

まとめ

今回は、iOS15で新たに使えるようになった補聴器のステータスを知るAPIを使って遊んでみました。 iOSのアクセシビリティ関連はこの他にもまだまだ面白い機能が色々あるので、しばらくはこのシリーズで遊んでいこうかと思います。

ユニファでは、身の回りの色々なものをハックしそうな方を募集中!

unifa-e.com