joelazo
Remove Edge-TTS provider due to HuggingFace Spaces incompatibility
0e5ba43
"""
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())