Улучшенный будильник, таймер, перевод
This commit is contained in:
70
app/main.py
70
app/main.py
@@ -47,23 +47,13 @@ from .audio.wakeword import (
|
||||
from .audio.wakeword import (
|
||||
stop_monitoring as stop_wakeword_monitoring,
|
||||
)
|
||||
from .core.ai import ask_ai, ask_ai_stream, translate_text
|
||||
from .core.ai import ask_ai_stream, translate_text
|
||||
from .core.cleaner import clean_response
|
||||
from .core.commands import is_stop_command
|
||||
from .features.alarm import get_alarm_clock
|
||||
from .features.timer import get_timer_manager
|
||||
from .features.weather import get_weather_report
|
||||
|
||||
# Список стоп-слов, чтобы прервать диалог или остановить ассистента
|
||||
STOP_WORDS = {
|
||||
"стоп",
|
||||
"хватит",
|
||||
"перестань",
|
||||
"замолчи",
|
||||
"прекрати",
|
||||
"тихо",
|
||||
"stop",
|
||||
}
|
||||
|
||||
from .features.music import get_music_controller
|
||||
|
||||
def signal_handler(sig, frame):
|
||||
"""
|
||||
@@ -85,8 +75,22 @@ def parse_translation_request(text: str):
|
||||
Или None, если это не запрос перевода.
|
||||
"""
|
||||
text_lower = text.lower().strip()
|
||||
# Список префиксов команд перевода и соответствующих направлений языков
|
||||
# Список префиксов команд перевода и соответствующих направлений языков.
|
||||
# Важно: более длинные префиксы должны проверяться первыми (например,
|
||||
# "переведи с русского на английский" не должен схватиться как "переведи с русского").
|
||||
commands = [
|
||||
("переведи на английский с русского", "ru", "en"),
|
||||
("переведи на русский с английского", "en", "ru"),
|
||||
("переведи на английский язык с русского", "ru", "en"),
|
||||
("переведи на русский язык с английского", "en", "ru"),
|
||||
("переведи с русского на английский", "ru", "en"),
|
||||
("переведи с русского в английский", "ru", "en"),
|
||||
("переведи с английского на русский", "en", "ru"),
|
||||
("переведи с английского в русский", "en", "ru"),
|
||||
("переведи с русского языка", "ru", "en"),
|
||||
("переведи с английского языка", "en", "ru"),
|
||||
("переведи на английский язык", "ru", "en"),
|
||||
("переведи на русский язык", "en", "ru"),
|
||||
("переведи на английский", "ru", "en"),
|
||||
("переведи на русский", "en", "ru"),
|
||||
("переведи с английского", "en", "ru"),
|
||||
@@ -95,18 +99,25 @@ def parse_translation_request(text: str):
|
||||
("как по английски", "ru", "en"),
|
||||
("как по-русски", "en", "ru"),
|
||||
("как по русски", "en", "ru"),
|
||||
("translate to english", "ru", "en"),
|
||||
("translate to english from russian", "ru", "en"),
|
||||
("translate to russian from english", "en", "ru"),
|
||||
("translate from russian to english", "ru", "en"),
|
||||
("translate from english to russian", "en", "ru"),
|
||||
("translate into english", "ru", "en"),
|
||||
("translate to russian", "en", "ru"),
|
||||
("translate into russian", "en", "ru"),
|
||||
("translate to english", "ru", "en"),
|
||||
("translate to russian", "en", "ru"),
|
||||
("translate from english", "en", "ru"),
|
||||
("translate from russian", "ru", "en"),
|
||||
]
|
||||
|
||||
for prefix, source_lang, target_lang in commands:
|
||||
for prefix, source_lang, target_lang in sorted(
|
||||
commands, key=lambda item: len(item[0]), reverse=True
|
||||
):
|
||||
if text_lower.startswith(prefix):
|
||||
# Отрезаем команду (префикс), оставляем только текст для перевода
|
||||
rest = text[len(prefix) :].strip()
|
||||
rest = rest.lstrip(" :—-")
|
||||
return {
|
||||
"source_lang": source_lang,
|
||||
"target_lang": target_lang,
|
||||
@@ -115,21 +126,6 @@ def parse_translation_request(text: str):
|
||||
return None
|
||||
|
||||
|
||||
def is_stop_command(text: str) -> bool:
|
||||
"""
|
||||
Проверяет, содержится ли в тексте команда остановки.
|
||||
Удаляет знаки препинания и ищет слова из списка STOP_WORDS.
|
||||
"""
|
||||
text_lower = text.lower()
|
||||
for ch in ",.!?:;":
|
||||
text_lower = text_lower.replace(ch, " ")
|
||||
words = text_lower.split()
|
||||
for word in words:
|
||||
if word in STOP_WORDS:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def main():
|
||||
"""
|
||||
Основная функция (точка входа).
|
||||
@@ -340,6 +336,16 @@ def main():
|
||||
skip_wakeword = True
|
||||
continue
|
||||
|
||||
# Проверка музыкальных команд ("включи музыку", "пауза", и т.д.)
|
||||
music_controller = get_music_controller()
|
||||
music_response = music_controller.parse_command(user_text)
|
||||
if music_response:
|
||||
clean_music_response = clean_response(music_response, language="ru")
|
||||
speak(clean_music_response)
|
||||
last_response = clean_music_response
|
||||
skip_wakeword = True
|
||||
continue
|
||||
|
||||
# Проверка запроса на перевод
|
||||
translation_request = parse_translation_request(user_text)
|
||||
if translation_request:
|
||||
|
||||
Reference in New Issue
Block a user