""" Constants and configuration values for Medical Transcriber application. Centralizes all magic numbers, strings, colors, and paths. """ from pathlib import Path from enum import Enum # ============================================================================ # PROJECT PATHS # ============================================================================ PROJECT_ROOT = Path(__file__).parent.parent RESULTS_DIR = PROJECT_ROOT / "results" REPORTS_DIR = RESULTS_DIR / "reports" LOGS_DIR = PROJECT_ROOT / "logs" # ============================================================================ # UI COLORS (RGB HEX) # ============================================================================ class UIColors: """UI color palette.""" PRIMARY_GREEN = "#4CAF50" HOVER_GREEN = "#45a049" DISABLED_GRAY = "#cccccc" TEXT_DARK = "#333333" TEXT_LIGHT = "#f5f5f5" BORDER_GRAY = "#cccccc" SUCCESS_GREEN = "#4CAF50" ERROR_RED = "#f44336" WARNING_ORANGE = "#ff9800" INFO_BLUE = "#2196F3" # ============================================================================ # UI DIMENSIONS (PIXELS) # ============================================================================ class UIDimensions: """UI dimension constants.""" MAIN_WINDOW_WIDTH = 1200 MAIN_WINDOW_HEIGHT = 800 DIALOG_WIDTH = 500 DIALOG_HEIGHT = 400 MIN_RESULTS_HEIGHT = 200 BUTTON_PADDING = 10 BORDER_RADIUS = 5 GROUP_BOX_MARGIN_TOP = 10 GROUP_BOX_PADDING = 10 # ============================================================================ # FONTS # ============================================================================ class FontConfig: """Font configuration.""" DEFAULT_FONT = "Times New Roman" DEFAULT_SIZE = 12 HEADING_SIZE = 14 TITLE_SIZE = 14 MONOSPACE_FONT = "Courier New" # ============================================================================ # AUDIO FORMATS # ============================================================================ class AudioFormats: """Supported audio formats.""" SUPPORTED_EXTENSIONS = [".wav", ".mp3", ".m4a", ".flac", ".ogg"] FILE_DIALOG_FILTER = "Audio Files (*.wav *.mp3 *.m4a);;All Files (*)" # ============================================================================ # MODEL CONFIGURATIONS # ============================================================================ class ModelDefaults: """Default model configurations.""" WHISPER_DEVICE = "auto" WHISPER_DTYPE = "float32" WHISPER_LANGUAGE = "russian" OPENAI_MODEL = "gpt-4o" OPENROUTER_MODEL = "google/gemini-3-flash-preview" TEMPERATURE = 0.1 MAX_TOKENS = 4000 # ============================================================================ # API SETTINGS # ============================================================================ class APISettings: """API configuration settings.""" OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1" API_TIMEOUT = 120 MAX_RETRIES = 3 RETRY_DELAY = 2 RATE_LIMIT_DELAY = 5 # ============================================================================ # LOGGING # ============================================================================ class LoggingConfig: """Logging configuration.""" LOG_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S" LOG_LEVEL = "INFO" LOG_FILE_FORMAT = "transcription_{timestamp}.log" # ============================================================================ # MESSAGES # ============================================================================ class Messages: """UI message strings.""" # Errors ERROR_NO_AUDIO_FILE = "Пожалуйста, выберите аудиофайл!" ERROR_FILE_NOT_FOUND = "Файл не найден" ERROR_NO_PATIENT_DATA = "Для создания отчёта необходимо заполнить данные пациента!" ERROR_INVALID_CONFIG = "Ошибка при создании конфига" ERROR_TRANSCRIPTION_FAILED = "Ошибка обработки" ERROR_API_KEY_REQUIRED = "OpenRouter API ключ не найден" # Warnings WARNING_TITLE = "Внимание" # Success SUCCESS_TITLE = "Успешно" SUCCESS_TRANSCRIPTION = "Транскрибирование завершено!" SUCCESS_SETTINGS_SAVED = "Настройки сохранены!" # Status STATUS_READY = "Готов к обработке" STATUS_INITIALIZING = "Инициализация пайплайна..." STATUS_TRANSCRIBING = "Запуск транскрибирования..." STATUS_COMPLETED = "Обработка завершена!" STATUS_PATIENT_NOT_FILLED = "Данные пациента не заполнены" STATUS_PATIENT_FILLED = "Пациент: " # Buttons BTN_START = "▶ Начать транскрибирование" BTN_CLEAR = "🗑 Очистить результаты" BTN_BROWSE = "Обзор..." BTN_SAVE = "💾 Сохранить настройки" BTN_OK = "OK" BTN_CANCEL = "Отмена" # Tabs TAB_TRANSCRIPTION = "Транскрибирование" TAB_SETTINGS = "Настройки" # Groups GROUP_AUDIO_FILE = "1. Выбор аудиофайла" GROUP_PATIENT_DATA = "2. Данные пациента" GROUP_OPTIONS = "3. Опции обработки" GROUP_STATUS = "4. Статус обработки" GROUP_RESULTS = "5. Результаты" GROUP_WHISPER_MODEL = "Модель Whisper" GROUP_OPENROUTER_API = "OpenRouter API (для LLM-коррекции)" GROUP_MEDICAL_TERMS = "База медицинских терминов" # ============================================================================ # DATA VALIDATION # ============================================================================ class ValidationRules: """Data validation rules.""" MIN_AUDIO_DURATION = 0.1 # seconds MAX_AUDIO_DURATION = 3600 # seconds (1 hour) MIN_TEXT_LENGTH = 10 # characters MAX_TEXT_LENGTH = 1000000 # characters # ============================================================================ # FILE OPERATIONS # ============================================================================ class FileDefaults: """File operation defaults.""" TIMESTAMP_FORMAT = "%Y%m%d_%H%M%S" JSON_INDENT = 2 ENCODING = "utf-8" FILE_PERMISSIONS = 0o644 # ============================================================================ # PLACEHOLDERS # ============================================================================ class Placeholders: """UI placeholder text.""" AUDIO_FILE_NOT_SELECTED = "Аудиофайл не выбран" PATIENT_NAME = "Фамилия Имя Отчество" PATIENT_DOB = "ДД.MM.YYYY" STUDY_AREA = "Область исследования (напр. МРТ головы)" STUDY_NUMBER = "Номер исследования" STUDY_DATE = "ДД.MM.YYYY" DOCTOR_NAME = "ФИО врача" API_KEY = "Введите ваш API ключ OpenRouter" RESULTS_PLACEHOLDER = "Результаты обработки появятся здесь" MODEL_PATH = "Путь к папке с моделью Whisper" TERMS_FILE = "Путь к файлу с медицинскими терминами" # ============================================================================ # REPORT TEMPLATES # ============================================================================ class ReportDefaults: """Report generation defaults.""" DOCUMENT_TITLE = "Магнитно-резонансная томография" DEFAULT_FONT_NAME = "Times New Roman" DEFAULT_FONT_SIZE = 12 HEADING_FONT_SIZE = 14 class ProcessingSteps(Enum): """Pipeline processing steps.""" INITIALIZATION = "initialization" STT = "stt" KNOWLEDGE_BASE = "knowledge_base" CORRECTION = "llm_correction" REPORT_GENERATION = "report_generation" COMPLETION = "completion"