Улучшенный будильник, таймер, перевод
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user