---
document_type: "architecture_design"
service: "MOMENTRY_CORE"
title: "Momentry Core 語音特徵與人物識別整合架構 (Speaker-AudioVisual Integration) (v1.0)"
date: "2026-04-21"
version: "V1.0"
status: "deprecated"
owner: "Warren"
created_by: "OpenCode"
tags:
  - "deprecated"
  - "momentry"
  - "core"
  - "語音特徵與人物識別整合架構"
ai_query_hints:
  - "查詢 Momentry Core 語音特徵與人物識別整合架構 (Speaker-AudioVisual Integration) (v1.0) 的內容"
  - "Momentry Core 語音特徵與人物識別整合架構 (Speaker-AudioVisual Integration) (v1.0) 的主要目的是什麼？"
  - "如何操作或實施 Momentry Core 語音特徵與人物識別整合架構 (Speaker-AudioVisual Integration) (v1.0)？"
---

> [!WARNING] **檔案已過時 (Deprecated)**
> 
> **原因**: 此文件依賴舊版 `global_person_identities` 和 `person_identities` 表結構。新的 `FILE_IDENTITY_API_DESIGN.md` 已將聲紋、臉部等所有特徵統一歸納至 `identities` 表中，不再區分全域/本地人物表。
> 
> **狀態**: 僅供歷史參考，不應用於新功能的開發。
> 
> **搬移日期**: 2026-04-25

# Momentry Core 語音特徵與人物識別整合架構 (Speaker-AudioVisual Integration) (v1.0)

| 項目 | 內容 |
|------|------|
| 建立者 | OpenCode |
| 建立時間 | 2026-04-21 |
| 文件版本 | V1.0 |

---

## 版本歷史

| 版本 | 日期 | 目的 | 操作人 | 工具/模型 |
|------|------|------|--------|-----------|
| V1.0 | 2026-04-21 | 定義語音特徵 (Speaker Diarization & Embedding) 與視覺識別的融合邏輯 | OpenCode | OpenCode / Qwen3.6-Plus |

---

## 0. 設計目標

單純依賴臉部識別 (Face Recognition) 在側臉、遮擋、遠景或黑暗環境下容易失敗。**語音特徵整合** 提供了強大的互補邏輯，透過「誰在說話」與「誰在畫面中」的時空關聯，實現 **多模態人物身分決議 (Multimodal Person Identity Resolution)**。

- **核心目標**: 利用 ASRX (說話者日誌化) 產出的時間軸與聲紋特徵，自動綁定臉部聚類 (Face Clusters)。
- **資料豐富**: 建立 `voice_print` (語音特徵向量) 與 `speaker_id` 關聯，支援跨影片聲音重識別 (Speaker Re-Identification)。
- **魯棒性**: 當臉部識別置信度低時，以語音時間重疊率 (Temporal Overlap) 作為主要判斷依據。

---

## 1. 核心關聯邏輯 (Association Logic)

系統採用 **「時空共現 (Spatio-Temporal Co-occurrence)」 + 「特徵交叉驗證 (Cross-Modal Verification)」** 雙重機制。

### 1.1 時空共現原理
在大多數影視內容中，當一個人說話時，鏡頭通常會聚焦於該人。
- **假設**: 若 `SPEAKER_00` 說話的 80% 時間內，`FACE_01` 都出現在畫面中心，則 `SPEAKER_00` 與 `FACE_01` 極可能為同一人。

### 1.2 語音特徵向量 (Speaker Embedding)
ASRX 處理時，同時提取每個 `speaker_id` 的 **ECAPA-TDNN x-vector** (通常為 192 或 256 維)。
- **用途**: 用於跨影片聲音比對 (例如：同一配音員在不同影片中出現)。
- **儲存**: 寫入 `global_person_identities.voice_print`。

---

## 2. 資料庫結構擴展 (Schema Extension)

為支援語音整合，需對全域人物表與本地關聯表進行欄位擴展。

### 2.1 全域人物身分表 (`global_person_identities`)
```sql
ALTER TABLE global_person_identities 
ADD COLUMN voice_print vector(256),      -- 聲紋特徵向量 (ECAPA-TDNN)
ADD COLUMN primary_speaker_id VARCHAR(50), -- 主要關聯的 Speaker ID
ADD COLUMN match_strategy VARCHAR(30);   -- 'tmdb_face', 'audio_visual_overlap', 'manual'
```

### 2.2 本地人物出現表 (`person_identities`)
```sql
ALTER TABLE person_identities 
ADD COLUMN speaker_id VARCHAR(50),        -- 關聯的 ASRX Speaker ID
ADD COLUMN temporal_overlap_score FLOAT,  -- 時間重疊率 (0.0 - 1.0)
ADD COLUMN audio_visual_confidence FLOAT; -- 融合置信度
```

---

## 3. 時空對齊演算法 (Temporal Alignment Algorithm)

系統如何精確計算「說話者」與「臉部」的關聯？

### 3.1 演算法步驟
1. **時間切片**: 將影片以 `1秒` 為單位劃分時間窗。
2. **標籤映射**: 
    - 若該秒有 ASRX 輸出，標記為 `ActiveSpeaker = SPEAKER_XX`。
    - 若該秒 Face Processor 偵測到臉部，標記為 `ActiveFace = FACE_YY` (取信心值最高且面積最大者)。
3. **共現矩陣 (Co-occurrence Matrix)**: 統計每對 `(SPEAKER_XX, FACE_YY)` 同時出現的秒數。
4. **計算重疊率**:
   ```math
   Overlap(S_x, F_y) = \frac{\text{Count}(S_x \cap F_y)}{\text{Count}(S_x)}
   ```
5. **決策**:
- 若 `Overlap > 0.60` → 建立強關聯 (High Confidence)。
- 若 `0.30 <= Overlap <= 0.60` → 建立建議關聯 (Medium Confidence)。
- 若 `Overlap < 0.30` → 忽略 (可能是畫外音或群體場景)。

### 3.2 偽代碼範例
```python
# 輸入: speaker_timeline, face_timeline
co_occurrence = defaultdict(int)
speaker_duration = defaultdict(int)

for sec in range(total_seconds):
    if speaker_timeline[sec]:
        s_id = speaker_timeline[sec]
        speaker_duration[s_id] += 1
        if face_timeline[sec]:
            f_id = face_timeline[sec] # 取最大臉
            co_occurrence[(s_id, f_id)] += 1

# 計算關聯強度
for (s_id, f_id), overlap_count in co_occurrence.items():
    score = overlap_count / speaker_duration[s_id]
    if score > 0.6:
        link_speaker_to_face(s_id, f_id, score)
```

---

## 4. 融合識別流程 (Integration Pipeline)

此流程與 TMDB 臉部比對並行執行，最終匯入同一個 `Global Identity Resolver`。

```mermaid
graph TD
    A[ASRX Processor] -->|Speaker IDs + x-vectors| B(Speaker-Face Aligner)
    C[Face Processor] -->|Face Clusters + BBoxes| B
    D[TMDB Service] -->|Actor Names + Photos| E[Identity Resolver]
    
    B -->|Audio-Visual Pairs| E
    E -->|Merge & Deduplicate| F[(Global Person DB)]
    F -->|Enrich Chunks| G[Rule 3/4 Chunking]
```

### 4.1 執行時機
1. `ASRX` 與 `Face` 處理器均完成。
2. 觸發 `audio_visual_binding_worker`。
3. 產出 `speaker_face_mapping.json`。
4. 寫入資料庫，並更新 `person_identities` 表。

---

## 5. 衝突處理與置信度評分 (Conflict & Confidence)

### 5.1 常見衝突情境
| 情境 | 現象 | 處理策略 |
|:---|:---|:---|
| **畫外音 (Voice-Over)** | Speaker 出現時間長，但對應 Face 為空或 constantly changing | 降低權重，標記為 `narration`，不強制綁定單一 Face |
| **多人對話重疊** | 畫面有 3 張臉，但只有 1 個 Speaker | 優先綁定畫面中心/最大臉，其餘標記為 `audience/background` |
| **TMDB 與 Speaker 衝突** | TMDB 匹配為 A，但 Speaker 重疊指向 B | 以 **高置信度 Speaker 重疊** 為優先 (因為是動態實測)，TMDB 降為候補參考 |

### 5.2 融合置信度計算
```math
FinalConfidence = (W_{face} \times FaceScore) + (W_{voice} \times OverlapScore) + (W_{tmdb} \times TMDBScore)
```
預設權重：`Face: 0.4`, `Voice: 0.4`, `TMDB: 0.2` (可依影片類型動態調整)。

---

## 6. 與 TMDB 的協同效應 (Synergy)

| 維度 | TMDB 整合 | 語音特徵整合 | 綜合效益 |
|:---|:---|:---|:---|
| **資料來源** | 外部資料庫 (靜態) | 影片內容本身 (動態) | 靜態+動態互補 |
| **解決問題** | "這部片有誰？" | "現在說話的是誰？" | 精準定位時間軸 |
| **失敗情境** | 電影元資料錯誤/小眾片 | 畫外音/環境音干擾 | 一方失敗時另一方補位 |
| **輸出結果** | 演員名單與照片 | 說話者時間軸與聲紋 | 完整多模態人物畫像 |

---

## 7. 總結

引入 **Speaker 特徵整合** 後，Momentry Core 的人物識別從「單點視覺比對」升級為 **「聽視覺時空融合」**。

- **召回率提升**: 解決側臉、背光、遠景下的臉部識別失敗問題。
- **時間軸精準**: 不僅知道「誰在片中」，更知道「誰在何時說了什麼」。
- **聲紋累積**: 跨影片建立 `voice_print` 庫，未來可實現「聽聲辨人」的檢索能力。

此架構確保了人物資料的完整性與高可用性，為後續的 Chunk Rule 3/4 (場景與劇情分析) 提供了堅實的實體基礎。
