date: 2026-08-14
agent: Claude
mark: _Claude
type: standard
status: active
PD 파이프 두 레인 — 공짜 공장 vs 구독 다큐
기존
produce_pd.sh(공짜)와 신규produce_doc.sh(구독 Grok)를 두 레인으로 분리한다.
꼬리(조립·BGM·자막·TG)만 공유하고, 머리(입력·비주얼·성우)가 다르다.
근거: 83-momentum-2026-08-14_Grok.md · 72-pd-pipeline-standard-v2-lock_Grok.md
0. 한 줄
┌─────────────────────────────────┐
│ 공용 꼬리 (둘 다 같이 씀 · $0) │
│ concat/xfade · BGM sidechain │
│ ASS/SRT 자막 · QA · TG 720p │
└──────────▲───────────▲──────────┘
│ │
┌───────────────────────┴───┐ ┌───┴───────────────────────┐
│ 레인 A · 공짜 공장 │ │ 레인 B · 구독 다큐 │
│ produce_pd.sh (지금 그대로) │ │ produce_doc.sh (신규) │
└───────────────────────────┘ └───────────────────────────┘
1. 두 레인 경계
| 레인 A · 공짜 공장 | 레인 B · 구독 다큐 | |
|---|---|---|
| 조건 | 구독 없이 항상 | Grok 구독 있을 때만 |
| 입력 | URL | 내/누나 사진 1장 + 대사 |
| 비주얼 | Playwright 캡처 | 비전 → 합성 → I2V 10초 |
| 성우 | Edge TTS (YuJin) | Grok TTS + RVC 더빙 |
| 렌더 | Ken Burns | 그대로 concat |
| 엔트리 | produce_pd.sh (변경 금지) |
produce_doc.sh (신규) |
| Grok 의존 | 0 | 100% |
공용 꼬리 (레인 불문, 전부 무료 도구):
- shot_bible 구조 (beat = 씬 단위)
- concat demuxer / xfade (조립)
- BGM sidechain ducking (_pd_assemble.py)
- ASS/SRT 자막 (_make_ass.py · _make_srt.py)
- QA 게이트 · TG 720p 전송
2. 레인 A — 공짜 공장 (produce_pd.sh, Grok 제로)
규칙:
- [x] produce_pd.sh는 Grok 관련 코드 한 줄도 안 들어감. 지금 상태 그대로 락.
- [x] 구독이 끊겨도(취소·403·토큰 고갈) 레인 A는 계속 돈다. (헌법 “AI 의존성 제로”와 같은 원칙)
- [x] 이 레인을 “Grok 플러그 역할”이라고 부르지 않는다. (83 §4-3)
bash scripts/produce_pd.sh pd_intro
3. 레인 B — 구독 다큐 (produce_doc.sh, 신규)
입력 → 출력 (83 §3):
[안드로이드] 누나 얼굴 사진 1장
│ (안드로이드↔proot 브릿지, 이미 있음)
▼
[비전] 얼굴 참조 고정 + 구도/장면 인식
[합성] image_edit — 그 얼굴이 장면 안에 앉는다
[클립] image_to_video duration=10 (딥페이크급 연속)
[더빙] 프롬프트(=대사)를 Grok TTS + RVC로
[조립] FFmpeg concat — 10초 + 10초 + …
P0→P6 매핑 (기존 공장에서 재활용):
| 단계 | 레인 A (지금) | 레인 B (변형) |
|---|---|---|
| P0 | URL 파싱 → shot_bible | 사진 1장 + 대사 리스트 (=shot_bible) |
| P0.5 | 콘텐츠→VO 생성 | 프롬프트=대사가 1차 입력 (비주얼이 대사를 따름) |
| P0.6 | zoom/color_tag 연출 | 대사별 장면·카메라·감정 (I2V 프롬프트) |
| P1 | Playwright 캡처 | image_to_video 10초 |
| P2 | Edge TTS | Grok TTS + RVC |
| P4 | Ken Burns | 그대로 concat |
| P4b/P4c · P5 · P5b · P6 | 자막·BGM·SRT·TG | 동일 (공용 꼬리) |
핵심 단위: 1 beat = 1 클립 = 1 대사 = 10초. 얼굴은 같은 참조 사진으로 고정(클립 간 연속성).
4. 저작권 경계 — 3단 + “포맷 자유 / 표현 보호”
| 단계 | 원칙 |
|---|---|
| 입력(사진) | 퍼블릭도메인 + 내가 찍은 사진 + 내/누나 사진 — 초상권 100% 소유, 문제 없는 것만 합성 |
| 참조(구도) | 80년대 일본 잡지의 구도/프레임(스토리텔링 구조)만 |
| 출력(콘텐츠) | 전부 내 것 + 누나 것 |
법칙: 방송 형식(포맷)에 저작권이 없는 것과 동일 원리.
- 포맷(구도·프레임·전개 구조) = 자유 — 아이디어
- 표현(사진·원문·인물·스토리) = 보호 — 전부 내/누나 것으로 대체
⚠️ 정직한 주의: 80년대 잡지 자체는 저작권 보호기간(70년) 안이라 퍼블릭도메인이 아니다.
안전한 이유는 “구도(아이디어)만 가져오고 표현을 안 가져오기” 때문.
캐릭터(인물)는 저작권+상표로 별도 보호 → 전부 내/누나 것으로 갈아끼운다.
“그 잡지 페이지를 통째로 스캔해 재배포”만 하지 않으면 된다.
파이프에 박을 메타데이터:
{
"source": "own_photo | public_domain",
"ref_composition": "80s_jp_magazine_frame_only",
"content_origin": "self | 누나"
}
5. 게이트 — GROK_SUB + PUBLISH
① 구독 스위치 (레인 B 진입 조건):
GROK_SUB="${GROK_SUB:-off}" # off면 레인 B 아예 안 켜짐
[[ "$GROK_SUB" == "on" ]] || { echo "⛔ Grok 구독 없음 — 레인 B 스킵. 레인 A는 그대로."; exit 0; }
레인 A는 이 스위치를 아예 안 본다. “구독 있음/없음”이 파이프 선택.
② 공개 범위 플래그 (헌법 제15조):
PUBLISH="${PUBLISH:-private}" # public이어야 외부 발행 허용
private→ TG 내부 보고까지만public→ YouTube 등 외부 발행 (헌법 15조 공개범위는 Boss 결정 — 83 §6)
6. 비전 = 두 칸 공통 게이트
| 칸 | 비전이 읽는 것 | 그 다음 |
|---|---|---|
| ① 잡지 구도 | 그리드·여백·타이포·악센트 (구도 = 아이디어) | 그 구조로 웹 코드 → 프롬프트면 내 이미지로 교체 |
| ② 딥페이크 다큐 | 내/누나 얼굴 (참조 고정) | 장면 합성 → I2V → 더빙 → 이어붙임 |
$30이 사는 본체 = 비전 + 생성. “웹코딩을 잘하는 설정” 이유 = 사진 업로드 + 비전 Grok 철저 활용.
7. 체크리스트 (다음 작업)
- [ ]
produce_doc.sh스캐폴드 작성 (레인 B 엔트리 +GROK_SUB게이트) - [ ]
_face_pickup.sh—~/inbox/DCIM에서 사진 1장 감지 (기존_bridge_pickup.sh변형) - [ ] QA 재정의 — 클립 간 얼굴 연속성 + 10초 길이 + 더빙-자막 동기화
- [ ] 저작권 메타 +
PUBLISH플래그를 shot_bible에 반영 - [ ] 레인 A 회귀 테스트 (Grok 제로 유지 확인)
— _Claude · 표준