From 242ead53556067c0c2c78c67f9051d2d7a80d400 Mon Sep 17 00:00:00 2001 From: nvfuture Date: Fri, 9 Jan 2026 01:01:27 +0300 Subject: [PATCH] =?UTF-8?q?translator=20=D0=BD=D0=BE=20=D0=B1=D0=B5=D0=B7?= =?UTF-8?q?=20=D0=BE=D0=B7=D0=B2=D1=83=D1=87=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D1=81=D0=BB=D0=BE=D0=B2=20=D0=BD=D0=B0=20=D0=B0=D0=BD?= =?UTF-8?q?=D0=B3=D0=BB=D0=B8=D0=B9=D1=81=D0=BA=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Apex-1.mp3 | Bin 0 -> 162395 bytes ai.py | 67 ++++++++++++ alarm.py | 194 +++++++++++++++++++++++++++++++++++ alarms.json | 12 +++ cleaner.py | 285 +++++++++++++++++++++++++++------------------------ config.py | 10 +- local_stt.py | 116 +++++++++++++++++++++ main.py | 173 +++++++++++++++++++++++++++---- stt.py | 62 ++++++----- tts.py | 70 +++++++++---- wakeword.py | 94 +++++++++-------- 11 files changed, 845 insertions(+), 238 deletions(-) create mode 100644 Apex-1.mp3 create mode 100644 alarm.py create mode 100644 alarms.json create mode 100644 local_stt.py diff --git a/Apex-1.mp3 b/Apex-1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..37a33ad8cb19c3b7453df2cf1390780b414f1d50 GIT binary patch literal 162395 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 #r|t)IikAX$~zLP&zssN^k5;`(fPUq#J< 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 literal 0 HcmV?d00001 diff --git a/ai.py b/ai.py index 9deeaac..00919e9 100644 --- a/ai.py +++ b/ai.py @@ -16,6 +16,10 @@ SYSTEM_PROMPT = """Ты — Александр, умный голосовой а Пиши в разговорном стиле, как при живом общении, но не забывай о вежливости и правильности твоих ответов. ВАЖНО: Не используй в ответах панибратские или сленговые приветствия и обращения, такие как "Эй", "Хэй", "Слушай" в начале фразы и подобные.""" +TRANSLATION_SYSTEM_PROMPT = """You are a translation engine. +Translate from {source} to {target}. +Return only the translated text, without quotes, comments, or explanations.""" + def ask_ai(messages_history: list) -> str: """ @@ -72,3 +76,66 @@ def ask_ai(messages_history: list) -> str: except (KeyError, IndexError) as e: print(f"❌ Ошибка парсинга ответа: {e}") return "Не удалось обработать ответ от AI." + + +def translate_text(text: str, source_lang: str, target_lang: str) -> str: + """ + Translate text using Perplexity AI. + + Args: + text: Text to translate + source_lang: Source language code ("ru" or "en") + target_lang: Target language code ("ru" or "en") + + Returns: + Translated text + """ + if not text: + return "Извините, я не расслышал текст для перевода." + + lang_names = {"ru": "Russian", "en": "English"} + source_name = lang_names.get(source_lang, source_lang) + target_name = lang_names.get(target_lang, target_lang) + + print(f"🌍 Перевод: {source_name} -> {target_name}: {text[:60]}...") + + headers = { + "Authorization": f"Bearer {PERPLEXITY_API_KEY}", + "Content-Type": "application/json", + } + + messages = [ + { + "role": "system", + "content": TRANSLATION_SYSTEM_PROMPT.format( + source=source_name, target=target_name + ), + }, + {"role": "user", "content": text}, + ] + + payload = { + "model": PERPLEXITY_MODEL, + "messages": messages, + "max_tokens": 400, + "temperature": 0.2, + } + + try: + response = requests.post( + PERPLEXITY_API_URL, headers=headers, json=payload, timeout=30 + ) + response.raise_for_status() + + data = response.json() + ai_response = data["choices"][0]["message"]["content"] + return ai_response.strip() + + except requests.exceptions.Timeout: + return "Извините, сервер не отвечает. Попробуйте позже." + except requests.exceptions.RequestException as e: + print(f"❌ Ошибка API перевода: {e}") + return "Произошла ошибка при переводе. Попробуйте ещё раз." + except (KeyError, IndexError) as e: + print(f"❌ Ошибка парсинга ответа перевода: {e}") + return "Не удалось обработать перевод." diff --git a/alarm.py b/alarm.py new file mode 100644 index 0000000..a710304 --- /dev/null +++ b/alarm.py @@ -0,0 +1,194 @@ +""" +Alarm clock module. +Handles alarm scheduling, persistence, and playback. +""" +import json +import time +import subprocess +import re +import threading +from datetime import datetime +from pathlib import Path +from config import BASE_DIR +from local_stt import listen_for_keywords + +ALARM_FILE = BASE_DIR / "alarms.json" +ALARM_SOUND = BASE_DIR / "Apex-1.mp3" + +class AlarmClock: + def __init__(self): + self.alarms = [] + self.load_alarms() + + def load_alarms(self): + """Load alarms from JSON file.""" + if ALARM_FILE.exists(): + try: + with open(ALARM_FILE, "r", encoding="utf-8") as f: + self.alarms = json.load(f) + except Exception as e: + print(f"❌ Ошибка загрузки будильников: {e}") + self.alarms = [] + + def save_alarms(self): + """Save alarms to JSON file.""" + try: + with open(ALARM_FILE, "w", encoding="utf-8") as f: + json.dump(self.alarms, f, indent=4) + except Exception as e: + print(f"❌ Ошибка сохранения будильников: {e}") + + def add_alarm(self, hour: int, minute: int): + """Add a new alarm.""" + # Check if already exists + for alarm in self.alarms: + if alarm["hour"] == hour and alarm["minute"] == minute: + alarm["active"] = True + self.save_alarms() + return + + self.alarms.append({ + "hour": hour, + "minute": minute, + "active": True + }) + self.save_alarms() + print(f"⏰ Будильник установлен на {hour:02d}:{minute:02d}") + + def cancel_all_alarms(self): + """Cancel all active alarms.""" + for alarm in self.alarms: + alarm["active"] = False + self.save_alarms() + print("🔕 Все будильники отменены.") + + def check_alarms(self): + """Check if any alarm should trigger now. Returns True if triggered.""" + now = datetime.now() + triggered = False + + for alarm in self.alarms: + if alarm["active"]: + if alarm["hour"] == now.hour and alarm["minute"] == now.minute: + # Prevent re-triggering within the same minute? + # We should disable it immediately or track last trigger time. + # For simple logic: disable it (one-time alarm). + + # But wait, checking every second? + # If I disable it, it won't ring for the whole minute. + # Correct. + print(f"⏰ ВРЕМЯ БУДИЛЬНИКА: {alarm['hour']:02d}:{alarm['minute']:02d}") + alarm["active"] = False + triggered = True + self.trigger_alarm() + break # Trigger one at a time + + if triggered: + self.save_alarms() + return True + return False + + def trigger_alarm(self): + """Play alarm sound and wait for stop command.""" + print("🔔 БУДИЛЬНИК ЗВОНИТ! (Скажите 'Стоп' или 'Александр стоп')") + + # Start playing sound in loop + # -q for quiet (no output) + # --loop -1 for infinite loop + cmd = ["mpg123", "-q", "--loop", "-1", str(ALARM_SOUND)] + + try: + process = subprocess.Popen(cmd) + except FileNotFoundError: + print("❌ Ошибка: mpg123 не найден. Установите его: sudo apt install mpg123") + return + + try: + # Listen for stop command using local Vosk + # Loop until stop word is heard + stop_words = ["стоп", "хватит", "тихо", "замолчи", "отмена", "александр стоп"] + + while True: + # Listen in short bursts to be responsive + text = listen_for_keywords(stop_words, timeout=3.0) + if text: + print(f"🛑 Будильник остановлен по команде: '{text}'") + break + + except Exception as e: + print(f"❌ Ошибка во время будильника: {e}") + finally: + # Kill the player + process.terminate() + try: + process.wait(timeout=1) + except subprocess.TimeoutExpired: + process.kill() + print("🔕 Будильник выключен.") + + def parse_command(self, text: str) -> str | None: + """ + Parse user text for alarm commands. + Returns response string if command handled, None otherwise. + """ + text = text.lower() + if "будильник" not in text and "разбуди" not in text: + return None + + if "отмени" in text: + self.cancel_all_alarms() + return "Хорошо, я отменил все будильники." + + # Regex to find time: HH:MM, HH-MM, HH MM, HH часов MM минут + # 1. "07:30", "7:30" + match = re.search(r'\b(\d{1,2})[:.-](\d{2})\b', text) + if match: + h, m = int(match.group(1)), int(match.group(2)) + if 0 <= h <= 23 and 0 <= m <= 59: + self.add_alarm(h, m) + return f"Я установил будильник на {h} часов {m} минут." + + # 2. "7 часов 30 минут" or "7 30" + # Search for pattern: digits ... (digits)? + # Complex to separate from other numbers. + + # Simple heuristics: + words = text.split() + nums = [int(s) for s in text.split() if s.isdigit()] + + # "на 7" -> 7:00 + if "на" in words or "в" in words: + # Try to find number after preposition + pass + + # Let's rely on explicit digit search if regex failed + # Patterns: "на 8", "на 8 30", "на 8 часов 30 минут", "на 8 часов" + + # Regex to capture hour and optional minute + # Matches: "на [часов] [M] [минут]" + match_time = re.search(r'на\s+(\d{1,2})(?:\s*(?:часов|часа|час))?(?:\s+(\d{1,2})(?:\s*(?:минут|минуты|минута))?)?', text) + + if match_time: + h = int(match_time.group(1)) + m = int(match_time.group(2)) if match_time.group(2) else 0 + + # Handle AM/PM if specified + if "вечера" in text and h < 12: + h += 12 + elif "утра" in text and h == 12: + h = 0 + + if 0 <= h <= 23 and 0 <= m <= 59: + self.add_alarm(h, m) + return f"Хорошо, разбужу вас в {h}:{m:02d}." + + return "Я не понял время для будильника. Пожалуйста, скажите точное время, например 'семь тридцать'." + +# Global instance +_alarm_clock = None + +def get_alarm_clock(): + global _alarm_clock + if _alarm_clock is None: + _alarm_clock = AlarmClock() + return _alarm_clock diff --git a/alarms.json b/alarms.json new file mode 100644 index 0000000..c6998bd --- /dev/null +++ b/alarms.json @@ -0,0 +1,12 @@ +[ + { + "hour": 10, + "minute": 15, + "active": true + }, + { + "hour": 3, + "minute": 42, + "active": false + } +] \ No newline at end of file diff --git a/cleaner.py b/cleaner.py index dfc2f29..f338bd3 100644 --- a/cleaner.py +++ b/cleaner.py @@ -3,6 +3,7 @@ Response cleaner module. Removes markdown formatting and special characters from AI responses. Handles complex number-to-text conversion for Russian language. """ + import re import pymorphy3 from num2words import num2words @@ -12,79 +13,86 @@ morph = pymorphy3.MorphAnalyzer() # Preposition to case mapping (simplified heuristics) PREPOSITION_CASES = { - 'в': 'loct', # Prepositional (Locative 2) or Accusative. 'v godu' -> loct - 'во': 'loct', - 'на': 'accs', # Dates: 'na 5 maya' -> Accusative (na pyatoe) - 'о': 'loct', - 'об': 'loct', - 'обо': 'loct', - 'при': 'loct', - 'у': 'gent', - 'от': 'gent', - 'до': 'gent', - 'из': 'gent', - 'с': 'gent', # or ablt (instrumental) - 'со': 'gent', - 'без': 'gent', - 'для': 'gent', - 'вокруг': 'gent', - 'после': 'gent', - 'к': 'datv', - 'ко': 'datv', - 'по': 'datv', # or accs for dates (limit). Heuristic: datv defaults usually. - 'над': 'ablt', - 'под': 'ablt', - 'перед': 'ablt', - 'за': 'ablt', # or acc - 'между': 'ablt', + "в": "loct", # Prepositional (Locative 2) or Accusative. 'v godu' -> loct + "во": "loct", + "на": "accs", # Dates: 'na 5 maya' -> Accusative (na pyatoe) + "о": "loct", + "об": "loct", + "обо": "loct", + "при": "loct", + "у": "gent", + "от": "gent", + "до": "gent", + "из": "gent", + "с": "gent", # or ablt (instrumental) + "со": "gent", + "без": "gent", + "для": "gent", + "вокруг": "gent", + "после": "gent", + "к": "datv", + "ко": "datv", + "по": "datv", # or accs for dates (limit). Heuristic: datv defaults usually. + "над": "ablt", + "под": "ablt", + "перед": "ablt", + "за": "ablt", # or acc + "между": "ablt", } # Mapping pymorphy cases to num2words cases PYMORPHY_TO_NUM2WORDS = { - 'nomn': 'nominative', - 'gent': 'genitive', - 'datv': 'dative', - 'accs': 'accusative', - 'ablt': 'instrumental', - 'loct': 'prepositional', - 'voct': 'nominative', # Fallback - 'gen2': 'genitive', - 'acc2': 'accusative', - 'loc2': 'prepositional', + "nomn": "nominative", + "gent": "genitive", + "datv": "dative", + "accs": "accusative", + "ablt": "instrumental", + "loct": "prepositional", + "voct": "nominative", # Fallback + "gen2": "genitive", + "acc2": "accusative", + "loc2": "prepositional", } # Month names in Genitive case (as they appear in dates) MONTHS_GENITIVE = [ - 'января', 'февраля', 'марта', 'апреля', 'мая', 'июня', - 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря' + "января", + "февраля", + "марта", + "апреля", + "мая", + "июня", + "июля", + "августа", + "сентября", + "октября", + "ноября", + "декабря", ] + def get_case_from_preposition(prep_token): """Return pymorphy case based on preposition.""" if not prep_token: return None return PREPOSITION_CASES.get(prep_token.lower()) -def convert_number(number_str, context_type='cardinal', case='nominative', gender='m'): + +def convert_number(number_str, context_type="cardinal", case="nominative", gender="m"): """Convert a number string to words with specific parameters.""" try: # Handle floats - if '.' in number_str or ',' in number_str: - num_val = float(number_str.replace(',', '.')) + if "." in number_str or "," in number_str: + num_val = float(number_str.replace(",", ".")) else: num_val = int(number_str) - - return num2words( - num_val, - lang='ru', - to=context_type, - case=case, - gender=gender - ) + + return num2words(num_val, lang="ru", to=context_type, case=case, gender=gender) except Exception as e: print(f"Error converting number {number_str}: {e}") return number_str + def numbers_to_words(text: str) -> str: """ Intelligent conversion of digits in text to Russian words. @@ -96,59 +104,65 @@ def numbers_to_words(text: str) -> str: # 1. Identify "Year" patterns: "1999 год", "в 2024 году" def replace_year_match(match): full_str = match.group(0) - prep = match.group(1) # Could be None + prep = match.group(1) # Could be None year_str = match.group(2) - year_word = match.group(3) # год, году, года... - + year_word = match.group(3) # год, году, года... + parsed = morph.parse(year_word)[0] case_tag = parsed.tag.case - - if prep and prep.strip().lower() in ['в', 'во'] and case_tag in ['accs', 'nomn']: - pass - nw_case = PYMORPHY_TO_NUM2WORDS.get(case_tag, 'nominative') - - words = convert_number(year_str, context_type='ordinal', case=nw_case, gender='m') - + if ( + prep + and prep.strip().lower() in ["в", "во"] + and case_tag in ["accs", "nomn"] + ): + pass + + nw_case = PYMORPHY_TO_NUM2WORDS.get(case_tag, "nominative") + + words = convert_number( + year_str, context_type="ordinal", case=nw_case, gender="m" + ) + prefix = f"{prep} " if prep else "" return f"{prefix}{words} {year_word}" text = re.sub( - r'(?i)\b((?:в|с|к|до|от)\s+)?(\d{3,4})\s+(год[а-я]*)\b', + r"(?i)\b((?:в|с|к|до|от)\s+)?(\d{3,4})\s+(год[а-я]*)\b", replace_year_match, - text + text, ) # 2. Identify "Date" patterns: "25 июня", "с 1 мая" # Matches: (Preposition)? (Day) (Month_Genitive) # Day is usually 1-31. - month_regex = '|'.join(MONTHS_GENITIVE) - + month_regex = "|".join(MONTHS_GENITIVE) + def replace_date_match(match): prep = match.group(1) day_str = match.group(2) month_word = match.group(3) - + # Determine case # Default to Genitive ("25 июня" -> "двадцать пятого июня") - case = 'genitive' - + case = "genitive" + if prep: prep_clean = prep.strip().lower() # Specific overrides for dates - if prep_clean == 'на': - case = 'accusative' # на 5 мая -> на пятое - elif prep_clean == 'по': - case = 'accusative' # по 5 мая -> по пятое (limit) - elif prep_clean == 'к': - case = 'dative' # к 5 мая -> к пятому - elif prep_clean in ['с', 'до', 'от']: - case = 'genitive' # с 5 мая -> с пятого + if prep_clean == "на": + case = "accusative" # на 5 мая -> на пятое + elif prep_clean == "по": + case = "accusative" # по 5 мая -> по пятое (limit) + elif prep_clean == "к": + case = "dative" # к 5 мая -> к пятому + elif prep_clean in ["с", "до", "от"]: + case = "genitive" # с 5 мая -> с пятого else: # Fallback to general preposition map morph_case = get_case_from_preposition(prep_clean) if morph_case: - case = PYMORPHY_TO_NUM2WORDS.get(morph_case, 'genitive') + case = PYMORPHY_TO_NUM2WORDS.get(morph_case, "genitive") # Convert to Ordinal # Dates are neuter ("число" implies neuter: "пятое", "пятого") @@ -156,112 +170,119 @@ def numbers_to_words(text: str) -> str: # 5, ordinal, genitive -> "пятого" (masc/neut are same) # 5, ordinal, accusative -> "пятое" (neuter) vs "пятый" (masc inanimate?) # Let's specify gender='n' (neuter) for dates to be safe (пятое, пятого, пятому). - - words = convert_number(day_str, context_type='ordinal', case=case, gender='n') - + + words = convert_number(day_str, context_type="ordinal", case=case, gender="n") + prefix = f"{prep} " if prep else "" return f"{prefix}{words} {month_word}" text = re.sub( - r'(?i)\b((?:с|к|до|от|на|по)\s+)?(\d{1,2})\s+(' + month_regex + r')\b', + r"(?i)\b((?:с|к|до|от|на|по)\s+)?(\d{1,2})\s+(" + month_regex + r")\b", replace_date_match, - text + text, ) # 3. Handle remaining numbers (Cardinals) def replace_cardinal_match(match): prep = match.group(1) num_str = match.group(2) - - case = 'nominative' + + case = "nominative" if prep: morph_case = get_case_from_preposition(prep.strip()) if morph_case: - case = PYMORPHY_TO_NUM2WORDS.get(morph_case, 'nominative') - - words = convert_number(num_str, context_type='cardinal', case=case) - + case = PYMORPHY_TO_NUM2WORDS.get(morph_case, "nominative") + + words = convert_number(num_str, context_type="cardinal", case=case) + prefix = f"{prep} " if prep else "" return f"{prefix}{words}" text = re.sub( - r'(?i)\b((?:в|на|о|об|обо|при|у|от|до|из|с|со|без|для|вокруг|после|к|ко|по|над|под|перед|за|между)\s+)?(\d+(?:[.,]\d+)?)\b', + r"(?i)\b((?:в|на|о|об|обо|при|у|от|до|из|с|со|без|для|вокруг|после|к|ко|по|над|под|перед|за|между)\s+)?(\d+(?:[.,]\d+)?)\b", replace_cardinal_match, - text + text, ) - + return text -def clean_response(text: str) -> str: +def clean_response(text: str, language: str = "ru") -> str: """ Clean AI response from markdown formatting and special characters. - + Args: text: Raw AI response with possible markdown - + language: Target language for output (affects post-processing) + Returns: Clean text suitable for TTS """ if not text: return "" - + # Remove citation references like [1], [2], [citation], etc. # Using hex escapes for brackets to avoid escaping issues - text = re.sub(r'\x5B\d+\x5D', '', text) - text = re.sub(r'\x5Bcitation\s*needed\x5D', '', text, flags=re.IGNORECASE) - text = re.sub(r'\x5Bsource\x5D', '', text, flags=re.IGNORECASE) - + text = re.sub(r"\x5B\d+\x5D", "", text) + text = re.sub(r"\x5Bcitation\s*needed\x5D", "", text, flags=re.IGNORECASE) + text = re.sub(r"\x5Bsource\x5D", "", text, flags=re.IGNORECASE) + # Remove markdown bold **text** and __text__ - text = re.sub(r'\*\*(.+?)\*\*', r'\1', text) - text = re.sub(r'__(.+?)__', r'\1', text) - + text = re.sub(r"\*\*(.+?)\*\*", r"\1", text) + text = re.sub(r"__(.+?)__", r"\1", text) + # Remove markdown italic *text* and _text_ - text = re.sub(r'\*(.+?)\*', r'\1', text) - text = re.sub(r'(? text - text = re.sub(r'\x5B([^\x5D]+)\x5D\([^)]+\)', r'\1', text) - + text = re.sub(r"\x5B([^\x5D]+)\x5D\([^)]+\)", r"\1", text) + # Remove markdown images ![alt](url) - text = re.sub(r'!\x5B([^\x5D]*)\x5D\([^)]+\)', '', text) - + text = re.sub(r"!\x5B([^\x5D]*)\x5D\([^)]+\)", "", text) + # Remove inline code `code` - text = re.sub(r'`([^`]+)`', r'\1', text) - + text = re.sub(r"`([^`]+)`", r"\1", text) + # Remove code blocks ```code``` - text = re.sub(r'```[\s\S]*?```', '', text) - + text = re.sub(r"```[\s\S]*?```", "", text) + # Remove markdown list markers (-, *, +, numbered) - text = re.sub(r'^\s*[-*+]\s+', '', text, flags=re.MULTILINE) - text = re.sub(r'^\s*\d+\.\s+', '', text, flags=re.MULTILINE) - + text = re.sub(r"^\s*[-*+]\s+", "", text, flags=re.MULTILINE) + text = re.sub(r"^\s*\d+\.\s+", "", text, flags=re.MULTILINE) + # Remove blockquotes - text = re.sub(r'^\s*>\s*', '', text, flags=re.MULTILINE) - + text = re.sub(r"^\s*>\s*", "", text, flags=re.MULTILINE) + # Remove horizontal rules - text = re.sub(r'^[-*_]{3,}\s*$', '', text, flags=re.MULTILINE) - + text = re.sub(r"^[-*_]{3,}\s*$", "", text, flags=re.MULTILINE) + # Remove HTML tags if any - text = re.sub(r'<[^>]+>', '', text) + text = re.sub(r"<[^>]+>", "", text) # Remove informal slang greetings at the beginning of sentences/responses - text = re.sub(r'^(Эй|Хэй|Слушай|Так|Ну|Короче|В\s+общем)[,!?:]?\s*', '', text, flags=re.IGNORECASE | re.MULTILINE) - - # Convert numbers to words (Russian) - text = numbers_to_words(text) - + text = re.sub( + r"^(Эй|Хэй|Слушай|Так|Ну|Короче|В\s+общем)[,!?:]?\s*", + "", + text, + flags=re.IGNORECASE | re.MULTILINE, + ) + + # Convert numbers to words only for Russian, and only if digits exist + if language == "ru" and re.search(r"\d", text): + text = numbers_to_words(text) + # Remove extra whitespace - text = re.sub(r'\n{3,}', '\n\n', text) - text = re.sub(r' +', ' ', text) - + text = re.sub(r"\n{3,}", "\n\n", text) + text = re.sub(r" +", " ", text) + # Clean up and return text = text.strip() - - return text \ No newline at end of file + + return text diff --git a/config.py b/config.py index 8c2c978..1b083f6 100644 --- a/config.py +++ b/config.py @@ -2,6 +2,7 @@ Configuration module for smart speaker. Loads environment variables from .env file. """ + import os from pathlib import Path from dotenv import load_dotenv @@ -31,6 +32,13 @@ VOSK_MODEL_PATH = BASE_DIR / "vosk-model-ru-0.42" SAMPLE_RATE = 16000 CHANNELS = 1 +# Set timezone to Moscow +import time + +os.environ["TZ"] = "Europe/Moscow" +time.tzset() + # TTS configuration -TTS_SPEAKER = "eugene" # Available: aidar, baya, kseniya, xenia, eugene +TTS_SPEAKER = "eugene" # Available (ru): aidar, baya, kseniya, xenia, eugene +TTS_EN_SPEAKER = os.getenv("TTS_EN_SPEAKER", "en_0") TTS_SAMPLE_RATE = 48000 diff --git a/local_stt.py b/local_stt.py new file mode 100644 index 0000000..f53d648 --- /dev/null +++ b/local_stt.py @@ -0,0 +1,116 @@ +""" +Local offline Speech-to-Text module using Vosk. +Used for simple command detection (like "stop") without internet. +""" +import os +import sys +import json +import pyaudio +from vosk import Model, KaldiRecognizer +from config import VOSK_MODEL_PATH, SAMPLE_RATE + +class LocalRecognizer: + def __init__(self): + self.model = None + self.rec = None + self.pa = None + self.stream = None + + def initialize(self): + if not os.path.exists(VOSK_MODEL_PATH): + print(f"❌ Ошибка: Vosk модель не найдена по пути {VOSK_MODEL_PATH}") + return False + + print("📦 Инициализация локального STT (Vosk)...") + # Redirect stderr to suppress Vosk logs + try: + null_fd = os.open(os.devnull, os.O_WRONLY) + old_stderr = os.dup(2) + sys.stderr.flush() + os.dup2(null_fd, 2) + os.close(null_fd) + + self.model = Model(str(VOSK_MODEL_PATH)) + + # Restore stderr + os.dup2(old_stderr, 2) + os.close(old_stderr) + except Exception as e: + print(f"Error initializing Vosk: {e}") + return False + + self.rec = KaldiRecognizer(self.model, SAMPLE_RATE) + self.pa = pyaudio.PyAudio() + return True + + def listen_for_keywords(self, keywords: list, timeout: float = 10.0) -> str: + """ + Listen for specific keywords locally. + Returns the recognized keyword if found, or empty string. + """ + if not self.model: + if not self.initialize(): + return "" + + # Open stream + try: + stream = self.pa.open(format=pyaudio.paInt16, channels=1, rate=SAMPLE_RATE, input=True, frames_per_buffer=4096) + stream.start_stream() + except Exception as e: + print(f"❌ Ошибка микрофона: {e}") + return "" + + import time + start_time = time.time() + + print(f"👂 Локальное слушание ожидает: {keywords}") + + detected_text = "" + + try: + while time.time() - start_time < timeout: + data = stream.read(4096, exception_on_overflow=False) + if self.rec.AcceptWaveform(data): + res = json.loads(self.rec.Result()) + text = res.get("text", "") + if text: + print(f"📝 Локально: {text}") + # Check against keywords + for kw in keywords: + if kw in text: + detected_text = text + break + else: + # Partial result + res = json.loads(self.rec.PartialResult()) + partial = res.get("partial", "") + if partial: + for kw in keywords: + if kw in partial: + detected_text = partial + break + + if detected_text: + break + finally: + stream.stop_stream() + stream.close() + + return detected_text + + def cleanup(self): + if self.pa: + self.pa.terminate() + +# Global instance +_local_recognizer = None + +def get_local_recognizer(): + global _local_recognizer + if _local_recognizer is None: + _local_recognizer = LocalRecognizer() + return _local_recognizer + +def listen_for_keywords(keywords: list, timeout: float = 5.0) -> str: + """Listen for keywords using Vosk.""" + return get_local_recognizer().listen_for_keywords(keywords, timeout) diff --git a/main.py b/main.py index 0e20171..a45a1f1 100644 --- a/main.py +++ b/main.py @@ -13,14 +13,22 @@ Flow: import signal import sys +import re +import threading from collections import deque -from wakeword import wait_for_wakeword, cleanup as cleanup_wakeword, check_wakeword_once +from wakeword import ( + wait_for_wakeword, + cleanup as cleanup_wakeword, + check_wakeword_once, + stop_monitoring as stop_wakeword_monitoring, +) from stt import listen, cleanup as cleanup_stt, get_recognizer -from ai import ask_ai +from ai import ask_ai, translate_text from cleaner import clean_response from tts import speak, initialize as init_tts from sound_level import set_volume, parse_volume_text +from alarm import get_alarm_clock def signal_handler(sig, frame): @@ -31,6 +39,37 @@ def signal_handler(sig, frame): sys.exit(0) +def parse_translation_request(text: str): + """ + Detect translation commands and extract language direction and text. + + Returns: + dict with source_lang, target_lang, text or None + """ + patterns = [ + (r"^переведи на английский\s*(.*)$", "ru", "en"), + (r"^переведи на русский\s*(.*)$", "en", "ru"), + (r"^переведи с английского\s*(.*)$", "en", "ru"), + (r"^переведи с русского\s*(.*)$", "ru", "en"), + (r"^как по[-\s]?английски\s*(.*)$", "ru", "en"), + (r"^как по[-\s]?русски\s*(.*)$", "en", "ru"), + (r"^translate (?:to|into) english\s*(.*)$", "ru", "en"), + (r"^translate (?:to|into) russian\s*(.*)$", "en", "ru"), + (r"^translate from english\s*(.*)$", "en", "ru"), + (r"^translate from russian\s*(.*)$", "ru", "en"), + ] + + for pattern, source_lang, target_lang in patterns: + match = re.match(pattern, text, flags=re.IGNORECASE) + if match: + return { + "source_lang": source_lang, + "target_lang": target_lang, + "text": match.group(1).strip(), + } + return None + + def main(): """Main application loop.""" print("=" * 50) @@ -46,8 +85,31 @@ def main(): # Pre-initialize models (takes a few seconds) print("⏳ Инициализация моделей...") - get_recognizer().initialize() # Initialize STT model first - init_tts() # Then initialize TTS model + init_errors = [] + + def init_stt(): + try: + get_recognizer().initialize() + except Exception as e: + init_errors.append(e) + + def init_tts_model(): + try: + init_tts() + except Exception as e: + init_errors.append(e) + + stt_thread = threading.Thread(target=init_stt, daemon=True) + tts_thread = threading.Thread(target=init_tts_model, daemon=True) + stt_thread.start() + tts_thread.start() + stt_thread.join() + tts_thread.join() + + if init_errors: + raise init_errors[0] + + alarm_clock = get_alarm_clock() # Initialize Alarm Clock print() # Initialize chat history (last 10 exchanges = 20 messages) @@ -57,37 +119,58 @@ def main(): skip_wakeword = False while True: try: + # Ensure wake word detector stream is closed before listening + stop_wakeword_monitoring() + + # Check for alarms every loop iteration + if alarm_clock.check_alarms(): + # If alarm triggered and finished (user stopped it), we continue loop + # The alarm.trigger_alarm() blocks until stopped. + skip_wakeword = False # Reset state after alarm + continue + # Step 1: Wait for wake word or Follow-up listen if not skip_wakeword: - wait_for_wakeword() + # Wait with timeout to allow alarm checking + detected = wait_for_wakeword(timeout=1.0) + + # If timeout (not detected), loop again to check alarms + if not detected: + continue + # Standard listen after activation user_text = listen(timeout_seconds=7.0) else: - # Follow-up listen (wait 2.0s for start, then listen long) - print("👂 Слушаю продолжение диалога...") - user_text = listen(timeout_seconds=20.0, detection_timeout=2.0) - + # Follow-up listen (wait 5.0s for start) + print("👂 Слушаю продолжение диалога (5 сек)...") + user_text = listen(timeout_seconds=10.0, detection_timeout=5.0) + if not user_text: - # User didn't continue conversation, go back to sleep + # User didn't continue conversation, go back to sleep silently skip_wakeword = False continue - # Reset flag for now (will be set to True if we speak successfully) - skip_wakeword = False - # Step 2: Check if speech was recognized if not user_text: + # If this was a direct wake word activation but no speech speak("Извините, я вас не расслышал. Попробуйте ещё раз.") + skip_wakeword = False # Reset to wake word continue # Check for stop commands user_text_lower = user_text.lower().strip() - if user_text_lower in ["стоп", "александр", "стоп александр"]: + if user_text_lower in ["стоп", "александр", "стоп александр", "хватит"]: print("_" * 50) print("💤 Жду 'Alexandr' для активации...") skip_wakeword = False continue + # Check for alarm commands + alarm_response = alarm_clock.parse_command(user_text) + if alarm_response: + speak(alarm_response) + continue + # Check for volume command if user_text.lower().startswith("громкость"): try: @@ -113,21 +196,67 @@ def main(): speak("Не удалось изменить громкость.") continue + # Check for translation commands + translation_request = parse_translation_request(user_text) + if translation_request: + source_lang = translation_request["source_lang"] + target_lang = translation_request["target_lang"] + text_to_translate = translation_request["text"] + + if not text_to_translate: + prompt = ( + "Скажи фразу на английском." + if source_lang == "en" + else "Скажи фразу на русском." + ) + speak(prompt) + text_to_translate = listen( + timeout_seconds=7.0, detection_timeout=5.0, lang=source_lang + ) + + if not text_to_translate: + speak("Я не расслышал текст для перевода.") + skip_wakeword = False + continue + + translated_text = translate_text( + text_to_translate, source_lang, target_lang + ) + clean_text = clean_response(translated_text, language=target_lang) + + completed = speak( + clean_text, + check_interrupt=check_wakeword_once, + language=target_lang, + ) + stop_wakeword_monitoring() + skip_wakeword = True + + if not completed: + print("⏹️ Перевод прерван - слушаю следующий вопрос") + continue + # Step 3: Send to AI # Add user message to history chat_history.append({"role": "user", "content": user_text}) - + # Get response using history ai_response = ask_ai(list(chat_history)) - + # Add AI response to history chat_history.append({"role": "assistant", "content": ai_response}) # Step 4: Clean response - clean_text = clean_response(ai_response) + clean_text = clean_response(ai_response, language="ru") # Step 5: Speak response (with wake word interrupt support) - completed = speak(clean_text, check_interrupt=check_wakeword_once) + # This uses check_wakeword_once which opens/closes stream as needed + completed = speak( + clean_text, check_interrupt=check_wakeword_once, language="ru" + ) + + # Stop monitoring after TTS finishes (cleanup stream opened by check_wakeword_once) + stop_wakeword_monitoring() # Enable follow-up mode for next iteration skip_wakeword = True @@ -136,7 +265,12 @@ def main(): # but we can print a message if not completed: print("⏹️ Ответ прерван - слушаю следующий вопрос") - continue + # If interrupted, we treat it as immediate follow up? + # Usually interruption means "I have a new command" + # So skip_wakeword = True is correct. + # But we might want to listen IMMEDIATELY without waiting 5s for start? + # listen() handles that. + pass print() print("-" * 30) @@ -149,6 +283,7 @@ def main(): except Exception as e: print(f"❌ Ошибка: {e}") speak("Произошла ошибка. Попробуйте ещё раз.") + skip_wakeword = False if __name__ == "__main__": diff --git a/stt.py b/stt.py index b4a632a..90ce1dc 100644 --- a/stt.py +++ b/stt.py @@ -3,6 +3,7 @@ Speech-to-Text module using Deepgram API. Recognizes speech from microphone using streaming WebSocket. Supports Russian (default) and English. """ + import os import asyncio import threading @@ -20,6 +21,7 @@ from deepgram import ( # Configure logging to suppress debug noise logging.getLogger("deepgram").setLevel(logging.WARNING) + class SpeechRecognizer: """Speech recognizer using Deepgram streaming.""" @@ -29,18 +31,18 @@ class SpeechRecognizer: self.stream = None self.transcript = "" self.lock = threading.Lock() - + def initialize(self): """Initialize Deepgram client and PyAudio.""" if not DEEPGRAM_API_KEY: raise ValueError("DEEPGRAM_API_KEY is not set in environment or config.") - + print("📦 Инициализация Deepgram STT...") config = DeepgramClientOptions( verbose=logging.WARNING, ) self.dg_client = DeepgramClient(DEEPGRAM_API_KEY, config) - + self.pa = pyaudio.PyAudio() print("✅ Deepgram клиент готов") @@ -59,13 +61,14 @@ class SpeechRecognizer: async def _process_audio(self, dg_connection, timeout_seconds, detection_timeout): """Async loop to send audio and wait for results.""" self.transcript = "" - + transcript_parts = [] + loop = asyncio.get_running_loop() stream = self._get_stream() - + stop_event = asyncio.Event() speech_started_event = asyncio.Event() - + # We need access to the outer 'self' (SpeechRecognizer instance) speech_recognizer_self = self @@ -74,9 +77,11 @@ class SpeechRecognizer: if len(sentence) == 0: return if result.is_final: - print(f"📝 Частичный результат: {sentence}") with speech_recognizer_self.lock: - speech_recognizer_self.transcript = sentence + transcript_parts.append(sentence) + speech_recognizer_self.transcript = " ".join( + transcript_parts + ).strip() def on_speech_started(unused_self, speech_started, **kwargs): loop.call_soon_threadsafe(speech_started_event.set) @@ -102,7 +107,7 @@ class SpeechRecognizer: channels=1, sample_rate=SAMPLE_RATE, interim_results=True, - utterance_end_ms="1200", + utterance_end_ms=1200, vad_events=True, ) @@ -133,38 +138,45 @@ class SpeechRecognizer: print(f"\n🛑 Stream stopped. Chunks sent: {chunks_sent}") sender_task = asyncio.create_task(send_audio()) - + try: # 1. Wait for speech to start (detection_timeout) if detection_timeout: try: - await asyncio.wait_for(speech_started_event.wait(), timeout=detection_timeout) + await asyncio.wait_for( + speech_started_event.wait(), timeout=detection_timeout + ) except asyncio.TimeoutError: # print("Detection timeout - no speech") stop_event.set() - + # 2. If started (or no detection timeout), wait for completion if not stop_event.is_set(): await asyncio.wait_for(stop_event.wait(), timeout=timeout_seconds) - + except asyncio.TimeoutError: # print("Global timeout") pass - + stop_event.set() await sender_task # Finish is synchronous dg_connection.finish() - + return self.transcript - def listen(self, timeout_seconds: float = 7.0, detection_timeout: float = None, lang: str = "ru") -> str: + def listen( + self, + timeout_seconds: float = 7.0, + detection_timeout: float = None, + lang: str = "ru", + ) -> str: """ Listen to microphone and transcribe speech. """ if not self.dg_client: self.initialize() - + self.current_lang = lang print(f"🎙️ Слушаю ({lang})...") @@ -172,16 +184,18 @@ class SpeechRecognizer: dg_connection = self.dg_client.listen.live.v("1") try: - transcript = asyncio.run(self._process_audio(dg_connection, timeout_seconds, detection_timeout)) - + transcript = asyncio.run( + self._process_audio(dg_connection, timeout_seconds, detection_timeout) + ) + final_text = transcript.strip() if transcript else "" if final_text: print(f"📝 Распознано: {final_text}") else: print("⚠️ Речь не распознана") - + return final_text - + except Exception as e: print(f"❌ Ошибка STT: {e}") return "" @@ -208,7 +222,9 @@ def get_recognizer() -> SpeechRecognizer: return _recognizer -def listen(timeout_seconds: float = 7.0, detection_timeout: float = None, lang: str = "ru") -> str: +def listen( + timeout_seconds: float = 7.0, detection_timeout: float = None, lang: str = "ru" +) -> str: """Listen to microphone and return transcribed text.""" return get_recognizer().listen(timeout_seconds, detection_timeout, lang) @@ -218,4 +234,4 @@ def cleanup(): global _recognizer if _recognizer: _recognizer.cleanup() - _recognizer = None \ No newline at end of file + _recognizer = None diff --git a/tts.py b/tts.py index 3e37a2e..6a89276 100644 --- a/tts.py +++ b/tts.py @@ -11,7 +11,7 @@ import threading import time import warnings import re -from config import TTS_SPEAKER, TTS_SAMPLE_RATE +from config import TTS_SPEAKER, TTS_EN_SPEAKER, TTS_SAMPLE_RATE # Suppress Silero TTS warning about text length warnings.filterwarnings("ignore", message="Text string is longer than 1000 symbols") @@ -21,27 +21,55 @@ class TextToSpeech: """Text-to-Speech using Silero TTS with wake word interruption support.""" def __init__(self): - self.model = None + self.models = {} self.sample_rate = TTS_SAMPLE_RATE - self.speaker = TTS_SPEAKER + self.speakers = { + "ru": TTS_SPEAKER, + "en": TTS_EN_SPEAKER, + } self._interrupted = False self._stop_flag = threading.Event() - def initialize(self): - """Initialize Silero TTS model.""" - print("📦 Загрузка модели Silero TTS v5...") + def _load_model(self, language: str): + """Load and cache Silero TTS model for the given language.""" + if language in self.models: + return self.models[language] - # Load Silero TTS model - device = torch.device('cpu') - self.model, _ = torch.hub.load( + model_config = { + "ru": {"language": "ru", "model_id": "v5_ru"}, + "en": {"language": "en", "model_id": "v3_en"}, + } + + if language not in model_config: + raise ValueError(f"Unsupported TTS language: {language}") + + config = model_config[language] + print(f"📦 Загрузка модели Silero TTS ({language})...") + + device = torch.device("cpu") + model, _ = torch.hub.load( repo_or_dir="snakers4/silero-models", model="silero_tts", - language="ru", - speaker="v5_ru", + language=config["language"], + speaker=config["model_id"], ) - self.model.to(device) + model.to(device) - print(f"✅ Модель TTS v5 загружена (голос: {self.speaker})") + self.models[language] = model + return model + + def _get_speaker(self, language: str, model) -> str: + """Return a valid speaker for the loaded model.""" + speaker = self.speakers.get(language) + if hasattr(model, "speakers") and speaker not in model.speakers: + fallback = model.speakers[0] if model.speakers else speaker + print(f"⚠️ Голос '{speaker}' недоступен, использую '{fallback}'") + return fallback + return speaker + + def initialize(self): + """Initialize default (Russian) TTS model.""" + self._load_model("ru") def _split_text(self, text: str, max_length: int = 900) -> list[str]: """Split text into chunks smaller than max_length.""" @@ -83,13 +111,14 @@ class TextToSpeech: # Filter empty chunks return [c for c in chunks if c] - def speak(self, text: str, check_interrupt=None) -> bool: + def speak(self, text: str, check_interrupt=None, language: str = "ru") -> bool: """ Convert text to speech and play it. Args: text: Text to synthesize and speak check_interrupt: Optional callback function that returns True if playback should stop + language: Language code for voice selection ("ru" or "en") Returns: True if playback completed normally, False if interrupted @@ -97,8 +126,8 @@ class TextToSpeech: if not text.strip(): return True - if not self.model: - self.initialize() + model = self._load_model(language) + speaker = self._get_speaker(language, model) # Split text into manageable chunks chunks = self._split_text(text) @@ -120,8 +149,8 @@ class TextToSpeech: try: # Generate audio for chunk - audio = self.model.apply_tts( - text=chunk, speaker=self.speaker, sample_rate=self.sample_rate + audio = model.apply_tts( + text=chunk, speaker=speaker, sample_rate=self.sample_rate ) # Convert to numpy array @@ -218,18 +247,19 @@ def get_tts() -> TextToSpeech: return _tts -def speak(text: str, check_interrupt=None) -> bool: +def speak(text: str, check_interrupt=None, language: str = "ru") -> bool: """ Synthesize and speak the given text. Args: text: Text to speak check_interrupt: Optional callback for interrupt checking + language: Language code for voice selection ("ru" or "en") Returns: True if completed normally, False if interrupted """ - return get_tts().speak(text, check_interrupt) + return get_tts().speak(text, check_interrupt, language) def was_interrupted() -> bool: diff --git a/wakeword.py b/wakeword.py index 1c7f8be..2cf7b04 100644 --- a/wakeword.py +++ b/wakeword.py @@ -15,6 +15,7 @@ class WakeWordDetector: self.porcupine = None self.audio_stream = None self.pa = None + self._stream_closed = True # Track state explicitly def initialize(self): """Initialize Porcupine and audio stream.""" @@ -24,6 +25,19 @@ class WakeWordDetector: ) self.pa = pyaudio.PyAudio() + self._open_stream() + print("🎤 Ожидание wake word 'Alexandr'...") + + def _open_stream(self): + """Open the audio stream.""" + if self.audio_stream and not self._stream_closed: + return + + if self.audio_stream: + try: + self.audio_stream.close() + except: pass + self.audio_stream = self.pa.open( rate=self.porcupine.sample_rate, channels=1, @@ -31,44 +45,47 @@ class WakeWordDetector: input=True, frames_per_buffer=self.porcupine.frame_length ) - print("🎤 Ожидание wake word 'Alexandr'...") - - def wait_for_wakeword(self) -> bool: + self._stream_closed = False + + def stop_monitoring(self): + """Explicitly stop and close the stream.""" + if self.audio_stream and not self._stream_closed: + try: + self.audio_stream.stop_stream() + self.audio_stream.close() + except: pass + self._stream_closed = True + + def wait_for_wakeword(self, timeout: float = None) -> bool: """ - Blocks until wake word is detected. - Returns True when wake word is detected. + Blocks until wake word is detected or timeout expires. + + Args: + timeout: Maximum seconds to wait. None = infinite. + + Returns: + True if wake word detected, False if timeout. """ + import time if not self.porcupine: self.initialize() - # Ensure stream is open and active - if self.audio_stream is None or not self.audio_stream.is_active(): - # If closed or None, we might need to recreate it. - # PyAudio streams once closed cannot be reopened usually? - # We should probably recreate it. - if self.audio_stream: - try: - self.audio_stream.close() - except: pass - - self.audio_stream = self.pa.open( - rate=self.porcupine.sample_rate, - channels=1, - format=pyaudio.paInt16, - input=True, - frames_per_buffer=self.porcupine.frame_length - ) + # Ensure stream is open + self._open_stream() + + start_time = time.time() while True: + if timeout and (time.time() - start_time > timeout): + return False + pcm = self.audio_stream.read(self.porcupine.frame_length, exception_on_overflow=False) pcm = struct.unpack_from("h" * self.porcupine.frame_length, pcm) keyword_index = self.porcupine.process(pcm) if keyword_index >= 0: print("✅ Wake word обнаружен!") - # Stop and CLOSE stream to release mic for STT - self.audio_stream.stop_stream() - self.audio_stream.close() + self.stop_monitoring() return True def check_wakeword_once(self) -> bool: @@ -80,20 +97,8 @@ class WakeWordDetector: self.initialize() try: - # Ensure stream is open/active - if self.audio_stream is None or not self.audio_stream.is_active(): - # Re-open if needed (similar to wait_for_wakeword logic) - if self.audio_stream: - try: - self.audio_stream.close() - except: pass - self.audio_stream = self.pa.open( - rate=self.porcupine.sample_rate, - channels=1, - format=pyaudio.paInt16, - input=True, - frames_per_buffer=self.porcupine.frame_length - ) + # Ensure stream is open + self._open_stream() pcm = self.audio_stream.read(self.porcupine.frame_length, exception_on_overflow=False) pcm = struct.unpack_from("h" * self.porcupine.frame_length, pcm) @@ -108,8 +113,7 @@ class WakeWordDetector: def cleanup(self): """Release resources.""" - if self.audio_stream: - self.audio_stream.close() + self.stop_monitoring() if self.pa: self.pa.terminate() if self.porcupine: @@ -128,10 +132,14 @@ def get_detector() -> WakeWordDetector: return _detector -def wait_for_wakeword() -> bool: +def wait_for_wakeword(timeout: float = None) -> bool: """Wait for wake word detection.""" - return get_detector().wait_for_wakeword() + return get_detector().wait_for_wakeword(timeout) +def stop_monitoring(): + """Stop monitoring for wake word.""" + if _detector: + _detector.stop_monitoring() def cleanup(): """Cleanup detector resources."""