HapticとHapticGenerator関連情報


注意事項

本資料に記載されている情報は、私自身の検証や公開されている資料に基づいていますが
すべての環境や機種での動作を保証するものではありません。
また、ハプティックアクチュエータは機械的な部品であるため
再生する波形や使用頻度によっては寿命を縮める可能性があります。
特に高周波・長時間・連続的な振動を与える動作は
デバイスの物理的な負荷となる場合があります。

ご利用の際は、自己責任のもとで適切な検証と安全性の確認を行ってください。

ちなみに、私が使っていた Galaxy S24 Ultra は、振動テストを繰り返していたせいで、 LRAが壊れてしまいました。
とはいえ、部品自体は比較的安価で手に入るので、DIYで修理する派の人ならそこまで気にしなくても大丈夫かもしれません。
交換時にLRAを分解した写真

ハプティックアクチュエータ

一般的なスマートフォンには、ハプティックアクチュエータが搭載されています。
これには複数の種類がありますが、主に LRA(Linear Resonant Actuator)と
ERM(Eccentric Rotating Mass)が使用されています。
それぞれの特徴については情報が豊富なので、興味があれば調べてみてください。

対応機種について

任意波形を再生するには、対応機種である必要があります。
メーカーの公式ページなどに対応状況が記載されていることはまずないため、
購入前に自分で検証する必要があります。

LRA搭載=HapticGeneratorAPIやHapticチャンネルを含んだoggの再生に対応している
ではないので注意。

ハードウェア的に対応していても、HapticGenerator APIが
使用できないケースもあるため注意が必要です。

私が確認できた対応機種を以下にリストアップしておきます。
とりあえず新しい Pixel か Galaxy の Sシリーズを選べば、
ほとんど対応していると思います。

デバイスシリーズ モデル HapticGenerator対応 ハプティック付きOgg対応
Google Pixel 6, 7, 8, 9, 10 (a / 無印 / Pro)
Samsung Galaxy S24, S24 Ultra, Z Fold4
Nothing Phone(1)

HapticGeneratorAPI

Androidで利用可能なAPIのひとつです。
任意の音声波形を再生できますが、再生可能な周波数には制限があります。

私が作成したアプリを使えば、動作や対応可否を確認することができます
https://cloud.potofu.moe/index.php/s/KM3J62zRkpBGRZP?path=%2FRealtimeHaptic

OGG

Ogg形式の音声ファイルにハプティックチャンネル(振動データ)を追加することで、
任意の音声に合わせた振動を再生できます。
MediaPlayer や ExoPlayer などで再生可能です。
HapticGenerator API と異なり、再生可能な周波数に制限はありません。

純正着信音からhapticチャンネルを抽出

以下コマンドを実行することでハプティックチャンネルを抽出できます。

ffmpeg -i input.ogg -filter_complex "[0:0]channelsplit=channel_layout=3.0[left][right][haptic]" -map "[left]" left_channel.wav -map "[right]" right_channel.wav -map "[haptic]" haptic_channel.wav

ハプティックチャンネルを含んだ音声の作成

  • LRAとスピーカーから音を鳴らす場合
    ffmpeg -y -i input.wav -filter_complex "pan=mono|c0=.5*FL+.5*FR[haptic];[0][haptic]join=channel_layout=2.1:map=0.FL-FL|0.FR-LFE|1.0-FR" -metadata ANDROID_HAPTIC=1 output.ogg
  • LRAのみから音を鳴らす場合
    ffmpeg -y -i input.wav -filter_complex "pan=mono|c0=.5*FL+.5*FR[haptic];aevalsrc=0|0[silence];[silence][haptic]join=channel_layout=2.1:map=0.FL-FL|0.FR-LFE|1.0-FR" -metadata ANDROID_HAPTIC=1 output.ogg
  • LRAとスピーカーから別々の音を鳴らす場合

    ffmpeg -y -i Speaker.wav -i haptic.wav -filter_complex "[1]pan=mono|c0=.5*FL+.5*FR[haptic];[0][haptic]join=channel_layout=2.1:map=0.FL-FL|0.FR-LFE|1.0-FR" -metadata ANDROID_HAPTIC=1 output.ogg

    参考リンク

    Android公式:ハプティクスUX設計ガイド
    Android Developers:HapticGenerator API