# V3 데이터셋 생성: 두 가지 접근법 비교

> V3는 16개 감정(5 Base + 11 Sub)을 학습하기 위해 합성 데이터셋이 필요합니다.
> 핵심 아이디어는 동일: **MEAD base blendshape + VAD delta → 하위 감정 생성.**
> 이 문서는 데이터셋을 만드는 **두 가지 방법**을 비교합니다.

---

## 공통 사항 (두 접근법 모두 동일)

- **16개 감정 클래스**: 5 Base (JOY, SADNESS, ANGER, SURPRISE, NEUTRAL) + 11 Sub
- **3-Way 채널 분류**: LIPSYNC_ONLY(14) / EXPRESSION_ONLY(22) / SHARED(16)
- **프로덕션 모델**: EmotionFaceStreamableModel (5.4MB, 브라우저, `NUM_EMOTION_CLASSES=16`)
- **학습 데이터 형식**: `precomputed_features/{clip_id}.npy (T,141)` + `teacher_outputs/{clip_id}.npy (T,52)`
- **VAD 기반 강도 스펙트럼**: 감정 × 강도 → VAD 좌표 → blendshape 조정

**차이는 오직 "데이터셋을 만드는 방법":**

```
접근법 A (Rule-based):   MEAD base + VAD delta 공식 계산 → 데이터셋 → 프로덕션 모델 학습
접근법 B (Neural):       MEAD base + 학습된 생성 모델이 생성 → 데이터셋 → 프로덕션 모델 학습
```

---

## 접근법 A: Rule-based 생성기

> 상세 계획: `V3_IMPLEMENTATION_PLAN_v2.md`

### 작동 방식

```python
# 핵심 코드 (약 100줄)
target = base_blendshapes.copy()                           # MEAD 실제 데이터
delta = vad_delta_to_blendshape_delta(dV, dA, dD)          # VAD 차이 → 52채널 조정값
target[:, EXPRESSION_ONLY] += delta[EXPRESSION_ONLY]       # 표정 채널에 delta 적용
target[:, SHARED] += delta[SHARED] * speech_attenuation     # 공유 채널은 발화 감쇠
target[:, LIPSYNC_ONLY] = lam_output[:, LIPSYNC_ONLY]      # 립싱크는 LAM 그대로
```

### 특징
- 학습 불필요, CPU에서 즉시 실행
- VAD→blendshape 변환은 연구 문서 기반 파라메트릭 공식
- 스타일 모드 (감정당 2-3개 gain vector)로 변이 추가
- 특수 패턴 (jaw 진동, 턱 떨림) 별도 코드로 추가
- 출력: ~15,000-20,000 클립

---

## 접근법 B: Neural 생성 모델 (ExpressionVAE)

### 작동 방식

```
[오디오 141차원] → Audio Encoder → features
                                      ↓
[감정 16차원 + 강도 + 스타일] ──→ Extended FiLM → γ, β
                                      ↓
[z_style ~ N(0,I)] ─────────────→ 합류
[z_emotion = VAD 좌표] ─────────→ 합류
                                      ↓
                              features * (1+γ) + β
                                      ↓
                              TCN Decoder (4 blocks)
                                      ↓
                              52 blendshapes (EXPRESSION 채널)
                                      +
                              LAM 출력 (LIPSYNC 채널)
                                      =
                              학습 타겟 (T, 52)
```

### 아키텍처: Conditional VAE

**왜 VAE인가:**
- latent space의 3차원을 **VAD 좌표로 초기화** → 감정 공간이 처음부터 의미 있는 구조
- z_style 샘플링 → 같은 감정이라도 매번 다른 자연스러운 변형
- Diffusion은 생성 속도 느림 (수십 step), GAN은 학습 불안정, Flow는 과도한 복잡도

| 컴포넌트 | 사양 |
|---------|------|
| Audio Encoder | 141 → 256, LayerNorm, GELU |
| Posterior Encoder (학습 시만) | (256+52) → 128 → μ(35), logσ²(35) |
| z 차원 | z_style(32) + z_emotion(3) = 35 |
| Extended FiLM | 감정(16) + 강도(1) + 스타일(8) + z(35) → γ, β |
| TCN Decoder | 4 dilated conv blocks (k=5, dilation 1,2,4,8) |
| 총 파라미터 | ~12-15M (~25MB FP16) |

### z 벡터의 두 가지 역할

**z_style (32차원)** — 화자/표현 스타일 다양성:
```
학습 시: GT blendshape에서 posterior encoder가 추론
생성 시: N(0,I)에서 랜덤 샘플링
효과: 같은 "감사" 감정이라도 z가 다르면 다른 스타일의 표정
```

**z_emotion (3차원)** — VAD 공간:
```
학습 시: posterior encoder 추론 + VAD 정규화 손실로 유도
생성 시: 감정 테이블에서 VAD 좌표 룩업
특수 능력: 학습 데이터에서 "실제 VAD"를 자기 보정 가능
  (예: 한국인의 감사 표현이 서양 VAD 문헌보다 arousal이 높다면 자동 반영)
```

### 학습 전략

```
Phase A: MEAD 5개 감정으로 앵커 학습 (50 에포크, 1-2 GPU일)
  → z_emotion이 5개 VAD 앵커 주변으로 조직화
  → 오디오-표정 기본 관계 학습

Phase B: 보간 검증
  → z_emotion 공간에서 5개 앵커 사이 보간
  → 자연스러운 중간 표정이 생성되는지 확인

Phase C: 11개 하위 감정 확장 (30 에포크)
  → Rule-based 데이터 또는 소량 실제 데이터로 fine-tune
  → MEAD 30% + 확장 데이터 70% 혼합
  → 하위 감정별 구체적 패턴 학습

Phase D: 대규모 생성
  → ~960,000 클립 (GPU에서 ~12분)
  → 3-Way 채널 합성 적용
```

### 손실 함수

```python
L = L_recon + β × L_KL + λ_vad × L_vad + λ_lip × L_lipsync

L_recon:  채널 가중치 적용 L1 (LIPSYNC ×3, SHARED ×1.5, EXPRESSION ×1)
L_KL:    KL divergence (0 → 0.001 annealing, 15 에포크)
L_vad:   z_emotion 3차원 → 알려진 VAD 좌표 유도 (MSE, λ=0.1)
L_lip:   LIPSYNC 채널 velocity 매칭 (L1, λ=5.0)
```

---

## 정직한 비교

### 비교 테이블

| 기준 | A (Rule-based) | B (Neural) | 승자 |
|------|:-:|:-:|:-:|
| **표정 자연스러움** | B+ (실제 base + 파라메트릭 delta) | A-~C+ (데이터에 의존) | **A** (현재 데이터 상황) |
| **표현 다양성** | C+ (공식적, bounded) | B+ (연속적 latent) | **B** (구조적으로) |
| **오디오-표정 동기화** | C (보호만, 생성 안 함) | B+ (학습으로 획득) | **B** (충분한 데이터 시) |
| **생성 규모** | A- (빠르나 한계적 다양성) | A (대규모 + 높은 한계 다양성) | **B** |
| **Artifact 위험** | 높음 (체계적, 모델이 규칙 복제) | 중간 (확률적, 복제 어려움) | **B** |
| **개발 기간** | 1-2주 | 4-6주 | **A** (3-4배 빠름) |
| **데이터 의존도** | 낮음 (MEAD 4,488이면 충분) | 높음 (최소 20,000+ 필요) | **A** (결정적) |
| **제어 가능성** | A (모든 계수 직접 조절) | C+ (간접적, 불투명) | **A** |
| **Chicken-and-egg** | 해결함 (VAD 공식으로) | A에 의존 (학습 데이터 필요) | **A** |
| **장기 품질 상한** | 중간 (규칙의 한계) | 높음 (데이터 추가 시 향상) | **B** |

### 각 접근법의 핵심 강점

**A가 B보다 나은 점:**
1. **즉시 사용 가능** — 학습 없이 CPU에서 실행
2. **데이터 없이도 새 감정 생성 가능** — VAD 좌표만 있으면 됨
3. **완전한 제어** — 결과가 이상하면 계수 하나 바꾸면 됨
4. **실패 시 손실 적음** — 1-2주 투자, 안 되면 바로 조정

**B가 A보다 나은 점:**
1. **오디오-표정 미세 동기화** — "고마워" 끝의 억양 변화에 browInnerUp이 반응하는 타이밍 학습
2. **자연스러운 시간적 역학** — onset/hold/release가 학습된 패턴, 규칙적이지 않음
3. **진정한 다양성** — z 샘플링으로 의미 있는 변형 (노이즈가 아닌 스타일 변이)
4. **자기 보정** — VAD 좌표가 데이터에 맞게 자동 조정
5. **확장 가능** — 실제 데이터 추가 시 품질 자동 향상

### 각 접근법의 핵심 위험

**A의 위험:**
- **"규칙 복제"**: 프로덕션 모델이 delta 공식을 외워버림 → 항상 같은 표정
- **시간적 단조로움**: smoothstep + sin() 진동은 인간이 보면 기계적
- **공유 채널 충돌**: speech_activity × 0.7 감쇠가 모든 상황에 맞지 않음

**B의 위험:**
- **데이터 부족** (현재 4,488 클립, 최소 20,000+ 필요):
  - Posterior collapse → z가 무시됨 → 모든 출력 동일
  - 시간적 평균화 → 진동/떨림이 뭉개져 "물렁한" 표정
  - 모드 혼합 → happy와 surprised 경계에서 이상한 블렌드
- **학습 실패 시 4-6주 손실**
- **디버깅 어려움** — 결과가 이상해도 원인 특정 어려움

---

## 실행 시나리오 비교

### 시나리오 1: A만 사용

```
Week 1-2: Rule-based 생성기 구현 + 데이터 생성
Week 3-5: 프로덕션 모델 학습 + 검증 + 배포
결과: 16개 감정 동작하는 V3. 표정이 약간 규칙적이지만 기능적.
위험: 낮음
```

### 시나리오 2: B만 사용

```
Week 1-3: ExpressionVAE 아키텍처 구현
Week 3-5: MEAD로 학습 (4,488 클립) → 아마 부족, 품질 문제 발생
Week 5-7: 디버깅, 하이퍼파라미터 튜닝, 데이터 보강 시도
Week 7-9: 데이터 생성 + 프로덕션 모델 학습
결과: 불확실. 성공 시 A보다 자연스러움. 실패 시 A를 다시 만들어야 함.
위험: 높음 (데이터 부족이 근본 원인)
```

### 시나리오 3: A 먼저, B로 개선

```
Week 1-2: Rule-based 생성기 구현 + 데이터 생성 (~15K 클립)
Week 3-5: 프로덕션 모델 학습 → V3 첫 버전 배포
Week 5-8: ExpressionVAE를 A의 출력 + MEAD로 학습 (~20K 클립, 최소 기준 충족)
Week 8-10: 생성 모델로 대규모 데이터 → 프로덕션 모델 재학습 → V3.1 배포
결과: 빠른 V3 확보 + 이후 품질 개선. A의 출력이 B의 학습 데이터.
위험: 낮음 (A가 안전망, B는 보너스)
```

---

## 접근법 B 상세: ExpressionVAE 구현 계획

### 파일 구조

```
/dataset/mead-expression-training/
  e2f/generator/
    model.py                    # ExpressionVAE (Audio Encoder + Posterior + FiLM + TCN)
    film_extended.py            # GeneratorFiLM (emotion+intensity+style+z → γ,β)
    posterior_encoder.py        # GT blendshape → μ, logσ²
    losses.py                   # L_recon + L_KL + L_vad + L_lipsync
    train_generator.py          # Phase A/C 학습
    generate_dataset.py         # Phase D: 대규모 생성
    validate.py                 # 5개 자동 검증 메트릭
```

### 학습 데이터 요구사항

| 출처 | 클립 수 | 역할 |
|------|--------|------|
| MEAD 실제 | 4,488 | Phase A 앵커 학습 (5개 감정) |
| Rule-based 합성 (접근법 A 출력) | ~15,000 | Phase C 하위 감정 학습 |
| ElevenLabs + LAM | ~5,000 | 추가 오디오-blendshape 페어 |
| (선택) RAVDESS/CREMA-D | ~7,000 | 외부 영어 감정 데이터 |
| **합계** | **~20,000-31,000** | 최소 기준 충족 |

> **핵심**: B는 A의 출력을 학습 데이터로 사용. A 없이 B 단독은 데이터 부족으로 실패 위험 높음.

### 품질 검증 (5개 자동 메트릭)

| 메트릭 | 기준 | 실패 시 |
|--------|------|--------|
| 립싱크 보존 | LIPSYNC 채널 상관계수 > 0.99 | 채널 마스크 강화 |
| 감정 구분도 | 계열 간 코사인 거리 > 0.3 | FiLM 학습률 조정 |
| 시간적 매끄러움 | 가속도 < 0.015 | 시간적 smoothness 손실 추가 |
| 해부학적 타당성 | 길항근 동시 활성화 = 0건 | 후처리 클램프 추가 |
| 강도 단조성 | 강도↑ → 표현↑ | 강도 conditioning 검증 |

---

## 최종 권장사항

| 상황 | 권장 |
|------|------|
| 빠른 V3 출시가 우선 | **A 단독** |
| 최고 품질이 우선 + 시간 충분 + GPU 가용 | **A 먼저, B로 개선 (시나리오 3)** |
| B 단독 | **비권장** (데이터 부족) |

두 접근법은 **같은 VAD 아이디어, 같은 16개 감정, 같은 3-Way 채널, 같은 프로덕션 모델**을 공유합니다.
유일한 차이: 데이터셋을 **공식으로 계산**하느냐, **학습된 모델이 생성**하느냐.

---

## 부록: 관련 문서

| 문서 | 내용 |
|------|------|
| `V3_IMPLEMENTATION_PLAN_v2.md` | 접근법 A 상세 (16개 감정, VAD delta, 3-way 채널, 파이프라인) |
| `research/vad-to-arkit-blendshape-mapping.md` | VAD→blendshape 파라메트릭 규칙 |
| `research/emotion-blendshape-patterns.md` | 감정별 blendshape 패턴 + 범위 |
| `research/vad-to-mead-emotion-mapping.md` | VAD↔MEAD 매핑 알고리즘 |
