# ASR + Face + Pose 整合驗證方案

**更新日期**: 2026-04-02  
**目標**: 使用 Face + Pose 驗證 ASR 識別的說話者

---

## 📊 現有數據分析

### 測試影片：ExaSAN (2.6 分鐘)

#### ASR 輸出
- **語言**: 中文 (zh)
- **片段數**: 78 段
- **準確度**: 90%（台灣腔調）

**範例**:
```
[0.0s - 2.0s] 正常來講就是簡吉斯用完之後
[2.0s - 4.24s] 在套片給我們的調光師
[4.24s - 8.0s] 或是要帶去找我們的錄音式的風聲用聲音的部分
```

---

#### Face 輸出
- **總幀數**: 3,512 幀
- **檢測到人臉**: 49 幀
- **採樣間隔**: 30 幀

**範例**:
```
[1.318s] Face at (233, 84) 77x77
[2.682s] Face at (247, 110) 62x62
[4.045s] Face at (251, 109) 62x62
```

---

#### Pose 輸出
- **總幀數**: 3,512 幀
- **檢測到姿態**: 1,853 幀
- **採樣**: 全幀處理

---

## 🔍 整合驗證邏輯

### 驗證流程

```
ASR 語句 [start, end, text]
    ↓
Face 檢測：時間範圍內是否有人臉？
    ↓
Pose 檢測：時間範圍內是否有嘴部動作？
    ↓
置信度評分：
- Face + Pose 都有 → 高置信度 (0.9+)
- 只有 Face → 中置信度 (0.7)
- 只有 Pose → 中置信度 (0.7)
- 都沒有 → 低置信度 (0.5)
```

---

### 驗證規則

#### 規則 1: Face 驗證

```python
def verify_with_face(asr_segment, face_result):
    """
    使用 Face 驗證 ASR 語句
    """
    asr_start = asr_segment['start']
    asr_end = asr_segment['end']
    
    # 查找時間範圍內的 Face 檢測
    faces_in_range = []
    for frame in face_result['frames']:
        if asr_start <= frame['timestamp'] <= asr_end:
            faces_in_range.append(frame)
    
    # 驗證結果
    if len(faces_in_range) > 0:
        return {
            'verified': True,
            'confidence': 0.8,
            'face_count': len(faces_in_range),
            'face_locations': [f['faces'] for f in faces_in_range]
        }
    else:
        return {
            'verified': False,
            'confidence': 0.5,
            'face_count': 0,
            'face_locations': []
        }
```

---

#### 規則 2: Pose 驗證

```python
def verify_with_pose(asr_segment, pose_result):
    """
    使用 Pose 驗證 ASR 語句
    """
    asr_start = asr_segment['start']
    asr_end = asr_segment['end']
    
    # 查找時間範圍內的 Pose 檢測
    poses_in_range = []
    for frame in pose_result['frames']:
        timestamp = frame.get('timestamp', 0)
        if asr_start <= timestamp <= asr_end:
            # 檢查是否有嘴部關鍵點
            if 'mouth' in frame or 'lip' in frame:
                poses_in_range.append(frame)
    
    # 驗證結果
    if len(poses_in_range) > 0:
        return {
            'verified': True,
            'confidence': 0.8,
            'pose_count': len(poses_in_range)
        }
    else:
        return {
            'verified': False,
            'confidence': 0.5,
            'pose_count': 0
        }
```

---

#### 規則 3: 多模態整合

```python
def integrate_verification(asr_segment, face_result, pose_result):
    """
    整合 Face + Pose 驗證
    """
    # Face 驗證
    face_verify = verify_with_face(asr_segment, face_result)
    
    # Pose 驗證
    pose_verify = verify_with_pose(asr_segment, pose_result)
    
    # 整合置信度
    if face_verify['verified'] and pose_verify['verified']:
        # 兩者都有 → 高置信度
        confidence = 0.95
        status = "HIGH_CONFIDENCE"
    elif face_verify['verified'] or pose_verify['verified']:
        # 其中之一 → 中置信度
        confidence = 0.75
        status = "MEDIUM_CONFIDENCE"
    else:
        # 都沒有 → 低置信度
        confidence = 0.5
        status = "LOW_CONFIDENCE"
    
    return {
        'asr_segment': asr_segment,
        'face_verified': face_verify['verified'],
        'pose_verified': pose_verify['verified'],
        'confidence': confidence,
        'status': status,
        'details': {
            'face': face_verify,
            'pose': pose_verify
        }
    }
```

---

## 📈 預期效果

### 驗證準確度

| 驗證組合 | 置信度 | 準確度 | 說明 |
|---------|--------|--------|------|
| **Face + Pose** | 0.95 | 95%+ | 高置信度 ✅ |
| **Face only** | 0.75 | 85% | 中置信度 ⚠️ |
| **Pose only** | 0.75 | 85% | 中置信度 ⚠️ |
| **無驗證** | 0.50 | 65% | 低置信度 ❌ |

---

### 處理流程

```
1. ASR 轉錄 (78 段)
   ↓
2. Face 驗證
   - 檢查時間範圍內是否有人臉
   ↓
3. Pose 驗證
   - 檢查時間範圍內是否有嘴部動作
   ↓
4. 置信度評分
   - Face + Pose → 0.95
   - Face only → 0.75
   - Pose only → 0.75
   - None → 0.50
   ↓
5. 輸出結果
```

---

## 💻 實作步驟

### 步驟 1: 創建整合腳本

**檔案**: `scripts/verify_asr_with_face_pose.py`

**功能**:
- 讀取 ASR、Face、Pose 輸出
- 執行驗證邏輯
- 輸出整合結果

---

### 步驟 2: 測試短影片

**測試影片**: ExaSAN (2.6 分鐘)

**預期結果**:
```json
{
  "total_segments": 78,
  "verified_segments": {
    "high_confidence": 45,
    "medium_confidence": 25,
    "low_confidence": 8
  },
  "avg_confidence": 0.82,
  "segments": [
    {
      "start": 0.0,
      "end": 2.0,
      "text": "正常來講就是簡吉斯用完之後",
      "face_verified": true,
      "pose_verified": true,
      "confidence": 0.95,
      "status": "HIGH_CONFIDENCE"
    }
  ]
}
```

---

### 步驟 3: 分析結果

**統計指標**:
- 總片段數
- 高置信度片段數
- 中置信度片段數
- 低置信度片段數
- 平均置信度

**視覺化**:
- 置信度分佈圖
- 時間軸標註
- Face/Pose 覆蓋率

---

## 🎯 使用場景

### 場景 1: 單人演講

**預期**:
- Face: 持續檢測到人臉
- Pose: 持續檢測到嘴部動作
- ASR: 持續轉錄
- 置信度：0.95+

---

### 場景 2: 雙人對話

**預期**:
- Face: 兩人輪流檢測
- Pose: 嘴部動作輪流
- ASR: 對話轉錄
- 置信度：0.85-0.95

---

### 場景 3: 多人會議

**預期**:
- Face: 多人輪流
- Pose: 複雜嘴部動作
- ASR: 可能重疊
- 置信度：0.75-0.90

---

## 📋 檔案清單

### 現有檔案

```
/tmp/processor_performance_test/
├── asr_short.json       # ✅ ASR 輸出
├── face_short.json      # ✅ Face 輸出
└── pose_short.json      # ✅ Pose 輸出
```

### 需創建檔案

```
scripts/
├── verify_asr_with_face_pose.py    # 🆕 驗證腳本
├── ASR_FACE_POSE_INTEGRATION.md    # 🆕 本文檔
└── test_integration_short.py       # 🆕 測試腳本
```

---

## ✅ 驗收標準

### 功能驗收

- [ ] 能正確讀取三個模組輸出
- [ ] 能執行時間範圍匹配
- [ ] 能計算置信度分數
- [ ] 能輸出整合結果

---

### 效能驗收

- [ ] 短影片處理 < 30 秒
- [ ] 平均置信度 > 0.75
- [ ] 高置信度片段 > 50%
- [ ] 低置信度片段 < 20%

---

**計畫完成日期**: 2026-04-02  
**實施難度**: ⭐⭐ (中)  
**預計時間**: 2-3 小時  
**預期置信度**: 0.82+
