エモコアイ単体での感情推定検討
約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秒はセンサー反応を弱める |
混合データの影響を抑制 |
体験の半分が「慣らし」 |
| 前の人をベースラインに |
前の人の最終値を基準に差分を取る |
データ継続性を活かす |
個人差が吸収できない |
実機で確認すべき項目
- センサー通電+アプリ起動済みの状態で、解析開始→停止→再開始した場合、また30秒待つか?
- 在否が0→1に変わった時(人が入った時)、データ出力はどうなるか?
- 在否が1→0→1と変化した時(人が入れ替わった時)、バッファはリセットされるか?
- 解析を停止せずに人が入れ替わった場合の挙動は?
- 起動5秒後に短区間脈拍は出ているか?
- 起動15秒後に活性度/没入度は変化し始めるか?
- 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. 感情推定の限界
検出できないもの
-
Valence(快/不快)の区別
- 活性度↑ が「楽しい興奮」か「恐怖の緊張」かは区別不可
- 没入度↑ が「好奇心」か「警戒」かは区別不可
-
複合感情の分離
- 「怖いけど面白い」のような複雑な状態は単一値に丸められる
-
微細な感情の揺らぎ
- 1秒単位の出力では、0.1秒単位の反応(驚愕反応等)は捉えられない
-
個人間のばらつき
- 同じ活性度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秒制約の検証(最優先)
応答速度の検証
値の変動レンジの検証
8. まとめ
できること(高確度)
- 覚醒度の変化の検出(緊張⇔リラックス)
- 注意・集中の度合いの検出
- 退屈・疲労の検出
- 上記の時系列変化パターンの検出
限定的にできること(中確度)
- 驚き・ショックの検出(活性度の急上昇として)
- 興味・没入の検出(没入度の上昇として)
- 複合パターンからの感情推定
できないこと
- 快/不快(Valence)の直接判定
- 感情の種類の確定(喜び/恐怖/怒り等)
- 0.5秒以下の瞬間的反応の検出
要検証
- 30秒制約の正確な発動条件
- 各指標の実際の応答速度
関連ドキュメント