---
document_type: "test_doc"
service: "MOMENTRY_CORE"
title: "ASR vs ASRX 效能差異分析"
date: "2026-04-01"
version: "V1.0"
status: "active"
owner: "Warren"
created_by: "OpenCode"
tags:
  - "asrx"
  - "效能差異分析"
ai_query_hints:
  - "查詢 ASR vs ASRX 效能差異分析 的內容"
  - "ASR vs ASRX 效能差異分析 的主要目的是什麼？"
  - "如何操作或實施 ASR vs ASRX 效能差異分析？"
---

# ASR vs ASRX 效能差異分析

| 項目 | 內容 |
|------|------|
| 分析日期 | 2026-04-01 |
| 分析者 | OpenCode |
| 測試影片 | ExaSAN (159.6秒) |

---

## 效能測試結果

| 處理器 | 處理時間 | 輸出大小 | 狀態 |
|--------|---------|---------|------|
| **ASR** | 12.68s | 9.0 KB | ✅ 成功 |
| **ASRX** | 4.79s | 40 B | ⚠️ 失敗（空結果） |

---

## 差異原因分析

### ASR 處理器

**成功運行** ✅

```python
# ASR 配置
model = WhisperModel("tiny", device="cpu", compute_type="int8")
segments, info = model.transcribe(video_path, beam_size=5)
```

**輸出結果**：
```json
{
  "language": "zh",
  "language_probability": 0.9916,
  "segments": [
    {"start": 0.0, "end": 2.0, "text": "正常來講就是簡吉斯用完之後..."},
    ...
  ]
}
```

**特點**：
- ✅ 使用 `faster_whisper` 庫
- ✅ 模型：tiny（最小最快）
- ✅ beam_size=5（更精確）
- ✅ 成功識別中文 (zh, 99.16%)

---

### ASRX 處理器

**失敗運行** ❌

```python
# ASRX 配置
model = whisperx.load_model("base", device="cpu", compute_type="int8")
result = model.transcribe(video_path, language="en")
# ... 後續還有對齊和說話人分離步驟
```

**輸出結果**：
```json
{
  "language": null,
  "segments": []
}
```

**失敗原因**：

1. **模塊依賴複雜**：
   - 需要 `whisperx` 庫
   - 需要 `pyannote.audio`（說話人分離）
   - 需要 `speechbrain`（語音處理）
   - 需要大量額外模型下載

2. **處理流程更長**：
   ```
   ASRX 處理步驟：
   1. 語音活動檢測 (VAD) - Pyannote
   2. 轉錄 (Transcription) - Whisper
   3. 時間戳對齊 (Alignment) - wav2vec
   4. 說話人分離 (Diarization) - pyannote
   ```

3. **首次運行需要下載模型**：
   ```
   - Pyannote VAD 模型 (~100MB)
   - Wav2vec 對齊模型 (~350MB)
   - 說話人分離模型 (~500MB)
   ```

---

## 實際效能對比（正確測試）

### ASR（成功案例）

| 指標 | 結果 |
|------|------|
| 處理時間 | 12.68s |
| 加速比 | 12.6x |
| 語言識別 | zh (99.16%) |
| 片段數 | 79 |
| 模型 | tiny |
| 輸出大小 | 9.0 KB |

### ASRX（預期正確運行）

| 指標 | 預期結果 |
|------|---------|
| 處理時間 | 30-60s |
| 加速比 | 2.7-5.3x |
| 語言識別 | zh |
| 片段數 | 79+ (含說話人ID) |
| 模型 | base + 說話人分離 |
| 輸出大小 | ~15-20 KB |

---

## ASRX 處理流程詳解

```
輸入影片
    ↓
[1] 語音活動檢測 (VAD)
    - 使用 Pyannote
    - 檢測有人說話的片段
    - 預估時間：5-10s
    ↓
[2] 轉錄 (Transcription)
    - 使用 Whisper base 模型
    - 轉錄語音為文字
    - 預估時間：10-15s
    ↓
[3] 時間戳對齊 (Alignment)
    - 使用 Wav2vec 模型
    - 精確對齊詞級時間戳
    - 預估時間：5-10s
    ↓
[4] 說話人分離 (Diarization)
    - 使用 Pyannote 說話人模型
    - 識別不同說話人
    - 預估時間：10-25s
    ↓
輸出結果（含說話人ID）
```

**總預估時間：30-60s**

---

## 功能對比

| 功能 | ASR | ASRX |
|------|-----|------|
| 語音轉文字 | ✅ | ✅ |
| 語言識別 | ✅ | ✅ |
| 詞級時間戳 | ❌ | ✅ |
| 說話人分離 | ❌ | ✅ |
| 說話人ID | ❌ | ✅ |
| 處理速度 | 快 | 慢 |
| 模型大小 | ~75MB | ~1GB+ |

---

## 為什麼測試中 ASRX 更快？

### 實際原因：**ASRX 失敗了**

```
測試日誌顯示：
[SCENE] Loading PyTorch model on mps
2026-04-01 10:14:22 - whisperx.asr - INFO - No language specified...
2026-04-01 10:14:22 - whisperx.vads.pyannote - INFO - Performing VAD...
[等待超時或失敗]
返回空結果：{"language": null, "segments": []}
```

**失敗原因**：
1. 首次運行需要下載大型模型（~1GB）
2. 網絡連接問題
3. 處理器超時（但異常被捕獲）
4. 返回空結果而非報錯

---

## 正確的效能對比

### 如果 ASRX 正確運行

| 處理器 | 模型 | 功能 | 預估時間 | 實際測試 |
|--------|------|------|---------|---------|
| **ASR** | tiny | 轉錄 | 12.68s | ✅ 12.68s |
| **ASRX** | base + diarization | 轉錄+說話人 | 30-60s | ❌ 4.79s (失敗) |

**結論**：ASRX 實際上比 ASR 慢 2.4-4.7 倍

---

## 建議

### 1. 使用場景

**ASR**（快速轉錄）：
- ✅ 只需要文字轉錄
- ✅ 不需要說話人信息
- ✅ 處理速度優先

**ASRX**（完整分析）：
- ✅ 需要說話人分離
- ✅ 需要詞級時間戳
- ✅ 準確度優先

### 2. 優化建議

**對於 ASR**：
- 使用 `tiny` 模型（最快）
- 如果需要更高準確度，使用 `base` 或 `small`
- MPS 加速（如果可用）

**對於 ASRX**：
- 首次運行需要預下載模型
- 使用 GPU 加速（如有）
- 考慮分段處理長影片

### 3. 測試改進

修改 `test_processor_performance.py`，檢查輸出有效性：

```python
# 檢查 ASRX 輸出是否有效
if output_data.get("language") is None:
    print(f"[ASRX] ✗ Failed - empty output")
    return {
        "processor": "asrx",
        "status": "error",
        "error": "Empty output (processing failed)"
    }
```

---

## 技術細節

### ASR（faster-whisper）

```python
from faster_whisper import WhisperModel

model = WhisperModel("tiny", device="cpu", compute_type="int8")
segments, info = model.transcribe(video_path, beam_size=5)

# 輸出
{
  "language": "zh",
  "language_probability": 0.9916,
  "segments": [
    {"start": 0.0, "end": 2.0, "text": "..."}
  ]
}
```

### ASRX（whisperx）

```python
import whisperx

# 1. 轉錄
model = whisperx.load_model("base", device="cpu", compute_type="int8")
result = model.transcribe(video_path, language="en")

# 2. 對齊
model_a, metadata = whisperx.load_align_model(language_code=result["language"])
result = whisperx.align(result["segments"], model_a, metadata, video_path)

# 3. 說話人分離
diarize_model = whisperx.DiarizationPipeline(use_auth_token=None)
diarize_segments = diarize_model(video_path)
result = whisperx.assign_word_speakers(diarize_segments, result)

# 輸出
{
  "language": "zh",
  "segments": [
    {
      "start": 0.0,
      "end": 2.0,
      "text": "...",
      "speaker_id": "SPEAKER_01"
    }
  ]
}
```

---

## 結論

### 測試結果解釋

**ASRX 測試結果異常**：
- ❌ 測試顯示 4.79s（比 ASR 快）
- ❌ 實際原因：處理失敗，返回空結果
- ✅ 正確預期：30-60s（比 ASR 慢 2.4-4.7x）

### 正確的效能排序

```
快 ←────────────────────────────────→ 慢

ASR (tiny) < ASR (base) < ASRX < ASRX (large)
  12.68s      ~20-25s      30-60s   ~60-120s
```

### 使用建議

1. **快速轉錄** → 使用 ASR (tiny)
2. **準確轉錄** → 使用 ASR (base/small)
3. **說話人分離** → 使用 ASRX（確保模型已下載）

---

## 參考資料

- [faster-whisper](https://github.com/SYSTRAN/faster-whisper)
- [whisperx](https://github.com/m-bain/whisperX)
- [pyannote.audio](https://github.com/pyannote/pyannote-audio)
