feat:트렌딩 키워드 수집 + Veo 3.1 프롬프트 강화 파이프라인
- Google Trends RSS 기반 실시간 급상승 키워드 수집 서비스 추가 - 트렌딩 컨텍스트 활용 후킹 제목 생성 (5패턴: 충격/비교/숫자/질문/반전) - Veo 3.1 공식 가이드 기반 visual_prompt 5요소 프레임워크 적용 - GET /video/veo3/trending 엔드포인트 추가 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -20,7 +20,7 @@ public function __construct(GoogleCloudService $googleCloud)
|
||||
}
|
||||
|
||||
/**
|
||||
* 키워드 → 트렌딩 제목 5개 생성
|
||||
* 키워드 → 트렌딩 제목 5개 생성 (기본)
|
||||
*/
|
||||
public function generateTrendingTitles(string $keyword): array
|
||||
{
|
||||
@@ -60,33 +60,121 @@ public function generateTrendingTitles(string $keyword): array
|
||||
}
|
||||
|
||||
/**
|
||||
* 제목 → 장면별 시나리오 생성
|
||||
* 트렌딩 키워드 + 컨텍스트 → 후킹 제목 5개 생성
|
||||
*/
|
||||
public function generateTrendingHookTitles(string $keyword, array $context = []): array
|
||||
{
|
||||
$contextBlock = '';
|
||||
if (! empty($context)) {
|
||||
$newsTitle = $context['news_title'] ?? '';
|
||||
$traffic = $context['traffic'] ?? '';
|
||||
$contextBlock = <<<CTX
|
||||
|
||||
[실시간 트렌딩 정보]
|
||||
- 이 키워드는 지금 한국에서 실시간 급상승 중입니다
|
||||
- 검색량: {$traffic}
|
||||
- 관련 뉴스: {$newsTitle}
|
||||
CTX;
|
||||
}
|
||||
|
||||
$prompt = <<<PROMPT
|
||||
당신은 YouTube Shorts 조회수 1000만 전문 크리에이터입니다.
|
||||
키워드: "{$keyword}"
|
||||
{$contextBlock}
|
||||
|
||||
이 키워드로 YouTube Shorts에서 조회수를 폭발시킬 후킹 제목 5개를 생성해주세요.
|
||||
|
||||
반드시 아래 5가지 패턴을 각각 1개씩 사용:
|
||||
1. 충격형: "이거 실화임?" / "소름 돋는 진실" 스타일
|
||||
2. 비교형: "A vs B, 결과가 충격" / "전문가도 놀란" 스타일
|
||||
3. 숫자형: "3가지 이유" / "단 10초면" 스타일
|
||||
4. 질문형: "왜 아무도 안 알려줬을까?" / "이것도 몰랐어?" 스타일
|
||||
5. 반전형: "알고 보니..." / "사실은 반대였다" 스타일
|
||||
|
||||
요구사항:
|
||||
- 각 제목은 40자 이내
|
||||
- 첫 2초 안에 시청자 호기심 폭발 (스크롤 멈춤 유도)
|
||||
- 감정 유발 단어 필수 (충격, 소름, 미친, 레전드, 역대급 등)
|
||||
- 한국어로 작성
|
||||
- 이모지 1-2개 포함
|
||||
- 트렌딩 키워드의 맥락을 정확히 반영
|
||||
|
||||
반드시 아래 JSON 형식으로만 응답하세요 (다른 텍스트 없이):
|
||||
{
|
||||
"titles": [
|
||||
{"title": "제목1", "hook": "이 제목이 효과적인 이유 한줄", "pattern": "충격형"},
|
||||
{"title": "제목2", "hook": "이유", "pattern": "비교형"},
|
||||
{"title": "제목3", "hook": "이유", "pattern": "숫자형"},
|
||||
{"title": "제목4", "hook": "이유", "pattern": "질문형"},
|
||||
{"title": "제목5", "hook": "이유", "pattern": "반전형"}
|
||||
]
|
||||
}
|
||||
PROMPT;
|
||||
|
||||
$result = $this->callGemini($prompt);
|
||||
|
||||
if (! $result) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$parsed = $this->parseJsonResponse($result);
|
||||
|
||||
return $parsed['titles'] ?? [];
|
||||
}
|
||||
|
||||
/**
|
||||
* 제목 → 장면별 시나리오 생성 (Veo 3.1 공식 가이드 기반 프롬프트)
|
||||
*/
|
||||
public function generateScenario(string $title, string $keyword = ''): array
|
||||
{
|
||||
$prompt = <<<PROMPT
|
||||
당신은 YouTube Shorts 영상 시나리오 전문 작가입니다.
|
||||
당신은 YouTube Shorts 영상 시나리오 전문 작가이자 영화 촬영감독입니다.
|
||||
|
||||
영상 제목: "{$title}"
|
||||
키워드: "{$keyword}"
|
||||
|
||||
이 제목으로 40초 분량의 YouTube Shorts 영상 시나리오를 작성해주세요.
|
||||
|
||||
요구사항:
|
||||
- 5~6개 장면 (각 6~8초)
|
||||
- 각 장면에 나레이션 텍스트 (한국어, 자막으로도 사용)
|
||||
- 각 장면에 Veo 3.1 영상 생성용 프롬프트 (영어, 구체적이고 시각적)
|
||||
- 총 길이 합계가 정확히 40초
|
||||
- 첫 장면은 강렬한 후크 (시청 유지율 극대화)
|
||||
- 마지막 장면은 CTA (좋아요/구독 유도)
|
||||
=== 장면 구성 패턴 (6장면, 총 40초) ===
|
||||
장면 1 (6초): HOOK - extreme close-up 또는 dynamic camera movement → 시청자 호기심 극대화
|
||||
장면 2 (8초): CONTEXT - medium shot, 상황 설명과 배경 제시
|
||||
장면 3 (8초): DEVELOPMENT - tracking shot, 스토리 전개
|
||||
장면 4 (8초): CLIMAX - dramatic camera movement, 핵심 메시지 전달
|
||||
장면 5 (6초): TWIST/REVEAL - whip pan 또는 cut, 반전 또는 핵심 공개
|
||||
장면 6 (4초): CTA - close-up, 좋아요/구독 행동 유도
|
||||
|
||||
visual_prompt 작성 규칙:
|
||||
- 영어로 작성
|
||||
- 카메라 앵글, 조명, 분위기를 구체적으로 묘사
|
||||
- "cinematic", "4K", "dramatic lighting" 등 품질 키워드 포함
|
||||
- 등장인물은 반드시 "a young Korean woman in her 20s"로 설정 (모든 장면에 동일 인물 등장)
|
||||
- 등장인물의 표정, 의상, 동작을 구체적으로 묘사
|
||||
- 9:16 세로 영상에 적합한 구도
|
||||
=== visual_prompt 작성 규칙 (Veo 3.1 공식 프롬프팅 가이드) ===
|
||||
|
||||
반드시 아래 5개 요소를 모두 포함하여 영어로 작성:
|
||||
|
||||
1. SHOT TYPE (필수 1개 선택):
|
||||
- extreme close-up, close-up, medium close-up, medium shot, medium wide shot, wide shot, extreme wide shot, bird's-eye view, over-the-shoulder shot
|
||||
|
||||
2. CAMERA MOVEMENT (필수 1개 선택):
|
||||
- static, slow pan left/right, tilt up/down, dolly in/out, tracking shot, crane shot, aerial shot, handheld, arc shot, whip pan, zoom in/out
|
||||
|
||||
3. LIGHTING (필수, 구체적으로):
|
||||
- golden hour sunlight, dramatic side lighting, soft diffused light, neon glow, Rembrandt lighting, high-key lighting, low-key lighting, backlit silhouette, warm ambient light, cool blue moonlight
|
||||
|
||||
4. STYLE/QUALITY (필수):
|
||||
- cinematic 4K, shot on 35mm film, shallow depth of field, film grain, anamorphic lens flare, bokeh background, high contrast, muted color palette, vibrant saturated colors
|
||||
|
||||
5. ACTION (한 장면에 하나의 주요 동작만):
|
||||
- 명확한 하나의 동작을 묘사 (예: "picks up the phone", "turns around slowly", "looks directly at camera")
|
||||
|
||||
=== 추가 필수 규칙 ===
|
||||
- 등장인물: 모든 장면에 동일 인물 = "a young Korean woman in her 20s with shoulder-length black hair, wearing [첫 장면에서 정한 구체적 의상]"
|
||||
- 의상은 첫 장면에서 구체적으로 설정하고 모든 장면에서 동일하게 유지
|
||||
- 표정/감정: "with a shocked expression", "looking curious", "smiling warmly" 등 구체적 묘사
|
||||
- 배경: 구체적 장소 + 소품 묘사 (예: "a modern Seoul café with exposed brick walls and hanging plants")
|
||||
- 9:16 세로 구도: 인물을 화면 중앙에 배치, 상반신 중심 프레이밍
|
||||
- 장면 간 시각적 연결: 동일 색상 팔레트, 동일 의상, 동일 장소 또는 자연스러운 장소 전환
|
||||
|
||||
=== visual_prompt 좋은 예시 ===
|
||||
"Medium shot, slow dolly in. A young Korean woman in her 20s with shoulder-length black hair, wearing a cream knit sweater, sitting at a cozy café table. She looks down at her phone with a shocked expression, mouth slightly open. Warm golden hour sunlight streams through the window. Shallow depth of field, cinematic 4K, shot on 35mm film. Steam rises from a coffee cup in the foreground."
|
||||
|
||||
=== visual_prompt 나쁜 예시 (이렇게 작성하지 마세요) ===
|
||||
"A woman looking at phone in café, 4K cinematic"
|
||||
|
||||
반드시 아래 JSON 형식으로만 응답하세요 (다른 텍스트 없이):
|
||||
{
|
||||
@@ -94,14 +182,16 @@ public function generateScenario(string $title, string $keyword = ''): array
|
||||
"scenes": [
|
||||
{
|
||||
"scene_number": 1,
|
||||
"duration": 8,
|
||||
"duration": 6,
|
||||
"scene_role": "HOOK",
|
||||
"narration": "나레이션 텍스트 (한국어)",
|
||||
"visual_prompt": "Detailed English prompt for Veo 3.1 video generation...",
|
||||
"visual_prompt": "Shot type, camera movement. Character description with specific clothing, action and expression. Lighting description. Style/quality keywords. Background and props detail.",
|
||||
"mood": "exciting"
|
||||
}
|
||||
],
|
||||
"total_duration": 40,
|
||||
"bgm_mood": "upbeat, energetic"
|
||||
"bgm_mood": "upbeat, energetic",
|
||||
"character_description": "첫 장면의 인물 설정을 여기에 요약 (의상, 헤어 등)"
|
||||
}
|
||||
PROMPT;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user