# ThreadAuto: 새 주제 테스트 영상 2종 제작 (음성 포함)

## 작업 개요
ThreadAuto 파이프라인을 활용하여 새로운 주제로 콘텐츠를 생성하고, 2가지 렌더링 엔진으로 음성 포함 영상을 각각 제작한다.

## 작업 절차

### Step 1: 주제 선정 + 콘텐츠 생성
```python
import sys
sys.path.insert(0, "/home/jay/projects/ThreadAuto")

from content.topic_selector import TopicSelector
from content.content_generator_v2 import ContentGeneratorV2

# 1. 주제 선정 (고민공감 or 정보제공 카테고리 권장)
selector = TopicSelector()
topic = selector.select_topic()
print(f"선정된 주제: {topic}")

# 2. 콘텐츠 생성 (Claude CLI 호출)
generator = ContentGeneratorV2()
content = generator.generate(topic)
print(f"생성된 슬라이드: {len(content['slides'])}장")
```

- 주제가 보험/재무 관련이어야 함 (서울대보험쌤 브랜딩)
- 슬라이드 구조: cover + body 3~4장 + cta

### Step 2: TTS 음성 생성
```python
import asyncio
from audio.edge_tts_dialogue import synthesize_dialogue

# 슬라이드 내용을 대화체 스크립트로 변환
script = []
for slide in content['slides']:
    if slide['type'] == 'cover':
        script.append({"speaker": "호스트", "text": slide['hook']})
    elif slide['type'] == 'body':
        script.append({"speaker": "호스트", "text": slide['title']})
        script.append({"speaker": "게스트", "text": slide['description']})
    elif slide['type'] == 'cta':
        script.append({"speaker": "호스트", "text": slide['text']})

# TTS 생성
audio_path = asyncio.run(synthesize_dialogue(
    script=script,
    output_path="/home/jay/projects/ThreadAuto/output/videos/test_new_topic_voice.mp3",
    host_voice="ko-KR-SunHiNeural",
    guest_voice="ko-KR-InJoonNeural",
    host_rate="+5%",
    guest_rate="+5%",
    pause_ms=400
))
```

### Step 3: MoviePy 에반 스타일 영상 제작
```python
from video.evan_dynamic import EvanDynamicRenderer
from video.video_builder import _encode_frames_to_mp4

# 슬라이드 → 에반 스타일 씬 변환
scenes = []
for slide in content['slides']:
    if slide['type'] == 'cover':
        scenes.append({
            "duration": 3.0,
            "elements": [
                {"type": "text", "text": slide['hook'], "font_size": 52, "color": (255, 255, 255), "x": 540, "y": 400, "animation": "typing", "duration": 2.5},
                {"type": "text", "text": slide['title'], "font_size": 36, "color": (200, 200, 200), "x": 540, "y": 550, "animation": "fade_in", "duration": 2.0}
            ]
        })
    elif slide['type'] == 'body':
        scenes.append({
            "duration": 4.0,
            "elements": [
                {"type": "text", "text": slide['title'], "font_size": 44, "color": (255, 200, 50), "x": 540, "y": 300, "animation": "typing", "duration": 2.0},
                {"type": "text", "text": slide['description'], "font_size": 28, "color": (255, 255, 255), "x": 540, "y": 500, "animation": "fade_in", "duration": 3.0}
            ]
        })
    elif slide['type'] == 'cta':
        scenes.append({
            "duration": 3.0,
            "elements": [
                {"type": "text", "text": slide['text'], "font_size": 40, "color": (255, 255, 100), "x": 540, "y": 500, "animation": "fade_in", "duration": 2.0}
            ]
        })

renderer = EvanDynamicRenderer(width=1080, height=1920, fps=30)
frames = renderer.render_frames(scenes)
moviepy_path = _encode_frames_to_mp4(frames, "/home/jay/projects/ThreadAuto/output/videos/test_new_topic_moviepy.mp4", fps=30)
```

### Step 4: Remotion 영상 제작
```python
from renderer.remotion_adapter import slides_to_remotion_props
from remotion.render_bridge import RemotionBridge

# Remotion props 변환
props = slides_to_remotion_props(content, theme=None)  # 기본 테마

# Remotion 렌더링 (video)
bridge = RemotionBridge(remotion_dir="/home/jay/projects/ThreadAuto/remotion")
remotion_path = bridge.render_video(
    composition_id="CardNews",  # 또는 적절한 composition
    props=props,
    output_path="/home/jay/projects/ThreadAuto/output/videos/test_new_topic_remotion.mp4"
)
```

### Step 5: 음성 합성 (영상 + 오디오)
두 영상 모두에 음성을 합성한다.

```python
from moviepy.editor import VideoFileClip, AudioFileClip

for video_name in ["test_new_topic_moviepy", "test_new_topic_remotion"]:
    video_path = f"/home/jay/projects/ThreadAuto/output/videos/{video_name}.mp4"
    audio_path = "/home/jay/projects/ThreadAuto/output/videos/test_new_topic_voice.mp3"
    output_path = f"/home/jay/projects/ThreadAuto/output/videos/{video_name}_with_voice.mp4"

    video = VideoFileClip(video_path)
    audio = AudioFileClip(audio_path)

    # 오디오 길이에 맞춰 조정
    if audio.duration > video.duration:
        video = video.loop(duration=audio.duration)

    final = video.set_audio(audio.subclip(0, min(audio.duration, video.duration)))
    final.write_videofile(output_path, codec="libx264", audio_codec="aac")
```

## 최종 출력 파일 (2개, 파일명 다르게)
1. `/home/jay/projects/ThreadAuto/output/videos/test_new_topic_moviepy_with_voice.mp4` — MoviePy 에반 스타일 + 음성
2. `/home/jay/projects/ThreadAuto/output/videos/test_new_topic_remotion_with_voice.mp4` — Remotion 엔진 + 음성

## 주의사항
- 에반 6원칙 유지: 검정배경, 테마색상, 레이아웃변주, 타이핑효과, 시간차등장, 다이나믹
- TTS 음성이 영상 내용과 자연스럽게 매칭되어야 함
- 각 파이프라인 단계에서 에러 발생 시 로그 보존하고 보고서에 포함
- 의미 있는 콘텐츠 사용 (검정 화면, 무의미 데이터 금지)
- Remotion 서버가 필요하면 `cd remotion && node render-server/server.ts &` 로 시작
- Remotion render_bridge가 CLI 방식이면 서버 없이도 가능할 수 있음 — 코드 확인 후 판단

## 프로젝트 경로
- `/home/jay/projects/ThreadAuto/`
