# task-465.1 보고서: 에반 스타일 영상에 TTS 음성 합성 + 싱크

## 작업 요약
에반 스타일 영상(`video/evan_dynamic.py`)에 한국어 TTS 나레이션을 합성하여 최종 영상을 생성하는 파이프라인을 구현했다.

## 핵심 구현 내용

### Audio-Video Sync 메커니즘
1. edge-tts로 5개 장면별 나레이션 MP3 생성 (남성 ko-KR-InJoonNeural, +8% 속도)
2. pydub으로 각 MP3 길이 측정
3. evan_dynamic 렌더러의 장면별 duration을 `음성 길이 + 0.4초 여백`으로 재조정
4. moviepy로 duration 맞춘 무음 영상 재렌더링
5. ffmpeg으로 영상 + 음성 mux

### 나레이션 텍스트 (5장면)
1. "매달 나가는 보험료, 혹시 새고 있진 않으신가요?"
2. "실제로 보험 가입자 78%가 3년 안에 해지합니다. 제대로 설계가 안 됐기 때문이죠."
3. "특약 정리, 중복 보장 확인, 갱신형에서 비갱신으로 전환. 이 세 가지만 점검해도 달라집니다."
4. "보장을 제대로 활용하면 실질 보장률이 15%에서 95%까지 올라갈 수 있습니다."
5. "지금 바로 내 보험 점검해보세요. 서울대보험쌤이 도와드리겠습니다."

## 생성/수정 파일

- `video/tts_sync.py` (신규) — TTS + 싱크 파이프라인 모듈
  - `generate_narration()` — edge-tts로 장면별 MP3 생성
  - `measure_durations()` — 오디오 길이 측정
  - `concat_audio()` — 오디오 이어붙이기 (scene gap 포함)
  - `render_with_audio()` — duration 재조정 후 무음 영상 렌더링
  - `mux_audio_video()` — ffmpeg 영상+오디오 합성
  - `generate_evan_with_voice()` — 전체 파이프라인
- `video/tests/test_tts_sync.py` (신규) — TDD 5개 테스트

## 산출물

- `/home/jay/projects/ThreadAuto/output/videos/threads_evan_with_voice.mp4` — 최종 영상
  - 1080x1920, H.264, 30fps, 38.4초
  - 오디오: AAC, 24kHz, mono
  - 파일 크기: 879KB
- `/home/jay/projects/ThreadAuto/output/videos/threads_evan_with_voice_thumb.png` — 썸네일 (31KB)

## 테스트 결과

### 단위 테스트 (5/5 PASSED)
- `test_generate_narration_creates_files` — edge_tts mock, MP3 파일 생성 확인
- `test_measure_durations_returns_floats` — 실제 pydub 무음 파일 길이 측정
- `test_concat_audio_total_length` — concat 총 길이 = sum(각 길이) + n*gap
- `test_render_with_audio_adjusts_duration` — duration 재조정 로직 검증
- `test_mux_audio_video_creates_output` — ffmpeg mux 출력 파일 확인

### 통합 검증
- 전체 video/tests/ 401개 테스트 PASSED (회귀 없음)
- 최종 영상 ffprobe 검증: 비디오+오디오 2스트림, 38.4초 동일 (싱크 정확)

### 코드 품질
- pyright: 0 errors, 0 warnings
- black + isort: 변경 없음 (이미 적용)

## 버그 유무
없음

## 머지 판단
- **머지 필요**: Yes
- **브랜치**: task/task-465.1-dev1
- **워크트리 경로**: /home/jay/projects/ThreadAuto/.worktrees/task-465.1-dev1
- **머지 의견**: 401개 테스트 전체 통과, pyright 0 에러, 기존 코드 변경 없이 신규 파일 2개만 추가. 충돌 가능성 없음. 머지 권장.
