"""Валидаторы входных данных. Не зависят от torch/silero — можно тестировать изолированно. """ from fastapi import HTTPException def validate_text(text: str) -> str: """ Очистка и валидация входного текста: - Убирает управляющие символы (кроме \n \r \t) - Нормализует множественные пробелы - Проверяет длину """ if not text.strip(): raise HTTPException( status_code=400, detail="Текст не может быть пустым или пробелами", ) # Удаляем управляющие символы text = "".join( ch for ch in text if ch in ("\n", "\r", "\t") or (ord(ch) >= 32 and ch != "\x7f") ) # Нормализуем множественные пробелы (но не табы/ньюлайны) import re text = re.sub(r"[^\S\n\t]+", " ", text) text = text.strip() if len(text) > 4000: raise HTTPException( status_code=400, detail=f"Текст слишком длинный (max 4000, got {len(text)})", ) return text def validate_speaker(speaker: str, speakers: dict) -> str: """Проверка валидности голоса.""" if speaker not in speakers: raise HTTPException( status_code=400, detail=f"Неизвестный голос. Доступные: {', '.join(speakers.keys())}", ) return speaker