Загрузка данных
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 =