# V3 학습 데이터셋 생성 파이프라인 설계

> 작성일: 2026.04.21
> 관련 문서: `V3_PIPELINE_DECISIONS_2026-04-20.md`, `V3_IMPLEMENTATION_PLAN_v2.md`

---

## 1. 목적

V3 감정 립싱크 모델의 학습용 타겟 데이터를 만드는 파이프라인을 정의합니다.
핵심은 **3가지 소스를 결합하여**, 감정·프로소디·립싱크가 모두 자연스럽게 담긴 블렌드쉐입 타겟을 생성하는 것입니다.

- **감정 표현은 정확하게** (작성한 프리셋 기반)
- **말의 흐름에 따라 표정이 움직이게** (V2의 프로소디 학습 활용)
- **입 모양은 가장 좋은 모델로** (LAM 립싱크)

---

## 2. 전체 구조

```
                    오디오 (ElevenLabs TTS, 2013개 시나리오)
                           │
           ┌───────────────┼───────────────┐
           ▼               ▼               ▼
          V2           LAM 립싱크        141-dim
  (프로소디 기반       (Korean           오디오 피처
   얼굴 움직임)        specialized)       (V3 입력용)
           │               │               │
       v2_bs (T,52)    lam_bs (T,52)       │
           │               │               │
           ▼               │               ▼
     v2_dynamics           │         .npz의 audio
     (= v2_bs −            │         입력 피처로 저장
      v2_bs.mean)          │
           │               │
           │        (emotion, VAD)
           │               │
           │               ▼
           │          Compiler
           │    (47개 작성 프리셋 + VAD 매핑)
           │               │
           │          comp_bs (T,52)
           │           ▲ static per turn
           │               │
           └───────────┐   │
                       ▼   ▼
           expression = comp_bs + α × v2_dynamics
                               │
                               ▼
                   기존 채널 룰로 LAM과 머지
                   (LIPSYNC_ONLY / EXPRESSION_ONLY / SHARED)
                               │
                               ▼
                       target (T, 52) → .npz 저장
```

---

## 3. 각 소스의 역할

| 소스 | 강점 | 담당 |
|---|---|---|
| **Compiler + 작성 프리셋 47개** | 본인이 직접 오센터링하여 감정 포즈가 명확함 | 감정의 **기본 포즈** (화남 → 코 찡그림 등) |
| **V2 모델** | 실제 오디오·얼굴 페어 데이터로 학습됨. 프로소디에 얼굴이 반응하는 패턴을 알고 있음 | **움직임의 디테일** (강조 음절에서 눈썹이 더 찡그려지는 등) |
| **LAM (102M params)** | 한국어 대규모 학습, 최고 수준 립싱크 | **입 모양** |

### V2 dynamics 추출 방법

V2의 원본 출력을 그대로 쓰면 V2가 가진 자체 감정 바이어스가 Compiler의 포즈와 충돌할 수 있습니다.
이를 방지하기 위해:

```
v2_dynamics = v2_bs − v2_bs.mean(axis=0)
```

**프레임별 평균을 빼서 '움직임' 성분만** 남깁니다.
이러면 V2의 정적 포즈는 Compiler가 담당하고, V2는 프로소디에 따른 모듈레이션만 담당하게 됩니다.

---

## 4. 이 구조가 주는 이점

### 4.1 정적 표정 문제 해결
현재 프리셋만 사용하면 한 턴 동안 얼굴이 **고정**되어 있어 부자연스럽습니다.
V2 dynamics를 얹으면 프로소디에 따라 미세한 움직임이 생겨 훨씬 살아있는 느낌이 됩니다.

### 4.2 감정 정확성 보장
규칙 기반(Compiler)이 기본 포즈를 잡아주기 때문에, 프로소디가 약한 구간에서도
감정이 사라지지 않습니다. (V2 단독으로 쓸 경우의 리스크)

### 4.3 V2 → V3 가중치 전이 (보너스)
V3의 오디오 입력을 **V2와 동일한 141-dim 피처**로 맞추면,
V3 학습 시 V2의 사전학습 가중치를 **초기값으로 사용**할 수 있습니다.
→ 수렴 속도 향상, 데이터 요구량 감소.

---

## 5. 파이프라인 단계

| 단계 | 내용 | 상태 |
|---|---|---|
| 1 | ElevenLabs TTS로 오디오 생성 (2013개, 20개 voice pool) | ✅ 완료 |
| 2 | V2 Python 추론 환경 검증 (30분) | 예정 |
| 3 | V2 Wrapper 통합 및 머지 로직 수정 (1~2시간) | 예정 |
| 4 | 샘플 시나리오 1개로 뷰어에서 품질 확인 | 예정 |
| 5 | 전체 2013개 시나리오 타겟 재생성 | 예정 |
| 6 | V3 모델 학습 (V2 가중치 초기값) | 예정 |

---

## 6. 리스크 및 완화 방안

### 🟡 리스크 1: V2의 표정 채널 품질 미지수
V2는 립싱크 중심으로 학습되었을 가능성이 있어, 눈썹/볼 등의 표정 채널이 약할 수 있습니다.

**완화책**
- 본격 통합 전 **검증 단계**에서 V2를 샘플 오디오에 돌려보고 눈썹·볼 채널의 움직임 크기를 확인.
- 움직임이 약하면 α 파라미터를 조절하거나, 프로소디 피처(pitch/energy) 기반 보조 룰을 추가.

### 🟡 리스크 2: V2와 Compiler 간 포즈 충돌
V2의 자체 감정 바이어스가 Compiler 포즈와 어긋날 가능성.

**완화책**
- **mean-centering**으로 V2의 정적 포즈를 제거 → 움직임만 사용.
- α ≈ 0.4~0.6 범위에서 튜닝하여 균형 조정.
- 뷰어에서 시각적으로 A/B 비교.

### 🟢 리스크 3: α 하이퍼파라미터 튜닝
Compiler와 V2 dynamics 간의 비율(α)이 얼마가 최적인지 미리 알기 어려움.

**완화책**
- 한 샘플에 대해 α=0.3, 0.5, 0.7 세 가지 버전을 생성 후 뷰어로 비교.
- 시각 평가만으로 충분히 결정 가능.

### 🟢 리스크 4: 전체 재생성 시간
2013개 시나리오 × 다중 모델 추론 → 수 시간 소요.

**완화책**
- 1회만 생성하면 되는 작업. 야간 혹은 GPU 유휴 시간 활용.
- 오디오는 이미 완성되어 있으므로 재생성 불필요.

### 🟢 리스크 5: 16개 서브 감정 → V2의 5개 베이스 감정 매핑
V2는 5개 베이스 감정만 알기 때문에 매핑 필요.

**완화책**
- 이미 `tts.py`에 매핑 테이블 존재 (joy/sadness/anger/surprise/neutral).
- V2 dynamics는 어차피 움직임 성분이므로 베이스 감정 수준의 매핑으로 충분.

---

## 7. V2 파인튜닝과의 관계

"이렇게 만든 타겟을 가지고 V2 파인튜닝만 해도 충분하지 않은가?" 라는 질문이 있을 수 있습니다.

**답변: 보완 관계**
- 이 타겟 구조는 **V2 파인튜닝 실험의 품질도 올려줍니다.** (정적 타겟보다 오디오와 잘 맞음)
- 다만 V2는 audio-only 입력이라 MicroALBERT의 텍스트 기반 감정 분류 결과를 활용할 수 없음.
- V3는 audio + emotion + VAD를 모두 받기 때문에 텍스트·오디오가 불일치할 때 더 강건함.

→ **V2 파인튜닝은 빠른 실험**, **V3는 본격 모델**로 두 트랙 병행 가능.

---

## 8. 검증 계획

### 8.1 V2 품질 스팟체크 (구현 전)
- `daily_003` 시나리오의 첫 턴 오디오로 V2 추론.
- 눈썹·볼 채널 값의 시간 축 그래프 확인.
- 평균 움직임 크기가 0.05 미만이면 약함 → 프로소디 룰 보조.

### 8.2 단일 시나리오 전체 검증 (구현 후)
- 동일한 시나리오를 세 버전으로 생성:
  - (A) Compiler만
  - (B) Compiler + LAM (현재 파이프라인)
  - (C) Compiler + LAM + V2 dynamics (제안 구조)
- 뷰어에서 나란히 비교하여 C가 가장 자연스러운지 확인.

### 8.3 전체 데이터셋 통계 검증
- 채널별 표준편차 분포 확인.
- EXPRESSION_ONLY 채널의 시간적 분산이 현재 파이프라인보다 증가했는지 확인 (= 움직임이 생겼다는 증거).

---

## 9. 다음 액션

- [ ] V2 Python 추론 환경 구축 및 스팟체크 (30분)
- [ ] 결과에 따라 통합 진행 여부 결정
- [ ] 통합 및 단일 시나리오 검증
- [ ] 최종 확인 후 전체 재생성

---

## 부록: 현재 완성된 자산

- ✅ 오디오 데이터셋 2013개 시나리오 (`data/audio_preview/`)
- ✅ 작성된 표정 프리셋 47개 (16감정 × L1/L3/L5 + neutral)
- ✅ Rule-based Compiler (`scripts/compiler/`)
- ✅ 데이터 파이프라인 스크립트 (`scripts/compiler/data_pipeline.py`)
- ✅ 시각 검증용 블렌드쉐입 플레이어 (`tools/blendshape-player.html`)
- ✅ Python에서 V2 추론 가능한 환경 확인
  (`/dataset/mead-expression-training/e2f/distill/`)
- ✅ LAM 모델 체크포인트 확보 (황준희 매니저님 checkpoint)
