50 lines
1.6 KiB
Python
Executable File
50 lines
1.6 KiB
Python
Executable File
"""Валидаторы входных данных.
|
|
|
|
Не зависят от 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
|