エモコアイ単体での感情推定検討

約1分程度の映像と音による展示作品において、エモコアイ単体でどこまで感情推定が可能かを検討する。

ステータス: 検討中

これは確定仕様ではなく、スペックからの推測とアイデアです。実機検証が必要な項目が多数あります。

前提条件

  • 展示時間: 約1分(60秒)
  • 刺激: 映像と音
  • 反応要素: センシング状態に応じてオブジェクト、音、映像が反応
  • 考慮事項: 値の変化範囲、応答速度

1. 時間的制約:30秒問題の詳細検討

仕様書の記載

データ出力間隔: 初回は起動から30秒後、以後は最小1秒間隔

「起動」の解釈が曖昧

仕様書では「起動」が何を指すか明確ではない。考えられる解釈:

解釈 「起動」の意味 展示での対策 検証優先度
A センサー本体の通電(USB接続) 常時通電しておけば問題なし
B アプリケーション起動 アプリ起動しっぱなしなら問題なし
C 「解析開始」ボタン押下 毎回30秒のウォームアップ必要
D 人物検知(在否=1)時点 人が入れ替わるたびに30秒待ち

30秒の技術的背景(推測)

脈拍が「30秒間の測定データを元に算出」と記載されていることから:

  • 感情推定には脈拍データが必要
  • 脈拍算出に30秒分のバッファが必要
  • よって初回データ出力まで30秒かかる

この推測が正しければ

  • センサー/アプリが起動済みでも、新しい人物を検知するたびに30秒必要の可能性
  • 在否フラグが0→1に変わった時点でバッファがリセットされる?

各データの算出時間は異なる可能性

データ 算出に必要な時間 仕様書の記載
脈拍 30秒 「30秒間の測定データを元に算出」
短区間脈拍 5, 10, 15秒 「5、10、15秒間のデータを元に算出」
没入度 不明 記載なし
活性度 不明 「脈拍のリズムや交感神経の度合い」
眠気度 不明 記載なし
消耗度 不明 「自律神経全体の活動度合い」

短区間脈拍が5秒で出るということは:

[0秒]───[5秒]───[10秒]───[15秒]─────────[30秒] │ │ │ │ 短区間脈拍 短区間 短区間 脈拍 (5秒) (10秒) (15秒) (30秒)

もし活性度が短区間脈拍ベースで計算されているなら、5〜15秒程度で使える可能性がある。

「初回は起動から30秒後」という記載は、全データの出力開始が30秒後という意味かもしれないし、脈拍(30秒版)が揃うまで全出力を待っているだけかもしれない。

連続運用時の問題:前の人のデータ残留

リセットせずに連続運用する場合、前の人のデータが残る問題が発生する。

【リセットする場合】 前の人 ──→ [リセット] ──→ 30秒待ち ──→ 次の人のデータ ↑ 使えない 【付けっぱなしの場合】 前の人のデータ ────────→ 次の人のデータ ↑ 前の人の脈拍が30秒分残る

脈拍が「30秒間のデータで算出」ということは、移動平均的な処理をしている可能性が高い:

  • 人が入れ替わっても、前の人の脈拍データが30秒かけて徐々に薄れていく
  • 最初の30秒は「前の人のデータ + 今の人のデータ」の混合状態

対処アプローチ

アプローチ 方法 メリット デメリット
変化量だけ見る 絶対値を無視し、傾きだけで反応 前の人の影響を軽減 初期の急変化を拾えない
慣らし期間 最初30秒はセンサー反応を弱める 混合データの影響を抑制 体験の半分が「慣らし」
前の人をベースラインに 前の人の最終値を基準に差分を取る データ継続性を活かす 個人差が吸収できない

実機で確認すべき項目

  1. センサー通電+アプリ起動済みの状態で、解析開始→停止→再開始した場合、また30秒待つか?
  2. 在否が0→1に変わった時(人が入った時)、データ出力はどうなるか?
  3. 在否が1→0→1と変化した時(人が入れ替わった時)、バッファはリセットされるか?
  4. 解析を停止せずに人が入れ替わった場合の挙動は?
  5. 起動5秒後に短区間脈拍は出ているか?
  6. 起動15秒後に活性度/没入度は変化し始めるか?
  7. 30秒経過前後で、各指標の「安定度」に差があるか?

2. 展示設計への組み込み案

案A:ウォームアップフェーズを設ける(安全策)

[-30秒]──────────[0秒]──────────[60秒] │ │ │ └ ウォームアップ┴── 本編映像 ───┘ (センサー安定化)
  • 本編開始前に30秒間、ニュートラルな映像や案内を表示
  • この間にベースライン計測
  • 本編開始時には既にデータが流れ始めている

案B:展示を2フェーズに設計

[0秒]────[30秒]────[45秒]────[60秒] │ │ │ │ └導入部──┴─中盤───┴──終盤──┘ データなし 反応開始 反応強化
  • 導入部(0-30秒):センサーなしでも成立する演出
  • 中盤以降(30-60秒):センサーデータを活用した反応

案C:連続運用(30秒問題を回避できる場合)

もし「解釈A/B」が正しく、通電+アプリ起動しっぱなしでデータが継続出力されるなら:

  • センサーを常時稼働
  • 人の入れ替わりは在否フラグで検知
  • 前の人のデータから継続的に取得
  • ただし、個人のベースラインは取れない

3. 各指標の詳細と感情推定

公式の指標説明(SRA02 PDF より)

解析項目 公式説明 測定対象(推測)
没入度(集中) 覚醒や集中の度合いを表す。数値が高いほど集中、熱中、興奮などが高い状態 HRV(心拍変動)?
活性度(緊張) 脈拍のリズムや交感神経の度合いを表す。数値が高いほど緊張、低いほどくつろぎ状態 心拍数 + HRV
眠気度(退屈、怠惰) 眠気や非活性の度合いを表す。数値が高いほど眠気が高く頭がぼんやりした状態 HRV(副交感神経優位)?
消耗度(疲労) 自律神経全体の活動度合いを表す。数値が高いほど消耗、低いほど元気な状態 HRV全体の低下?
ワークスコア 上記4つを総合的に判定した、独自の作業効率を表す 複合指標
重要な発見

「交感神経」「自律神経」という言葉が出てきたことで、HRV(心拍変動)解析を行っている可能性が高い。24GHzレーダーで脈拍を取得し、その変動パターンから自律神経の状態を推定していると考えられる。

HRV解析と1分展示の相性(推測)

もしHRV(心拍変動)解析を行っているなら、展示時間との相性に注意が必要。

HRVの一般的な解析時間窓

解析手法 必要な時間 検出できるもの
超短期HRV 10〜30秒 瞬間的な自律神経反応
短期HRV 2〜5分 交感神経/副交感神経バランス
長期HRV 24時間 日内変動、慢性ストレス

エモコアイが「30秒で初回出力」という仕様なのは、超短期HRV解析に必要な最低限の時間と一致する。

1分展示での制約

[0秒]─────[30秒]─────[60秒] │ │ │ └─ 初期化 ─┴─ 実質 ──┘ (データなし) 30秒間
  • 30秒間では、超短期HRVの1サンプルしか取れない
  • 「変化を見る」には最低2サンプル必要 → 最低60秒は欲しい
  • 短期HRV(2〜5分)の精度には遠く及ばない
1分展示の限界

HRV解析ベースだとすると、1分の展示では「変化の傾向」を見るのが精一杯。絶対値の信頼性は低い可能性がある。「この人は緊張している」ではなく「この人は今、緊張が高まりつつある」程度の解像度と考えるべき。

各指標の変化と感情状態の対応

活性度(交感神経系)

脈拍のリズム + 交感神経の度合いを反映。最もリアルタイム性が高いと推測

活性度の変化 推定される感情・状態
急上昇 驚き、ショック、恐怖、興奮
上昇 緊張、不安、期待、高揚
低下 安心、リラックス、くつろぎ
急低下 退屈、興味喪失

没入度(覚醒・集中)

覚醒や集中の度合い。興奮も含まれる。

没入度の変化 推定される感情・状態
上昇 集中、熱中、興奮、認知的関与
低下 注意散漫、関心低下、ぼんやり

眠気度(非活性)

眠気や非活性の度合い。副交感神経優位の状態?

眠気度の変化 推定される感情・状態
上昇 退屈、無関心、眠気、ぼんやり
低下 覚醒、興味回復

消耗度(自律神経全体)

自律神経全体の活動度合い。長時間の緊張やストレスで上昇。

消耗度の変化 推定される感情・状態
上昇 疲労、消耗、ストレス蓄積
低下 元気、回復、緩和

指標間の関係性(推測)

交感神経優位 副交感神経優位 ↓ ↓ 活性度↑ 活性度↓ 没入度↑ 眠気度↑ │ │ └──── 持続すると ────→ 消耗度↑
  • 活性度と没入度は相関しやすい(興奮・集中時に両方上がる)
  • 活性度と眠気度は逆相関(リラックス時に活性度↓、眠気度↑)
  • 消耗度は時間軸が異なる(短期の変化ではなく蓄積を反映)

4. 感情推定の限界

検出できないもの

  1. Valence(快/不快)の区別

    • 活性度↑ が「楽しい興奮」か「恐怖の緊張」かは区別不可
    • 没入度↑ が「好奇心」か「警戒」かは区別不可
  2. 複合感情の分離

    • 「怖いけど面白い」のような複雑な状態は単一値に丸められる
  3. 微細な感情の揺らぎ

    • 1秒単位の出力では、0.1秒単位の反応(驚愕反応等)は捉えられない
  4. 個人間のばらつき

    • 同じ活性度50でも、緊張しやすい人とそうでない人で意味が異なる

応答速度の不確定要素

項目 仕様書の記載 不明点
データ出力間隔 最小1秒 各指標の内部更新頻度は?
脈拍 30秒間のデータで算出 移動平均?直近30秒?
短区間脈拍 5, 10, 15秒で算出 どの秒数が使われる?選択可能?
感情指標 記載なし 脈拍からの算出ラグは?

5. 相対変化アプローチ

なぜ相対変化か?

絶対値の問題点

  • 安静時心拍数は人により60〜100bpmと幅がある
  • 「活性度60」が緊張状態の人もいれば、リラックス状態の人もいる
  • ベースライン計測には時間がかかり、1分展示では非現実的

相対変化の利点

  • その人の中での変化方向・速度を見るので個人差を吸収
  • ベースライン不要で即座に判定開始可能
  • 「今この瞬間に何かが起きている」を検出できる

相対変化の計算方法

変化量 = 現在値 - N秒前の値 変化率 = (現在値 - N秒前の値) / N秒前の値 × 100 変化速度 = 変化量 / 経過秒数

時間窓の選択

時間窓 検出できるもの 用途
3秒 瞬間的な反応(驚き、ショック) 即時フィードバック
5秒 短期の感情変化(緊張の高まり) 演出トリガー
10秒 中期のトレンド(集中/退屈の傾向) 状態判定
30秒 全体の傾向(展示前半と後半の比較) 体験評価

実装例(疑似コード)

// 直近N秒間の変化を計算
function getChange(history: number[], seconds: number): {
  amount: number;    // 変化量
  rate: number;      // 変化率(%)
  direction: 'up' | 'down' | 'stable';
} {
  const current = history[history.length - 1];
  const past = history[history.length - 1 - seconds];

  const amount = current - past;
  const rate = (amount / past) * 100;

  // 閾値は調整が必要(仮に±5%を安定とする)
  const direction = rate > 5 ? 'up' : rate < -5 ? 'down' : 'stable';

  return { amount, rate, direction };
}

変化パターンによる感情推定

絶対値ではなく、複数指標の変化方向の組み合わせで推定:

活性度変化 没入度変化 眠気度変化 推定される状態
↑↑(急上昇) 興奮・驚き
集中・没入
不安・警戒
穏やかな集中
退屈・弛緩
↓↓(急低下) 興味喪失・離脱

変化の速度で演出強度を決める

// 変化速度に応じたフィードバック強度
function getFeedbackIntensity(changeRate: number): number {
  const absRate = Math.abs(changeRate);

  if (absRate > 20) return 1.0;   // 急激な変化 → 強いフィードバック
  if (absRate > 10) return 0.7;   // 中程度の変化
  if (absRate > 5)  return 0.4;   // 軽微な変化
  return 0.1;                      // ほぼ変化なし → 微細なフィードバック
}

変化検出のタイムライン

1分展示で相対変化を使う場合の時間設計:

[0秒]────[30秒]────[35秒]────[60秒] │ │ │ │ └ウォーム┴初期値取得┴─ 判定可能期間 ─┘ └ここを基準に相対変化を計算
  • 30秒目: 最初のデータ取得(この値が「初期参照点」になる)
  • 35秒目以降: 5秒前との差分が取れるようになる
  • 40秒目以降: 10秒間のトレンドが見られる
相対変化のメリット

ベースライン計測なしで、データ出力開始から5秒後には感情変化の検出が可能になる。個人差に左右されず、「今まさに何かが起きている」を捉えられる。


6. 具体的な実装案

最小構成:単一指標での反応

活性度の変化 → 映像の色温度 上昇 → 暖色(赤/オレンジ) 低下 → 寒色(青/緑)

中構成:2指標での2次元マッピング

エモーションマップの概念をそのまま利用:

縦軸:没入度(脳活動) 横軸:活性度(脈拍テンポ) 右上:しゃきっとしている → 明るい・速い映像 左下:くつろいでいる → 暗い・ゆっくりした映像

高構成:4指標のパターンマッチング

# 疑似コード
if 没入↑ and 活性↑ and 眠気↓:
    state = "engaged_excitement"  # 前のめりの興奮
elif 没入↓ and 活性↑ and 消耗↑:
    state = "stressed"  # ストレス状態
elif 没入↓ and 活性↓ and 眠気↑:
    state = "bored"  # 退屈
else:
    state = "neutral"

7. 実機検証チェックリスト

30秒制約の検証(最優先)

  • センサー通電済み+アプリ起動済みで、解析開始直後からデータが出るか?
  • 解析停止→再開始で、また30秒待つか?
  • 在否0→1変化時、データ出力はリセットされるか?
  • 人の入れ替わり時の挙動確認

応答速度の検証

  • 刺激から何秒で活性度が変化し始めるか
  • 刺激終了から何秒で値が戻るか
  • 短区間脈拍(5秒)と活性度の相関

値の変動レンジの検証

  • 通常状態での揺らぎ幅(ノイズレベル)
  • 明確な刺激時の変化幅
  • 0-100のうち実際に出現する範囲

8. まとめ

できること(高確度)

  • 覚醒度の変化の検出(緊張⇔リラックス)
  • 注意・集中の度合いの検出
  • 退屈・疲労の検出
  • 上記の時系列変化パターンの検出

限定的にできること(中確度)

  • 驚き・ショックの検出(活性度の急上昇として)
  • 興味・没入の検出(没入度の上昇として)
  • 複合パターンからの感情推定

できないこと

  • 快/不快(Valence)の直接判定
  • 感情の種類の確定(喜び/恐怖/怒り等)
  • 0.5秒以下の瞬間的反応の検出

要検証

  • 30秒制約の正確な発動条件
  • 各指標の実際の応答速度

関連ドキュメント

ON THIS PAGE