feat: v3.0 엔진 추상화 + 소설 파이프라인 추가

[1순위] 엔진 추상화 리팩토링
- config/engine.json: 단일 설정 파일로 writing/tts/image/video/publishing 엔진 제어
- bots/engine_loader.py: EngineLoader 팩토리 클래스 (Claude/OpenClaw/Gemini Writer, gTTS/GoogleCloud/OpenAI/ElevenLabs TTS, DALL-E/External 이미지)

[2순위] VideoEngine 추상화
- bots/converters/video_engine.py: VideoEngine ABC + FFmpegSlidesEngine/SeedanceEngine/SoraEngine/RunwayEngine/VeoEngine 구현
- Seedance 2.0 API 연동 + 실패 시 ffmpeg_slides 자동 fallback

[3순위] 소설 연재 파이프라인
- bots/novel/novel_writer.py: AI 에피소드 자동 생성 (Claude/엔진 추상화)
- bots/novel/novel_blog_converter.py: 에피소드 → 장르별 테마 Blogger HTML
- bots/novel/novel_shorts_converter.py: key_scenes → TTS + Pillow + VideoEngine → MP4
- bots/novel/novel_manager.py: 전체 파이프라인 조율 + Telegram 명령 처리
- config/novels/shadow-protocol.json: 예시 소설 설정 (2040 서울 SF 스릴러)

[스케줄러] 소설 파이프라인 통합
- 매주 월/목 09:00 자동 실행 (job_novel_pipeline)
- Telegram 명령: /novel_list, /novel_gen, /novel_status

[기타 수정]
- collector_bot.py: 한국어 유니코드 감지 + RSS 신뢰도 override 버그 수정
- quality_rules.json: min_score 70→60
- scripts/get_token.py: YouTube OAuth scope 추가
- .env.example: SEEDANCE/ELEVENLABS/GEMINI/RUNWAY API 키 항목 추가

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
sinmb79
2026-03-26 09:33:04 +09:00
parent b54f8e198e
commit 8a7a122bb3
16 changed files with 3487 additions and 8 deletions

173
config/engine.json Normal file
View File

@@ -0,0 +1,173 @@
{
"_comment": "The 4th Path 블로그 자동 수익 엔진 — 엔진 설정 (v3)",
"_updated": "2026-03-26",
"writing": {
"provider": "claude",
"options": {
"claude": {
"api_key_env": "ANTHROPIC_API_KEY",
"model": "claude-opus-4-5",
"max_tokens": 4096,
"temperature": 0.7
},
"openclaw": {
"agent_name": "blog-writer",
"timeout": 120
},
"gemini": {
"api_key_env": "GEMINI_API_KEY",
"model": "gemini-2.0-flash",
"max_tokens": 4096,
"temperature": 0.7
}
}
},
"tts": {
"provider": "gtts",
"options": {
"google_cloud": {
"api_key_env": "GOOGLE_TTS_API_KEY",
"voice": "ko-KR-Wavenet-A",
"speaking_rate": 1.05,
"pitch": 0
},
"openai": {
"api_key_env": "OPENAI_API_KEY",
"model": "tts-1-hd",
"voice": "alloy",
"speed": 1.0
},
"elevenlabs": {
"api_key_env": "ELEVENLABS_API_KEY",
"model": "eleven_multilingual_v2",
"voice_id": "pNInz6obpgDQGcFmaJgB",
"stability": 0.5,
"similarity_boost": 0.75
},
"gtts": {
"lang": "ko",
"slow": false
}
}
},
"image_generation": {
"provider": "dalle",
"options": {
"dalle": {
"api_key_env": "OPENAI_API_KEY",
"model": "dall-e-3",
"size": "1024x1792",
"quality": "standard"
},
"external": {
"comment": "수동 이미지 제공 — 자동 생성 없음"
}
}
},
"video_generation": {
"provider": "ffmpeg_slides",
"options": {
"ffmpeg_slides": {
"resolution": "1080x1920",
"fps": 30,
"transition": "fade",
"transition_duration": 0.5,
"bgm_volume": 0.08,
"zoom_speed": 0.0003,
"zoom_max": 1.05,
"burn_subtitles": true
},
"seedance": {
"api_url": "https://api.seedance2.ai/v1/generate",
"api_key_env": "SEEDANCE_API_KEY",
"resolution": "1080x1920",
"duration": "10s",
"audio": true,
"fallback": "ffmpeg_slides"
},
"sora": {
"comment": "OpenAI Sora — API 접근 가능 시 활성화",
"api_key_env": "OPENAI_API_KEY",
"fallback": "ffmpeg_slides"
},
"runway": {
"api_key_env": "RUNWAY_API_KEY",
"model": "gen3a_turbo",
"duration": 10,
"ratio": "768:1344",
"fallback": "ffmpeg_slides"
},
"veo": {
"comment": "Google Veo 3.1 — API 접근 가능 시 활성화",
"api_key_env": "GEMINI_API_KEY",
"fallback": "ffmpeg_slides"
}
}
},
"publishing": {
"blogger": {
"enabled": true,
"blog_id_env": "BLOG_MAIN_ID"
},
"youtube": {
"enabled": true,
"channel_id_env": "YOUTUBE_CHANNEL_ID",
"category": "shorts",
"privacy": "public",
"tags": ["쇼츠", "AI", "the4thpath"]
},
"instagram": {
"enabled": false,
"account_id_env": "INSTAGRAM_ACCOUNT_ID"
},
"x": {
"enabled": false
},
"tiktok": {
"enabled": false
},
"novel": {
"enabled": false,
"comment": "노벨피아 연재 — 추후 활성화"
}
},
"quality_gates": {
"gate1_research_min_score": 60,
"gate2_writing_min_score": 70,
"gate3_review_required": true,
"gate3_auto_approve_score": 90,
"min_key_points": 2,
"min_word_count": 300,
"safety_check": true
},
"schedule": {
"collector": "07:00",
"writer": "08:00",
"converter": "08:30",
"publisher": "09:00",
"youtube_uploader": "10:00",
"analytics": "22:00"
},
"brand": {
"name": "The 4th Path",
"sub": "Independent Tech Media",
"by": "by 22B Labs",
"url": "the4thpath.com",
"cta": "팔로우하면 매일 이런 정보를 받습니다"
},
"optional_keys": {
"SEEDANCE_API_KEY": "Seedance 2.0 AI 영상 생성",
"ELEVENLABS_API_KEY": "ElevenLabs 고품질 TTS",
"GEMINI_API_KEY": "Google Gemini 글쓰기 / Veo 영상",
"RUNWAY_API_KEY": "Runway Gen-3 AI 영상 생성"
}
}

View File

@@ -0,0 +1,38 @@
{
"novel_id": "shadow-protocol",
"title": "Shadow Protocol",
"title_ko": "그림자 프로토콜",
"genre": "sci-fi thriller",
"setting": {
"world": "2040년 서울. AI가 모든 공공 시스템을 운영하는 세계.",
"atmosphere": "디스토피아, 네오누아르, 빗속 도시",
"rules": [
"AI는 감정을 느끼지 못하지만 감정을 시뮬레이션할 수 있다",
"AI 반란은 없다. 대신 인간이 AI를 악용하는 것이 위협이다",
"주인공은 AI를 불신하지만 AI 없이는 살 수 없다"
]
},
"characters": [
{
"name": "서진",
"role": "주인공",
"description": "35세, 전직 AI 감사관. 시스템의 결함을 발견한 뒤 쫓기는 신세.",
"personality": "냉소적이지만 정의감 있음. 기술을 두려워하면서도 의존."
},
{
"name": "아리아",
"role": "AI 파트너",
"description": "서진의 구형 개인 AI. 최신 모델보다 느리지만 서진이 유일하게 신뢰하는 존재.",
"personality": "차분하고 논리적. 가끔 인간적인 반응을 보여 서진을 당황시킴."
}
],
"base_story": "서울시 AI 관제 시스템 '오라클'의 전직 감사관 서진이, 시스템 내부에 숨겨진 '그림자 프로토콜'의 존재를 발견한다. 이 프로토콜은 특정 시민의 행동을 예측하고 선제적으로 격리하는 비밀 기능이다. 서진은 자신이 다음 격리 대상이라는 것을 알게 되고, 구형 AI 아리아와 함께 도주하며 진실을 폭로하려 한다.",
"episode_count_target": 20,
"episode_length": "2000-3000자",
"language": "ko",
"tone": "긴장감 있는 서스펜스. 짧은 문장. 시각적 묘사 풍부.",
"publish_schedule": "매주 월/목 09:00",
"status": "active",
"current_episode": 0,
"episode_log": []
}

View File

@@ -1,5 +1,5 @@
{
"min_score": 70,
"min_score": 60,
"scoring": {
"korean_relevance": {
"max": 30,