Files
video-flow/config.py
2026-01-09 14:09:16 +08:00

198 lines
7.3 KiB
Python

"""
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")
# OpenAI (for GPT models)
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "")
OPENAI_BASE_URL = os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1")
# 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"
# ShuBiaoBiao (OpenAI-compatible) chat timeout/retries
# Note: OpenAI Python SDK default timeout is 10 minutes; we cap it to avoid UI "hang" feeling.
SHUBIAOBIAO_CHAT_TIMEOUT_S = float(os.getenv("SHUBIAOBIAO_CHAT_TIMEOUT_S", "180"))
SHUBIAOBIAO_CHAT_MAX_RETRIES = int(os.getenv("SHUBIAOBIAO_CHAT_MAX_RETRIES", "2"))
# 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 OR provided as empty string
DB_CONNECTION_STRING = os.getenv("DB_CONNECTION_STRING") or f"sqlite:///{BASE_DIR}/video_flow.db"
# ============================================================
# Font Settings (字体配置)
# ============================================================
# 优先检测系统字体,防止乱码
SYSTEM_FONTS = [
# 项目内置字体 (跨平台通用,优先使用)
str(FONTS_DIR / "NotoSansSC-Regular.otf"),
str(FONTS_DIR / "HarmonyOS-Sans-SC-Regular.ttf"),
str(FONTS_DIR / "HarmonyOS-Sans-SC-Bold.ttf"),
str(FONTS_DIR / "NotoSansSC-Bold.otf"),
str(FONTS_DIR / "SmileySans-Oblique.otf"),
# Linux 系统字体
"/usr/share/fonts/truetype/droid/DroidSansFallbackFull.ttf",
"/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc",
# macOS 系统字体
"/System/Library/Fonts/PingFang.ttc",
"/System/Library/Fonts/STHeiti Medium.ttc",
# Windows 系统字体
"C:/Windows/Fonts/msyh.ttc",
"C:/Windows/Fonts/simhei.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
# 极端情况回退到 Arial (所有平台都有)
return "Arial"
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
}
}