Muse 脳波計1を購入したときの目標が、自分でニューロフィードバックを実装すること. 現在、市民大学のを公開講座も受講している. この1ヶ月の成果としてニューロフィードバックを実装したい.
ニューロフィードバックを体験し、脳の健康を守るためにできることを実践しましょう - さがまちコンソーシアム(相模原・町田大学地域コンソーシアム)
Muse AppからOSCストリームを受信してリバースエンジニアリング
Museアプリには、隠し機能でOSC (Open Sound Control) プロトコルでリアルタイムにデータをストリーミングする機能がある. これを使えば、アプリが内部で計算している脳波データを外部のプログラムで受け取ることができる.
さらに、これを解析することで、Muse Appがどのようにニューロフィードバックを実装しているのかも調べることが出来る.
Muse Appの設定
Muse Appの設定画面 > DEVELOPER TOOLS > OSC Output を有効にする(これはHELPとかドキュメントには書いてない設定). 設定項目は以下の通り.
- OSC Stream Target IP: データを受信するPCのIPアドレス
- OSC Stream Target Port: 受信ポート(デフォルト5000)
Muse AppのOSCストリームで送信されるデータには、RAW EEG、加速度センサー、ジャイロ、光学センサーなどが含まれる. ただし、バンドパワー(Alpha, Betaなど)は含まれない. Muse App内部では256Hzのフルレートでバンドパワーを計算しているが、OSC出力にはRAWデータしか乗ってこない.
バンドパワーを直接受信したい場合は、Mind Monitor2というサードパーティアプリを使う手がある. Mind MonitorはMuse脳波計からBluetoothでデータを受信し、バンドパワーを計算した上でOSCストリーミングしてくれる.
Mind Sessionアルゴリズムの推定
Muse Appはアルゴリズムは非公開なので、以下の情報はすべて推定.
Muse Appの瞑想セッション(Mind Session)では、Mind State(Calm/Neutral/Active)、Birds、Recoveriesという3つのメトリクスが表示される. これらのアルゴリズムをOSCデータから AIを用いて推定してみた.
元々、うわさではMuseのフィードバックは瞑想の深さではなく、深くリラックスすることに対するフィードバックではという話があった. 実際、目の開閉で大きく変わるのは、アルファブロッキングという現象.
結論としては、ベータ波/アルファ波の比率の指標がもっともbirdsやrecoveriesの数と一致した.
キャリブレーション
Muse Appはセッション開始直後の60秒間をキャリブレーション期間として使っている. この間のAlpha/Beta比の中央値(median)と中央絶対偏差(MAD)を基準値として算出する.
median = セッション最初60秒間のAlpha/Beta比の中央値
MAD = 中央絶対偏差(中央値からの絶対偏差の中央値)
以降のメトリクスは、すべてこのキャリブレーション値に対する相対評価で決まるようだ.
Alpha/Beta比によるMind State分類(Calm/Neutral/Active)
Alpha波(8-13Hz)はリラックス・集中時に増加し、Beta波(13-25Hz)は覚醒・緊張時に増加する. この比率でMind Stateを分類する.
Calm = Alpha/Beta比 ≥ median (キャリブ時の中央値以上)
Active = Alpha/Beta比 ≤ median - 1.8×MAD (大幅に下回ったら)
Neutral = その間
しきい値のパラメータ自体は詳細はわからない. しかし、しきい値をつかった単純な場合分けで状態が分けられるようにおもう.
Birds と Recoveries
Birdsは瞑想中に画面に鳥が飛んでくる演出. Recoveriesは注意散漫な状態からCalmに戻った回数を示す星マーク.
- Birds: Calm時間の累積で決まる. 約8.5秒のCalmごとに1羽飛んでくる(
Birds ≈ Calm合計秒 / 8.5) - Recoveries: Alpha/Beta比が前後3秒で急激に上昇したら1カウント. マインドワンダリングからの回復を検出している
Birdsが多ければ安定した集中を維持できた証拠、Recoveriesが多ければ「散漫→回復」を繰り返したということになる.
Birdsのピヨピヨ音が鳴ると嬉しくてドーパミンがでることによって学習するという理屈.
雨音フィードバック
Muse Appの瞑想中に聞こえる雨音も、おそらくBeta波またはBeta/Alpha比に連動している. 注意散漫になると雨音が強くなり、集中すると穏やかになる. これは検証していないが、Mind Stateの分類と同じAlpha/Beta比をそのまま雨音の音量にマッピングしていると考えるのが自然だろう.
コンソールフィードバックツールの実装
推定したアルゴリズムを元に、Mind MonitorからOSCデータを受信してリアルタイムにフィードバックするPythonツールを作った.
基本構成
Mind Monitor (スマホ)
│ OSC over WiFi
▼
muse_app.py (PC)
├── Alpha/Beta比を計算
├── キャリブレーション(60秒)
├── Mind State分類(Calm/Neutral/Active)
├── Recoveries検出
└── 音階フィードバック
コンソール出力の視覚フィードバック
まずはもっとも簡単なアプリを作成したかったので、コンソールに数値や状態を出力するフィードバックと. キャリブレーション完了後、1秒ごとにMind StateとZ-scoreが表示される.
[08:06:52] Calm Z:+1.23 Ratio:22.15 E4
[08:06:53] Calm Z:+0.87 Ratio:21.40 D4
[08:06:54] Neutral Z:-0.32 Ratio:19.58 C4
連続音階フィードバック(雨音)
Z-scoreを音階にマッピングし、1秒ごとにトーンを再生する. C4(低Z-score、散漫)からC5(高Z-score、集中)まで8段階の音階で、現在の脳の状態を継続的に音で伝える.
Z-score -1.8 -------- 0 -------- +2.4
音階 C4 D4 E4 F4 G4 A4 B4 C5
音が高ければ集中できている、低ければ散漫という直感的なフィードバック. 瞑想中にリアルタイムで自分の脳の状態を「聴く」ことができる.
音の生成はPythonでサイン波のWAVを動的に作って aplay で再生している. NumPyで波形を生成し、フェードイン・アウトをかけてプチノイズを防ぐだけのシンプルな実装.
t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False)
fade = int(sample_rate * 0.02)
envelope = np.ones(len(t))
envelope[:fade] = np.linspace(0, 1, fade) # フェードイン
envelope[-fade:] = np.linspace(1, 0, fade) # フェードアウト
wave = (np.sin(2 * np.pi * frequency * t) * envelope * 32767).astype(np.int16)
外部ライブラリに依存せず、NumPyと標準ライブラリの wave モジュールだけで完結する.
おわりに
ドレミファソラシドが自分の念力で変化していくことに対するワクワク感
今回、まずはもっとも簡単なMuse AppのようなものをPCで再現ようとして、その目的は果たせた.
おもしろかったところは、ドレミファソラシドの音階が、自分の念力によって上がったり下がったりしたこと. 美しいメロディー制御はできないが、この念力による音の変化という、ニューロフィードバックのはじめの体験ができたことがワクワクした.
ニューロフィードバックをハックして瞑想もハックしたい
Muse脳波計の購入は3台目で昔から使っているんだが、昔からこの小鳥ピヨピヨ音は変わらない. もちろん他のモードは増えているが、小鳥の鳴き声フィードバックはMuseの代名詞のようだ. しかし、これはリラックスフィードバックだよなとずっと思っていたので、どうしてもここを今回ハックしたいと思っていた.
購入から半年経って、毎日活用してはいるものの、ようやくやりたいことのはじめの一歩が踏めた気がした. もう少し独自ニューロフィードアルゴリズムのハックを開拓していきたい.
See Also
mindwave moblie で 瞑想力を鍛える!瞑想の効果と可視化について | Futurismo
-
Amazon.co.jp: Muse S Athena: 脳感知ヘッドバンド - 瞑想の追跡とモニタリングのためのニューロフィードバックデバイス ↩︎
-
Mind Monitor - Muse脳波計用のサードパーティアプリ. バンドパワーのOSCストリーミングに対応. ↩︎