Загрузка данных


import json
import os
import shutil
import webbrowser
import datetime
import subprocess
import speech_recognition as sr
from gtts import gTTS
import pygame
from groq import Groq
import pyautogui
import psutil
import time

# Инициализация клиента Groq (вставьте ваш ключ вместо "ВАШ_КЛЮЧ_GROQ")
client = Groq(api_key="ВАШ_КЛЮЧ_GROQ")

# Файлы для постоянного хранения памяти и настроек
MEMORY_FILE = "nova_memory.json"
SETTINGS_FILE = "nova_settings.json"

def load_settings():
    """Загружает настройки (имя пользователя и язык)"""
    if os.path.exists(SETTINGS_FILE):
        try:
            with open(SETTINGS_FILE, "r", encoding="utf-8") as f:
                return json.load(f)
        except Exception:
            return {"user_name": "друг", "lang": "ru"}
    return {"user_name": "друг", "lang": "ru"}

def save_settings(settings):
    """Сохраняет настройки"""
    try:
        with open(SETTINGS_FILE, "w", encoding="utf-8") as f:
            json.dump(settings, f, ensure_ascii=False, indent=2)
    except Exception as e:
        print(f"Ошибка сохранения настроек: {e}")

def load_memory():
    """Загружает историю диалога из файла при запуске"""
    if os.path.exists(MEMORY_FILE):
        try:
            with open(MEMORY_FILE, "r", encoding="utf-8") as f:
                return json.load(f)
        except Exception:
            return []
    return []

def save_memory():
    """Сохраняет текущую историю диалога в файл"""
    try:
        with open(MEMORY_FILE, "w", encoding="utf-8") as f:
            json.dump(chat_history, f, ensure_ascii=False, indent=2)
    except Exception as e:
        print(f"Ошибка сохранения памяти: {e}")

# Инициализация состояния
chat_history = load_memory()
app_settings = load_settings()
user_name = app_settings.get("user_name", "друг")
current_lang = app_settings.get("lang", "ru")

def speak(text, lang=None):
    use_lang = lang if lang else current_lang
    print(f"Нова [{use_lang}]: {text}")
    try:
        tts = gTTS(text=text, lang=use_lang)
        audio_file = "temp_voice.mp3"
        tts.save(audio_file)
        
        pygame.mixer.init()
        pygame.mixer.music.load(audio_file)
        pygame.mixer.music.play()
        while pygame.mixer.music.get_busy():
            pygame.time.Clock().tick(10)
        pygame.mixer.quit()
        
        if os.path.exists(audio_file):
            os.remove(audio_file)
    except Exception as e:
        print(f"Ошибка озвучки: {e}")

def listen():
    r = sr.Recognizer()
    with sr.Microphone() as source:
        print("\nСлушаю...")
        r.adjust_for_ambient_noise(source, duration=0.5)
        try:
            audio = r.listen(source, timeout=5, phrase_time_limit=10)
        except sr.WaitTimeoutError:
            return ""
            
    try:
        rec_lang = "ru-RU" if current_lang == "ru" else "en-US"
        command = r.recognize_google(audio, language=rec_lang)
        print(f"Вы сказали: {command}")
        return command
    except sr.UnknownValueError:
        return ""
    except sr.RequestError:
        print("Ошибка соединения с сервисом распознавания речи.")
        return ""

def parse_intent_with_ai(user_speech):
    global chat_history, user_name, current_lang
    chat_history.append(f"{user_name}: {user_speech}")
    
    context_slice = chat_history[-10:]
    context_str = "\n".join(context_slice)

    prompt = f"""
    Ты — Нова, элитный голосовой ассистент на ПК. Пользователя зовут "{user_name}". Текущий язык: "{current_lang}".
    Проанализируй фразу и верни СТРОГО JSON без markdown-оформления (без ```json):
    {{
      "action": одно из значений: 
        "open_chat", "change_language", "set_name", "open_youtube", "google_search", "open_app", 
        "open_folder", "empty_recycle_bin", "shutdown_pc", "cancel_shutdown", "sleep_pc", 
        "time_info", "battery_info", "take_screenshot", "create_note", "copy_files", "exit", "chat",
      "messenger": "название мессенджера (telegram, discord, whatsapp)",
      "chat_target": "имя контакта или чата, который нужно найти",
      "new_lang": "код языка (ru, en, de и т.д., иначе пусто)",
      "new_name": "имя пользователя, если просит изменить (иначе пусто)",
      "query": "поисковый запрос для ютуба или гугла",
      "app_name": "название программы",
      "folder_name": "название папки",
      "minutes": число,
      "note_text": "текст заметки",
      "source_path": "путь откуда",
      "dest_path": "путь куда",
      "text": "развернутый ответ пользователю"
    }}

    История разговора:
    {context_str}
    
    Текущая фраза: "{user_speech}"
    """
    try:
        completion =