# VietVoice.AI — Diarization Plan

## Câu hỏi cần trả lời
Làm sao để VietVoice.AI phân biệt được:
- người nói 1
- người nói 2

mà không làm app phức tạp quá sớm, không đội cost vô lý, và không phá workflow hiện tại.

---

## 1. Hiện trạng
Code hiện tại trong `transcriber.py` dùng `faster-whisper` và chỉ trả về:
- `text`
- `duration`
- `language`
- `segments` theo thời gian

Hiện **không có speaker diarization**.
Tức là app biết đoạn nào bắt đầu/kết thúc lúc nào, nhưng **không biết ai đang nói**.

---

## 2. Ba đường khả thi

### Option A — API diarization cho riêng use case 2 người (khuyến nghị)
Dùng provider có sẵn speaker diarization khi user chọn mode kiểu:
- phỏng vấn 2 người
- recruiter interview
- call 2 speaker

#### Provider phù hợp nhất hiện tại
**AssemblyAI**
- Pre-recorded STT official pricing page có model bắt đầu từ **$0.15/giờ**
- Speaker diarization add-on: **$0.02/giờ**
- Tổng rough: **$0.17/giờ**
- Quy đổi thô: khoảng **74 VND/phút**

#### Vì sao nên chọn
- rẻ nhất trong các phương án có speaker labeling sẵn
- file-based async, khá hợp workflow upload file của mình
- ít engineering risk hơn tự host diarization
- không cần GPU riêng

#### Điểm yếu
- phụ thuộc vendor
- quality speaker attribution phải test với audio Việt thực tế
- cần route riêng cho job có diarization

#### Verdict
**Đây là phương án “ít ngu nhất” nếu muốn ra tính năng nhanh.**

---

### Option B — Deepgram diarization
- Nova-3 monolingual: **$0.0077/phút**
- Speaker diarization: **$0.0020/phút**
- Tổng rough: **$0.0097/phút**
- Quy đổi thô: khoảng **252 VND/phút**

#### Ưu điểm
- mature voice infra
- diarization rõ ràng, streaming cũng mạnh

#### Nhược điểm
- đắt hơn AssemblyAI rất nhiều cho bài file upload
- không đáng nếu target hiện tại là creator / interviewer / recruiter ở bài cost-sensitive

#### Verdict
**Dùng được, nhưng không phải đường khôn nhất cho mình.**

---

### Option C — Tự ghép `pyannote` + current transcript pipeline
#### Shape kỹ thuật
- giữ `faster-whisper` để transcript
- thêm `pyannote.audio` để diarization
- rồi tự reconcile transcript segments với speaker segments

#### Ưu điểm
- chủ động hơn
- có thể tối ưu sâu về sau
- không khoá vào một vendor duy nhất

#### Nhược điểm
- implementation phức tạp hơn hẳn
- cần xử lý alignment giữa ASR segment và speaker segment
- khó debug hơn nhiều
- nếu không có GPU riêng ổn định, trải nghiệm sẽ khá chua
- open-source route tiết kiệm tiền runtime nhưng tăng mạnh chi phí công tích hợp + vận hành

#### Ghi chú
- pyannote có **Community-1 self-hosted** open-source route
- pyannoteAI cloud cũng có diarization + transcription orchestration, nhưng public docs không nêu một giá list đơn giản như AssemblyAI; dashboard mới là source of truth

#### Verdict
**Chỉ nên làm khi đã chắc diarization là core value thật, không phải ở vòng test đầu.**

---

## 3. Khuyến nghị thực dụng

### Chọn đường nào?
**Chọn Option A:**
- giữ pipeline hiện tại cho job thường
- chỉ bật diarization cho một mode riêng:
  - `Phỏng vấn 2 người`
  - hoặc `Interview mode`

### Vì sao đây là đường đúng
- không bắt app phải diarize tất cả audio
- không đội cost toàn hệ thống
- không đòi mình giải bài clustering/speaker alignment ngay từ đầu
- fit đúng target segment đang ưu tiên nhất: researcher / recruiter / interviewer

---

## 4. Cách rollout ít ngu nhất

### Phase 1 — Không đổi flow mặc định
Flow mặc định vẫn là:
- Chép lời
- Chép lời + Tóm tắt

Chưa bật speaker labeling đại trà.

### Phase 2 — Thêm một mode riêng
Thêm mode:
- **Phỏng vấn 2 người**

Hệ thống sẽ:
- route file qua diarization-capable provider
- trả transcript kiểu:
  - `Người 1:`
  - `Người 2:`
- summary dùng template interview/research thay vì summary chung chung

### Phase 3 — Nếu tín hiệu tốt
Mới tính đến:
- recruiter mode
- meeting/call recap mode
- mapping mềm `Người phỏng vấn` / `Người trả lời`

---

## 5. Output nên như thế nào
Không cần làm quá thông minh ở bản đầu.

Bản đầu chỉ cần:
- `Người 1` / `Người 2`
- mốc thời gian
- transcript tách speaker rõ ràng
- summary theo format interview

Ví dụ:
```text
[00:00 - 00:12] Người 1: Chào anh, hôm nay em muốn hỏi về trải nghiệm dùng sản phẩm...
[00:12 - 00:24] Người 2: Ok em, anh dùng nó khoảng 3 tháng rồi...
```

Đừng cố solve ngay:
- speaker identity thật
- nhận ra ai là interviewer/interviewee tuyệt đối
- overlap speech hoàn hảo

---

## 6. Cost rough nếu chỉ bật cho mode 2 người
### Với AssemblyAI
- Rough cost diarized transcript: **~74 VND/phút**
- Nếu bán mode premium hoặc combo interview, mức này vẫn chịu được hơn nhiều so với route Deepgram

### Ý nghĩa business
Nếu diarization chỉ áp dụng cho job premium/use case đặc thù:
- cost tăng nhưng vẫn kiểm soát được
- value user nhận được cao hơn transcript thường
- dễ justify pricing hơn summary generic

---

## 7. Những gì không nên làm
- không bật diarization cho mọi file ngay từ đầu
- không tự build pyannote reconciliation pipeline ở vòng đầu nếu chưa có demand thật
- không cố map speaker identity “xịn” khi mình mới chỉ cần `Người 1 / Người 2`
- không bán feature này cho đại trà trước khi test với file interview thật

---

## 8. Quyết định chốt
### Best next move
**Thêm mode “Phỏng vấn 2 người”, route bằng AssemblyAI diarization, trả transcript gắn `Người 1 / Người 2`, summary theo template interview.**

### One-line verdict
**Rẻ nhất và ít ngu nhất là không diarize toàn bộ app, mà chỉ mở diarization như một mode premium cho đúng use case 2 người.**

---

## Sources
- AssemblyAI pricing (official public pricing page checked earlier in session): `https://www.assemblyai.com/pricing`
- Deepgram pricing (official public pricing page checked earlier in session): `https://deepgram.com/pricing`
- pyannoteAI billing docs: `https://docs.pyannote.ai/administration/billing`
- pyannoteAI STT + diarization docs: `https://docs.pyannote.ai/tutorials/speech-to-text-diarization`
- pyannote open-source library docs: `https://pyannote.github.io/pyannote-audio/`
