""" Configuration Module Contains all configuration constants for the Universal Translator application. """ # ============================================================================ # Model Configuration # ============================================================================ class ModelConfig: """Configuration for translation models.""" # Primary translation model MODEL_NAME = "swiss-ai/Apertus-70B-Instruct-2509" TITLE = "Universal Translator" # Model parameters DEFAULT_MAX_TOKENS = 1024 DEFAULT_TEMPERATURE = 0.3 MIN_TEMPERATURE = 0.0 MAX_TEMPERATURE = 1.0 # Temperature recommendations TEMP_LITERAL = 0.1 # More literal, word-for-word translations TEMP_BALANCED = 0.3 # Balanced (default) TEMP_CREATIVE = 0.7 # More creative, natural-sounding translations # ============================================================================ # Language Configuration # ============================================================================ class LanguageConfig: """Configuration for supported languages.""" # Popular languages for the dropdown (display_name: language_code) # All languages supported by langdetect (55 languages) POPULAR_LANGUAGES = { "Afrikaans": "af", "Albanian": "sq", "Arabic": "ar", "Bengali": "bn", "Bulgarian": "bg", "Catalan": "ca", "Chinese (Simplified)": "zh-cn", "Chinese (Traditional)": "zh-tw", "Croatian": "hr", "Czech": "cs", "Danish": "da", "Dutch": "nl", "English": "en", "Estonian": "et", "Finnish": "fi", "French": "fr", "German": "de", "German (Swiss - Aargau)": "de-CH-AG", "German (Swiss - Basel)": "de-CH-BS", "German (Swiss - Bern)": "de-CH-BE", "German (Swiss - Graubünden)": "de-CH-GR", "German (Swiss - Lucerne)": "de-CH-LU", "German (Swiss - St. Gallen)": "de-CH-SG", "German (Swiss - Valais)": "de-CH-VS", "German (Swiss - Zürich)": "de-CH-ZH", "Greek": "el", "Gujarati": "gu", "Hebrew": "he", "Hindi": "hi", "Hungarian": "hu", "Indonesian": "id", "Italian": "it", "Japanese": "ja", "Kannada": "kn", "Korean": "ko", "Latvian": "lv", "Lithuanian": "lt", "Macedonian": "mk", "Malayalam": "ml", "Marathi": "mr", "Nepali": "ne", "Norwegian": "no", "Persian": "fa", "Polish": "pl", "Portuguese": "pt", "Punjabi": "pa", "Romanian": "ro", "Russian": "ru", "Slovak": "sk", "Slovenian": "sl", "Somali": "so", "Spanish": "es", "Swahili": "sw", "Swedish": "sv", "Tagalog": "tl", "Tamil": "ta", "Telugu": "te", "Thai": "th", "Turkish": "tr", "Ukrainian": "uk", "Urdu": "ur", "Vietnamese": "vi", "Welsh": "cy" } # Language code to full name mapping (for detection display) # Expanded to cover more languages that langdetect might identify LANGUAGE_NAMES = { "af": "Afrikaans", "ar": "Arabic", "bg": "Bulgarian", "bn": "Bengali", "ca": "Catalan", "cs": "Czech", "cy": "Welsh", "da": "Danish", "de": "German", "de-CH-AG": "German (Swiss - Aargau)", "de-CH-BE": "German (Swiss - Bern)", "de-CH-BS": "German (Swiss - Basel)", "de-CH-GR": "German (Swiss - Graubünden)", "de-CH-LU": "German (Swiss - Lucerne)", "de-CH-SG": "German (Swiss - St. Gallen)", "de-CH-VS": "German (Swiss - Valais)", "de-CH-ZH": "German (Swiss - Zürich)", "el": "Greek", "en": "English", "es": "Spanish", "et": "Estonian", "fa": "Persian", "fi": "Finnish", "fr": "French", "gu": "Gujarati", "he": "Hebrew", "hi": "Hindi", "hr": "Croatian", "hu": "Hungarian", "id": "Indonesian", "it": "Italian", "ja": "Japanese", "kn": "Kannada", "ko": "Korean", "lt": "Lithuanian", "lv": "Latvian", "mk": "Macedonian", "ml": "Malayalam", "mr": "Marathi", "ne": "Nepali", "nl": "Dutch", "no": "Norwegian", "pa": "Punjabi", "pl": "Polish", "pt": "Portuguese", "ro": "Romanian", "ru": "Russian", "sk": "Slovak", "sl": "Slovenian", "so": "Somali", "sq": "Albanian", "sv": "Swedish", "sw": "Swahili", "ta": "Tamil", "te": "Telugu", "th": "Thai", "tl": "Tagalog", "tr": "Turkish", "uk": "Ukrainian", "ur": "Urdu", "vi": "Vietnamese", "zh-cn": "Chinese (Simplified)", "zh-tw": "Chinese (Traditional)" } # Default target language DEFAULT_TARGET_LANGUAGE = "Spanish" # ============================================================================ # Voice Configuration # ============================================================================ class VoiceConfig: """Configuration for speech-to-text and text-to-speech.""" # Default providers # Note: For faster response times, consider "Local Whisper (Tiny)" or "Local Whisper (Base)" # OpenAI Whisper API is more accurate but has network latency # Using gTTS as default for HuggingFace Spaces compatibility (no asyncio issues) DEFAULT_STT_PROVIDER = "OpenAI Whisper API" DEFAULT_TTS_PROVIDER = "OpenAI TTS" DEFAULT_TTS_VOICE = "nova" # Must be valid for DEFAULT_TTS_PROVIDER # Voice output enabled by default DEFAULT_VOICE_OUTPUT_ENABLED = True # Performance optimization settings # Set to True to prioritize speed over accuracy (uses smaller models) FAST_MODE = False # When True, switches to faster STT/TTS options # Note: Voice choices are dynamically loaded based on selected TTS provider # See voice_handler.py for provider-specific voice lists: # - OpenAI TTS: alloy, echo, fable, onyx, nova, shimmer # - gTTS: default # OpenAI TTS voices (kept for reference, not used in UI) OPENAI_TTS_VOICES = ["alloy", "echo", "fable", "onyx", "nova", "shimmer"] # ============================================================================ # UI Configuration # ============================================================================ class UIConfig: """Configuration for the Gradio UI.""" # App metadata APP_TITLE = "Universal Translator" APP_DESCRIPTION = "Translate text or speech to any language with automatic source language detection" # Theme settings THEME_PRIMARY_HUE = "indigo" THEME_SECONDARY_HUE = "cyan" THEME_NEUTRAL_HUE = "slate" THEME_FONT = "Inter, system-ui, sans-serif" # Custom CSS CUSTOM_CSS = """ .gradio-container { font-family: 'Inter', system-ui, sans-serif; } """ # Input/Output dimensions INPUT_TEXT_LINES = 4 OUTPUT_TEXT_LINES = 4 # Slider configurations MAX_TOKENS_MIN = 128 MAX_TOKENS_MAX = 2048 MAX_TOKENS_STEP = 128 TEMPERATURE_MIN = 0.0 TEMPERATURE_MAX = 1.0 TEMPERATURE_STEP = 0.1 # Launch settings SHARE_LINK = False OPEN_IN_BROWSER = True # ============================================================================ # Translation Prompts # ============================================================================ class PromptConfig: """Configuration for translation prompts.""" SYSTEM_PROMPT_TEMPLATE = """You are a professional translator. Your task is to translate the given text to {target_language}. Provide ONLY the translation, without any explanations, notes, or additional text. Maintain the tone, style, and meaning of the original text.""" # ============================================================================ # Error Messages # ============================================================================ class ErrorMessages: """Standard error messages.""" NO_INPUT = "No input provided" NO_AUDIO_INPUT = "No audio input" TRANSCRIPTION_FAILED = "Transcription failed" TRANSLATION_ERROR = "Translation Error: {error}" TRANSCRIPTION_ERROR = "[Transcription Error: {error}]" LANGUAGE_DETECTION_FAILED = "Unknown" # ============================================================================ # Helper Functions # ============================================================================ def get_language_name(lang_code: str) -> str: """ Get the full language name from a language code. Args: lang_code: Language code (e.g., 'en', 'es') Returns: Full language name or uppercase code if not found """ return LanguageConfig.LANGUAGE_NAMES.get(lang_code, lang_code.upper()) def get_popular_languages_list() -> list[str]: """ Get a list of popular language names for dropdowns. Returns: List of language display names """ return list(LanguageConfig.POPULAR_LANGUAGES.keys()) def get_language_code(language_name: str) -> str: """ Get the language code from a display name. Args: language_name: Display name (e.g., 'Spanish', 'French') Returns: Language code or the original name if not found """ return LanguageConfig.POPULAR_LANGUAGES.get(language_name, language_name.lower())