変更履歴¶
Status: stable | Last reviewed: 2026-05-11
ドキュメント・設計の主要変更を記録する。コードの詳細は git log / GitHub Releases に任せる。
2026-05-11¶
Phase 2-B v4 評価: Shift 専用 BCE ヘッドで初めて AUC > 0.5 獲得¶
shift_head を ITMModel に追加し、silence 直前の context から shift/hold を 二値分類する BCE 損失で学習(pos_weight=1.5、frozen transformer、3 epoch):
- ROC-AUC = 0.566(v3 0.440、v2 0.487、baseline 0.701 — Phase 2-B で初の AUC > random)
- PR-AUC = 0.353(base rate 0.280 を超える)
- ただし shift 過剰予測の傾向(threshold ≤ 0.2 で全 SHIFT、0.3 で Hold 8% / Shift 94%)
- shift_pos_weight=1.5 が強すぎた可能性
- baseline 0.701 にはまだ大きな差
意義: - survival NLL のみでは AUC ≤ 0.5 という構造的限界を突破 - 専用 discriminative head が必要なことを実証 - v5 候補: shift_pos_weight 調整、calibration、va_classifier 解凍
詳細は 学習パイプライン。
v3 AUC 診断: 50% Shift は偶然だった¶
scripts/diagnose_itm_hazard.py で 12 通りの hazard 集約を試した結果:
- v3 ROC-AUC = 0.440(random 0.5 を下回る)— v2 も 0.487 で同様
- どの集約・horizon・event combo でも AUC ≤ 0.56
- INVERT (1 - hazard) が AUC 0.56 — 弱い負相関しか拾えていない
- Hazard sigmoid 出力が極めて狭い帯域 [0.03, 0.16] に飽和
baseline (MaAI) ROC-AUC = 0.701 と比較すると v2/v3 は random discrimination。 post-hoc temperature scaling は AUC 不変なので無効 → 学習目的の変更が必須 → v4。
scripts/eval_itm_on_ami.py と scripts/eval_maai_on_ami.py に --auc フラグを追加。
詳細は 学習パイプライン。
2026-05-10¶
Phase 2-B v3 評価: Shift 検出能力を初獲得、calibration が新たな課題¶
transformer 部分解凍 (lr=1e-5) + 3 epoch + pos_weight=20 + VAD aux:
- Val loss は 3 epoch で単調減少: 0.300 → 0.137 → 0.095
- Shift accuracy 50.0%(baseline 44.2% を初めて上回る) — Phase 2-B 系列で質的前進
- ただし Hold が 35.8% に落ち、Overall は 0.398 で baseline 0.586 を下回る
- しきい値 0.10 ↔ 0.11 で全反転する「all-or-nothing」現象 — hazard 分布が狭い
- Frame VAD 0.748(baseline 0.933 より低いが v1 の 0.518 崩壊は回避)
意義: - v1: all-zero collapse、v2: hold-bias、v3: shift-bias の流れで初めて Shift 信号を獲得 - 残る課題は hazard 出力の calibration(散らばりが狭い) - Overall 単独は trivial (always HOLD) = 0.720 と一致するため誤導的、AUC 等が必要
v4 候補: temperature scaling / calibration loss / score 集約変更 / AUC 評価 / Shift 専用ヘッド。
詳細は 学習パイプライン。
Phase 2-B v2 評価: ベースラインをわずかに上回る (0.618 vs 0.586)¶
修正(pos_weight=50、VAD aux loss、--freeze-transformer で hazard heads のみ学習)後:
- threshold=0.1 で Overall 0.618(ベースライン 0.586 上回る)
- Hold accuracy 0.791(baseline 0.642 より改善)
- Shift accuracy 0.173(baseline 0.442 より悪化、トレードオフ)
しきい値で挙動が極端に振れる(0.05 以下で全 SHIFT、0.2 以上で全 HOLD)。 モデル出力分布が hold vs shift を強く区別できていない。
v3 で transformer 部分解凍 + multi-epoch + pos_weight 探索を実施予定。
詳細は 学習パイプライン。
Phase 2-B v1 評価: 失敗を確認、原因特定¶
scripts/eval_itm_on_ami.py で IS1000b に対する hold/shift accuracy を測定:
- Frame VAD: 0.518(baseline 0.933 から大幅悪化)
- Shift: 0/52 = 0.000(モデルが何も検出できない)
- すべての silence を HOLD と予測
原因: survival NLL のクラス不均衡 → 「全部 0 を予測」が局所最適。 追加で、VAP transformer の素朴な fine-tune により VAD 能力も喪失。
→ Phase 2-B v2 で pos_weight、VAD 補助損失、ヘッド先行学習で対処。
詳細は 学習パイプライン。
Phase 2-B:ITM モデル + 学習スクリプト実装¶
src/itm/models/itm_model.py: VAP backbone (MaAI) + 3 hazard heads- freeze encoder option。
build_itm_model()ヘルパで MaAI 重み読み込み src/itm/training.py:compute_loss(multi-event survival NLL),train_step,eval_stepscripts/train_itm.py: AMIDataset → DataLoader → 学習ループ → checkpoint。--all,--max-steps,--device {cpu,cuda,mps}等の CLI- 動作確認: CPU 8 step で loss 0.65 → 0.50 と単調減少
- パラメータ数: total 8.1M, trainable 3.7M (CPC encoder frozen)
ユニットテストを追加(合計 48 件)。@pytest.mark.slow で MaAI 重みを ロードする統合テストを切り分け、CI でデフォルトはスキップ。
詳細は 学習パイプライン。
Phase 2 基盤:データ・学習パイプライン実装¶
src/itm/data/ に学習基盤を整備:
audio.py: 2 話者 headset 音声の同期ロード + チャンク切り出しtargets.py: サバイバルラベル → torch tensor 変換 + survival NLL 損失dataset.py:AMIDataset(torch.utils.data.Dataset) +ami_collate
5 会議で 983 chunks (20s chunk / 10s hop)、turn_shift 28k / backchannel 41k / overlap 71k positive frames。
ユニットテスト 23 件追加(合計 44 件、全合格)。
詳細は 学習パイプライン。
2026-05-09¶
Phase 1 ベースライン数値を取得(5 会議)¶
AMI ES2002a/b/c, IS1000a/b の 5 会議(計 165 分)で MaAI 英語 VAP を実行(scripts/eval_maai_on_ami.py --all):
- Frame VAD 精度 93.5% (pooled) ─ MaAI の
p_nowargmax が GT と高い一致 - Hold/shift 精度 57.2% (pooled) ─ 528 hold + 262 shift の判定
- 会議ごとのばらつき: 48.8% 〜 67.8%
VAP 論文の Switchboard 数値(75〜80%)より低いのは想定内(ドメイン差 + 4 人会議の 2 ch 評価 + AMI 未 fine-tune)。 これが Phase 2 で超えるべきフロア(目標 ≥ 70%)。 詳細は MaAI ベースライン。
MkDocs Material でドキュメントサイトを構築¶
- 構造: about / research / design / implementation / reference / meta の 6 セクション
- GitHub Actions による gh-pages デプロイ
- ドキュメント方針を
meta/documentation-policy.mdで明示 - これまでの議論内容を docs に統合
v1 アーキテクチャを確定¶
- ベース実装: MaAI (旧 VAP-Realtime)
- 出力: マルチイベント・サバイバルハザード(turn-shift / backchannel / overlap)
- 視覚統合: MediaPipe + 後期融合
- データ: AMI Corpus (メイン) + Smart Turn v3.1 (filler 補助)
死んだ計画¶
以下を断念し、明示的に痕跡を残す:
- 日本語データ(CEJC, NoXi+J, Hazumi, TEIDAN, Obi&Funakoshi VREi)→ 個人入手不可
- ErikEkstedt/VoiceActivityProjection 直接 fork → 依存劣化
- Smart Turn データで turn-shift 学習 → データの実体は単一話者
- 上半身 optical flow による呼吸 → 顔のみシナリオで動かない(rPPG 等に変更、v2 で)
Phase 0 完了¶
- 環境構築(Python 3.11 venv + maai)
- MaAI 動作確認(出力構造把握:
t, x1, x2, p_now, p_future, vad) - AMI 注釈構造解明(16 種 dialog act)
- Smart Turn データ構造確認(endpoint+filler、turn-shift ではない)
2026-05-01(プロジェクト開始)¶
初回技術調査¶
- ターンテイキング AI の包括サーベイ実施
- 結果を report.html / report.pdf にまとめる
- VAP / MM-VAP / Moshi / DualTurn / Smart Turn 等の主要モデルを把握
- 視覚シグナル(FAU・視線・呼吸)の重要性を確認