---
document_type: "spec"
service: "MOMENTRY_CORE"
title: "Voice Embedding 產出流程 V1.0.0"
date: "2026-05-02"
version: "V1.0"
status: "active"
owner: "Warren"
created_by: "OpenCode"
tags:
  - "momentry"
  - "core"
  - "voice"
  - "embedding"
  - "asrx"
  - "qdrant"
  - "v1.0.0"
ai_query_hints:
  - "Voice Embedding 的完整處理流程（音軌 → ECAPA-TDNN → Qdrant）"
  - "ASRX Processor 的三階段處理：音軌預處理 → ASR segments 載入 → Speaker Diarization"
  - "Worker store_asrx_chunks 的步驟與 pre_chunks 寫入規則"
  - "Qdrant voice collection 的 payload 結構與欄位定義"
  - "Voice embedding 的 192-D ECAPA-TDNN 向量規格（L2 normalize）"
  - "Voice embedding 使用 Cosine 距離計算與 L2 歸一化"
  - "SpeechBrain ECAPA-TDNN 的資源預估與處理速度"
  - "Voice embedding 與 ASR 處理器的依賴關係"
related_documents:
  - "../VECTOR_SPEC_V1.0.0.md"
  - "../PROCESSORS/ASRX_V1.0.0.md"
  - "../PROCESSORS/ASR_V1.0.0.md"
  - "../PROCESSOR_SELECTION_V1.0.0.md"
  - "../MOMENTRY_CORE_API_V1.0.0.md"
---

# Voice Embedding 產出流程 V1.0.0

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

## 關鍵術語定義

| 術語 | 定義 |
|------|------|
| Voice Embedding | 語音向量嵌入，由 ECAPA-TDNN 產出 192-D 向量 |
| ECAPA-TDNN | SpeechBrain 提供的說話人辨識模型 |
| L2 normalize | 向量歸一化，確保所有向量單位長度 |
| Spectral Clustering | 頻譜聚類，將語音 embedding 分群以區分說話人 |
| segment_index | 在 asrx 輸出 segments 中的索引編號 |
| speaker_id | 說話人標籤（如 SPEAKER_0, SPEAKER_1） |

## 處理流程

```
1. Video → ffmpeg 萃取音軌 → 16kHz mono WAV
       │
       ▼
2. ASRX Processor (asrx_processor_custom.py)
   │
   ├── Stage 1: 音軌預處理
   │   ├── ffprobe 列出所有音軌
   │   ├── 選擇最佳音軌（優先英語）
   │   └── ffmpeg 轉為 16kHz mono WAV
   │
   ├── Stage 2: 載入 ASR segments
   │   └── 從 {file_uuid}.asr.json 讀取 segments
   │
   ├── Stage 3: Speaker Diarization (SelfASRXFixed.process_with_segments)
   │   ├── 對每個 ASR segment 取出音訊片段
   │   ├── ECAPA-TDNN 產出 192-D embedding
   │   ├── 正規化 embeddings
   │   └── 譜聚類 → speaker label
   │
   ├── 輸出: {file_uuid}.asrx.json
   │   ├── segments: [start_time, end_time, speaker_id]
   │   └── embeddings: [[192-D float array], ...]
   │
       ▼
3. Worker store_asrx_chunks()
   ├── 解析 AsrxResult
   ├── 寫入 pre_chunks 表
   └── 寫入 voice embeddings 到 Qdrant
       │
       ▼
4. Qdrant `momentry_dev_voice`
   └── 每個 segment 一個 vector
```

## Qdrant Payload 結構

```json
{
  "file_uuid": "dd61fda85fee441fdd00ab5528213ff7",
  "speaker_id": "SPEAKER_0",
  "segment_index": 0,
  "start_frame": 9,
  "end_frame": 441,
  "start_time": 0.3,
  "end_time": 14.7
}
```

| 欄位 | 型別 | 說明 |
|------|------|------|
| `file_uuid` | string | 來源影片識別碼 |
| `speaker_id` | string | 說話人標籤（如 SPEAKER_0） |
| `segment_index` | integer | 在 segments 中的索引 |
| `start_frame` | integer | 起始幀 |
| `end_frame` | integer | 結束幀 |
| `start_time` | float | 起始時間（秒） |
| `end_time` | float | 結束時間（秒） |

## Vector 規格

| 屬性 | 值 |
|------|-----|
| 模型 | SpeechBrain ECAPA-TDNN |
| 維度 | 192 |
| 距離計算 | Cosine |
| 歸一化 | 是（L2 normalize） |

## 來源 Processor 資源預估

| 資源 | 值 |
|------|-----|
| 模型 | SpeechBrain ECAPA-TDNN (~80MB) |
| CPU | 0.8 |
| 記憶體 | 2048 MB |
| GPU | 不使用 |
| 處理速度 | 57x real-time (M4 Mac Mini) |
| 依賴 | ASR（需 ASR JSON 完成後才能啟動） |

## 版本歷史

| 版本 | 日期 | 目的 | 操作人 | 工具/模型 |
|------|------|------|--------|-----------|
| V1.0 | 2026-05-02 | 初始版本 | OpenCode | deepseek-chat |
