Улучшенный будильник, таймер, перевод

This commit is contained in:
2026-02-01 19:59:18 +03:00
parent 49dbaad122
commit d0b12009b3
15 changed files with 1013 additions and 105 deletions

View File

@@ -8,14 +8,16 @@ Supports interruption via wake word detection using threading.
# Использует нейросеть Silero TTS для качественной русской речи.
# Также поддерживает прерывание речи, если пользователь скажет "Alexandr".
import torch
import sounddevice as sd
import numpy as np
import re
import threading
import time
import warnings
import re
from ..core.config import TTS_SPEAKER, TTS_EN_SPEAKER, TTS_SAMPLE_RATE
import numpy as np
import sounddevice as sd
import torch
from ..core.config import TTS_EN_SPEAKER, TTS_SAMPLE_RATE, TTS_SPEAKER
# Подавляем предупреждения Silero о длинном тексте (мы сами его режем)
warnings.filterwarnings("ignore", message="Text string is longer than 1000 symbols")
@@ -46,12 +48,21 @@ class TextToSpeech:
if self.model_en:
return self.model_en
print("📦 Загрузка модели Silero TTS (en)...")
model, _ = torch.hub.load(
repo_or_dir="snakers4/silero-models",
model="silero_tts",
language="en",
speaker="v3_en",
)
try:
model, _ = torch.hub.load(
repo_or_dir="snakers4/silero-models",
model="silero_tts",
language="en",
speaker="v5_en",
)
except Exception as exc:
print(f"⚠️ Не удалось загрузить v5_en, пробую v3_en: {exc}")
model, _ = torch.hub.load(
repo_or_dir="snakers4/silero-models",
model="silero_tts",
language="en",
speaker="v3_en",
)
model.to(device)
self.model_en = model
return model
@@ -71,8 +82,18 @@ class TextToSpeech:
return model
def initialize(self):
"""Предварительная инициализация (прогрев) русской модели."""
"""Предварительная инициализация (прогрев) русской и английской моделей."""
self._load_model("ru")
self._load_model("en")
def _preprocess_text(self, text: str) -> str:
"""
Предварительная обработка текста перед озвучкой.
Заменяет тире между цифрами на слово "тире" для корректного чтения.
"""
# Замена 18-43 на "18 тире 43"
text = re.sub(r"(\d+)-(\d+)", r"\1 тире \2", text)
return text
def _split_text(self, text: str, max_length: int = 900) -> list[str]:
"""
@@ -263,6 +284,7 @@ class TextToSpeech:
return True
if language == "ru":
text = self._preprocess_text(text)
segments = self._split_mixed_language(text)
if any(lang == "en" for _, lang in segments):
return self._speak_mixed(segments, check_interrupt=check_interrupt)