feat: video-flow initial commit
- app.py: Streamlit UI for video generation workflow - main_flow.py: CLI tool with argparse support - modules/: Business logic modules (script_gen, image_gen, video_gen, composer, etc.) - config.py: Configuration with API keys and paths - requirements.txt: Python dependencies - docs/: System prompt documentation
This commit is contained in:
181
config.py
Normal file
181
config.py
Normal file
@@ -0,0 +1,181 @@
|
||||
"""
|
||||
MatchMe Studio - Configuration
|
||||
"""
|
||||
import os
|
||||
from pathlib import Path
|
||||
from dotenv import load_dotenv
|
||||
|
||||
load_dotenv()
|
||||
|
||||
# ============================================================
|
||||
# API Keys
|
||||
# ============================================================
|
||||
|
||||
# Volcengine / Doubao (Official)
|
||||
VOLC_API_KEY = os.getenv("VOLC_API_KEY", "05aed9c1-f5e6-487b-9273-fe7d6be51957")
|
||||
VOLC_BASE_URL = os.getenv("VOLC_BASE_URL", "https://ark.cn-beijing.volces.com/api/v3")
|
||||
|
||||
# Models (Updated with User-Provided Endpoint IDs)
|
||||
# LLM: Doubao Pro 1.5 (Using provided brain/vision endpoint)
|
||||
BRAIN_MODEL_ID = os.getenv("BRAIN_MODEL_ID", "ep-20251203231055-dpsp7")
|
||||
# Vision: Doubao Vision Pro 1.5
|
||||
VISION_MODEL_ID = os.getenv("VISION_MODEL_ID", "ep-20251203232121-xjt2s")
|
||||
# Image: Doubao Image (Updated to user provided model)
|
||||
IMAGE_MODEL_ID = os.getenv("IMAGE_MODEL_ID", "ep-20251203231641-wg9nb")
|
||||
# Video: Doubao Video (PixelDance)
|
||||
VIDEO_MODEL_ID = os.getenv("VIDEO_MODEL_ID", "ep-20251207100506-rjx4x")
|
||||
|
||||
# Doubao Specifics (User Provided)
|
||||
DOUBAO_SCRIPT_MODEL = "ep-20251203231055-dpsp7"
|
||||
DOUBAO_IMG_MODEL = "ep-20251203231641-wg9nb"
|
||||
|
||||
|
||||
# Text/Brain API (Legacy)
|
||||
SHUBIAOBIAO_KEY = os.getenv("SHUBIAOBIAO_KEY", "sk-aL167A8sQEyvs40yBfC140Fc0fDa4c198f029aAcF0429108")
|
||||
SHUBIAOBIAO_BASE_URL = os.getenv("SHUBIAOBIAO_BASE_URL", "https://api.shubiaobiao.cn/v1")
|
||||
SHUBIAOBIAO_MODEL_TEXT = "gemini-3-pro-preview"
|
||||
|
||||
# Image Generation API (Updated)
|
||||
# Host: https://api.wuyinkeji.com/
|
||||
# Model: nanoBanana-pro (Gemini)
|
||||
GEMINI_IMG_KEY = os.getenv("GEMINI_IMG_KEY", "G9rXx3Ag2Xfa7Gs8zou6t6HqeZ")
|
||||
GEMINI_IMG_API_URL = os.getenv("GEMINI_IMG_API_URL", "https://api.wuyinkeji.com/api/img/nanoBanana-pro")
|
||||
GEMINI_IMG_DETAIL_URL = os.getenv("GEMINI_IMG_DETAIL_URL", "https://api.wuyinkeji.com/api/img/drawDetail")
|
||||
|
||||
# Legacy Image API
|
||||
SHUBIAOBIAO_IMG_KEY = os.getenv("SHUBIAOBIAO_IMG_KEY", "sk-1yr2h4sJybHB7DED57CeF446D08c4bC989F621Db5b48E70d")
|
||||
SHUBIAOBIAO_IMG_BASE_URL = os.getenv("SHUBIAOBIAO_IMG_BASE_URL", "https://api2img.shubiaobiao.com")
|
||||
SHUBIAOBIAO_IMG_MODEL_NAME = "gemini-3-pro-image-preview"
|
||||
|
||||
# Backup
|
||||
FAL_KEY = os.getenv("FAL_KEY", "")
|
||||
KLING_ACCESS_KEY = os.getenv("KLING_ACCESS_KEY", "")
|
||||
KLING_SECRET_KEY = os.getenv("KLING_SECRET_KEY", "")
|
||||
|
||||
XI_KEY = os.getenv("XI_KEY", "")
|
||||
|
||||
# ============================================================
|
||||
# Cloudflare R2 Storage
|
||||
# ============================================================
|
||||
R2_ENDPOINT = os.getenv("R2_ENDPOINT", "")
|
||||
R2_ACCESS_KEY = os.getenv("R2_ACCESS_KEY", "")
|
||||
R2_SECRET_KEY = os.getenv("R2_SECRET_KEY", "")
|
||||
R2_BUCKET_NAME = os.getenv("R2_BUCKET_NAME", "mms-assets")
|
||||
# Public URL for accessing uploaded files
|
||||
R2_PUBLIC_URL = os.getenv("R2_PUBLIC_URL", "https://pub-7942a75aa66d4315a628ee464267ebf4.r2.dev")
|
||||
|
||||
# ============================================================
|
||||
# ElevenLabs Settings (Legacy - for English)
|
||||
# ============================================================
|
||||
ELEVENLABS_VOICE_ID = os.getenv("XI_VOICE_ID", "21m00Tcm4TlvDq8ikWAM")
|
||||
ELEVENLABS_MODEL = "eleven_turbo_v2_5"
|
||||
|
||||
# ============================================================
|
||||
# Volcengine TTS Settings (火山引擎语音合成 - 中文)
|
||||
# ============================================================
|
||||
# 申请地址: https://console.volcengine.com/speech/service/8
|
||||
VOLC_TTS_APPID = os.getenv("VOLC_TTS_APPID", "6771884088")
|
||||
VOLC_TTS_ACCESS_TOKEN = os.getenv("VOLC_TTS_ACCESS_TOKEN", "Q5sR2SNfxO8Vb9g2ucsaqfUGOpcpZi3S")
|
||||
VOLC_TTS_SECRET_KEY = os.getenv("VOLC_TTS_SECRET_KEY", "RXc2WiA6OK6G1xuEZ7cyAU3Q3B5Z1oUx")
|
||||
|
||||
# 默认音色
|
||||
# 抖音热门带货音色推荐:
|
||||
# - BV700_streaming: 甜美小媛(甜美活泼,适合美妆/好物)- 可能无权限
|
||||
# - zh_female_santongyongns_saturn_bigtts: 三通永(已验证可用)
|
||||
# - zh_female_meilinvyou_saturn_bigtts: 美丽女友(已验证可用)
|
||||
VOLC_TTS_DEFAULT_VOICE = os.getenv("VOLC_TTS_VOICE", "zh_female_santongyongns_saturn_bigtts")
|
||||
|
||||
# ============================================================
|
||||
# Video Settings
|
||||
# ============================================================
|
||||
VIDEO_SETTINGS = {
|
||||
"width": 1080,
|
||||
"height": 1920,
|
||||
"fps": 30,
|
||||
"format": "mp4",
|
||||
"codec": "libx264",
|
||||
}
|
||||
|
||||
# ============================================================
|
||||
# Paths
|
||||
# ============================================================
|
||||
BASE_DIR = Path(__file__).parent
|
||||
OUTPUT_DIR = BASE_DIR / "output"
|
||||
TEMP_DIR = BASE_DIR / "temp"
|
||||
ASSETS_DIR = BASE_DIR / "assets"
|
||||
FONTS_DIR = ASSETS_DIR / "fonts"
|
||||
|
||||
# Ensure directories exist
|
||||
OUTPUT_DIR.mkdir(exist_ok=True)
|
||||
TEMP_DIR.mkdir(exist_ok=True)
|
||||
ASSETS_DIR.mkdir(exist_ok=True)
|
||||
FONTS_DIR.mkdir(exist_ok=True)
|
||||
|
||||
# ============================================================
|
||||
# Database Configuration
|
||||
# ============================================================
|
||||
# Format: postgresql://user:password@host:port/dbname
|
||||
# Default to SQLite if not provided
|
||||
DB_CONNECTION_STRING = os.getenv("DB_CONNECTION_STRING", f"sqlite:///{BASE_DIR}/video_flow.db")
|
||||
|
||||
# ============================================================
|
||||
# Font Settings (字体配置)
|
||||
# ============================================================
|
||||
# 优先检测系统字体,防止乱码
|
||||
SYSTEM_FONTS = [
|
||||
str(FONTS_DIR / "SmileySans-Oblique.otf"),
|
||||
str(FONTS_DIR / "HarmonyOS-Sans-SC-Regular.ttf"),
|
||||
str(FONTS_DIR / "HarmonyOS-Sans-SC-Bold.ttf"),
|
||||
str(FONTS_DIR / "NotoSansSC-Regular.otf"),
|
||||
str(FONTS_DIR / "NotoSansSC-Bold.otf"),
|
||||
"/System/Library/Fonts/PingFang.ttc",
|
||||
"/System/Library/Fonts/STHeiti Medium.ttc",
|
||||
"/System/Library/Fonts/Supplemental/Arial Unicode.ttf",
|
||||
]
|
||||
|
||||
DEFAULT_FONT = str(FONTS_DIR / "NotoSansSC-Regular.otf")
|
||||
DEFAULT_FONT_BOLD = str(FONTS_DIR / "NotoSansSC-Bold.otf")
|
||||
|
||||
# 检查项目字体是否存在,不存在则使用系统字体
|
||||
def pick_font():
|
||||
for f in SYSTEM_FONTS:
|
||||
if os.path.exists(f) and os.path.getsize(f) > 1000:
|
||||
return f
|
||||
return "/System/Library/Fonts/PingFang.ttc"
|
||||
|
||||
DEFAULT_FONT = pick_font()
|
||||
DEFAULT_FONT_BOLD = DEFAULT_FONT
|
||||
|
||||
# 花字样式预设
|
||||
FANCY_TEXT_STYLES = {
|
||||
"subtitle": {
|
||||
"font_size": 48,
|
||||
"font_color": "#FFFFFF",
|
||||
"stroke_color": "#000000",
|
||||
"stroke_width": 3
|
||||
},
|
||||
"highlight": {
|
||||
"font_size": 56,
|
||||
"font_color": "#FFE66D",
|
||||
"stroke_color": "#000000",
|
||||
"stroke_width": 4
|
||||
},
|
||||
"warning": {
|
||||
"font_size": 52,
|
||||
"font_color": "#FF4444",
|
||||
"stroke_color": "#FFFFFF",
|
||||
"stroke_width": 4
|
||||
},
|
||||
"price": {
|
||||
"font_size": 72,
|
||||
"price_color": "#FF4444",
|
||||
"stroke_color": "#FFFFFF",
|
||||
"stroke_width": 5
|
||||
},
|
||||
"button": {
|
||||
"font_size": 36,
|
||||
"font_color": "#FFFFFF",
|
||||
"bg_color": "#FF6B35",
|
||||
"corner_radius": 25
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user