File size: 4,351 Bytes
3a9eacd 9f30ef0 3a9eacd 9f30ef0 3a9eacd 9f30ef0 3a9eacd 9f30ef0 3a9eacd 9f30ef0 3a9eacd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
"""
μ± μ€μ νμΌ
"""
import os
from dataclasses import dataclass
from typing import Dict
@dataclass
class AppConfig:
"""μ± μ€μ ν΄λμ€"""
# μ± μ 보
app_name: str = "μμ± κ²μ¦ μμ€ν
"
version: str = "1.0.0"
# STT μ€μ
stt_provider: str = os.getenv('STT_PROVIDER', 'mock') # 'openai', 'google', 'azure', 'mock'
# OpenAI μ€μ
openai_api_key: str = os.getenv('OPENAI_API_KEY', '')
openai_model: str = "whisper-1"
# Google μ€μ
google_credentials_path: str = os.getenv('GOOGLE_APPLICATION_CREDENTIALS', '')
# Azure μ€μ
azure_speech_key: str = os.getenv('AZURE_SPEECH_KEY', '')
azure_speech_region: str = os.getenv('AZURE_SPEECH_REGION', 'koreacentral')
# λμ΄λ μ€μ
min_difficulty: int = 1
max_difficulty: int = 5
default_difficulty: int = 1
# μ μ¬λ μκ³κ° (λμ΄λλ³)
similarity_thresholds: Dict[int, float] = None
# UI μ€μ
theme: str = "soft"
primary_color: str = "indigo"
# μλ² μ€μ
server_name: str = os.getenv("SERVER_HOST")
server_port: int = os.getenv("FRONTEND_PORT")
share: bool = False
# λ°±μλ μ€μ
backend_port: int = os.getenv("BACKEND_PORT")
backend_api_url: str = os.getenv("BACKEND_API_URL", "")
# νμΌ μ€μ
max_audio_duration: int = 30 # μ΄
allowed_audio_formats: list = None
def __post_init__(self):
"""μ΄κΈ°ν ν μ²λ¦¬"""
# κΈ°λ³Έ μκ³κ° μ€μ
if self.similarity_thresholds is None:
self.similarity_thresholds = {
1: 0.70,
2: 0.75,
3: 0.80,
4: 0.85,
5: 0.90
}
# νμ© μ€λμ€ ν¬λ§· μ€μ
if self.allowed_audio_formats is None:
self.allowed_audio_formats = [
'.wav', '.mp3', '.m4a', '.ogg', '.flac', '.webm'
]
@classmethod
def from_env(cls):
"""
νκ²½ λ³μμμ μ€μ λ‘λ
Returns:
AppConfig: μ€μ μΈμ€ν΄μ€
"""
backend_port = os.getenv('BACKEND_PORT')
return cls(
stt_provider=os.getenv('STT_PROVIDER', 'mock'),
openai_api_key=os.getenv('OPENAI_API_KEY', ''),
server_name=os.getenv('SERVER_HOST'),
server_port=int(os.getenv('FRONTEND_PORT')),
backend_port=int(backend_port),
backend_api_url=os.getenv('BACKEND_API_URL', f'http://localhost:{backend_port}'),
share=os.getenv('GRADIO_SHARE', 'false').lower() == 'true'
)
def validate(self) -> bool:
"""
μ€μ κ²μ¦
Returns:
bool: μ ν¨ μ¬λΆ
Raises:
ValueError: μ€μ μ΄ μ ν¨νμ§ μμ λ
"""
# STT providerλ³ κ²μ¦
if self.stt_provider == 'openai':
if not self.openai_api_key:
raise ValueError("OpenAI API ν€κ° μ€μ λμ§ μμμ΅λλ€")
elif self.stt_provider == 'google':
if not self.google_credentials_path:
raise ValueError("Google μΈμ¦ νμΌ κ²½λ‘κ° μ€μ λμ§ μμμ΅λλ€")
elif self.stt_provider == 'azure':
if not self.azure_speech_key:
raise ValueError("Azure Speech ν€κ° μ€μ λμ§ μμμ΅λλ€")
# λμ΄λ λ²μ κ²μ¦
if not (1 <= self.min_difficulty <= self.max_difficulty <= 5):
raise ValueError("λμ΄λ λ²μκ° μ¬λ°λ₯΄μ§ μμ΅λλ€")
return True
def to_dict(self) -> dict:
"""
λμ
λλ¦¬λ‘ λ³ν
Returns:
dict: μ€μ λμ
λ리
"""
return {
'app_name': self.app_name,
'version': self.version,
'stt_provider': self.stt_provider,
'difficulty_range': f"{self.min_difficulty}-{self.max_difficulty}",
'server': f"{self.server_name}:{self.server_port}"
}
def __str__(self) -> str:
"""λ¬Έμμ΄ νν"""
config_dict = self.to_dict()
lines = [f"{k}: {v}" for k, v in config_dict.items()]
return "\n".join(lines)
|