diff --git a/app/api.py b/app/api.py index 98ad6c2..860b2ed 100644 --- a/app/api.py +++ b/app/api.py @@ -383,8 +383,8 @@ def get_voice_status(): # 2. Вызываем метод у экземпляра voice_inst, а не у модуля return jsonify({ "transcription": voice_inst.get_context_by_limit(3000, order='reversed'), - "response1": voice_inst.responses["regular"], - "response2": voice_inst.responses["commands"][:VOICE_COMMANDS_RESPONSE_TO_STORE], + "response1": list(voice_inst.responses["regular"]), + "response2": list(voice_inst.responses["commands"]), "is_running": voice_inst.is_running, "obsidian_settings_fetched": obsidian_settings_fetched }) diff --git a/app/title_generator.py b/app/title_generator.py index 75a14fe..f9f652a 100644 --- a/app/title_generator.py +++ b/app/title_generator.py @@ -9,7 +9,7 @@ import time from typing import Any, Dict, Optional from llm_client import get_llm from langchain_core.messages import SystemMessage, HumanMessage -import os +import uuid DEFAULT_SUMMARIZATION_LLM_NAME = "gemini-2.0-flash-lite" # "mistral-small-latest" # "mistral-small-latest" #"gemini-2.0-flash-r" DEFAULT_VOICE_LLM_NAME = "gemini-2.0-flash-lite" # "gemini-3.0-flash-openrouter" @@ -385,7 +385,13 @@ class TitleGenerator: response = self.voice_llm.invoke(llm_messages) import app.api as api - api.voice_inst.responses["regular"] = response # Записываем в Response 1 + new_entry = { + "id": str(uuid.uuid4()), + "content": response + } + # Используем appendleft для автоматического управления размером deque + api.voice_inst.responses["regular"].appendleft(new_entry) + print(f"✅🎤 Регулярный анализ голосового ввода завершен.") except Exception as e: print(f"❌🎤 Ошибка регулярного анализа: {e}") @@ -401,14 +407,14 @@ class TitleGenerator: response = self.voice_llm.invoke(llm_messages) import app.api as api - # Форматируем для вкладки Response 2 - formatted_res = f"Команда: {text}
Ответ: {response}" - api.voice_inst.responses["commands"].insert(0, formatted_res) - - # Ограничиваем историю команд, чтобы не раздувать память - if len(api.voice_inst.responses["commands"]) > VOICE_COMMANDS_RESPONSE_TO_STORE: - api.voice_inst.responses["commands"].pop(0) - + # Форматируем как Markdown для рендеринга на фронте + markdown_content = f"**Команда:** {text}\n\n**Ответ:** {response}" + new_entry = { + "id": str(uuid.uuid4()), + "content": markdown_content + } + api.voice_inst.responses["commands"].appendleft(new_entry) + print(f"✅🎤 Голосовая команда обработана.") except Exception as e: - print(f"❌🎤 Ошибка обработки команды: {e}") \ No newline at end of file + print(f"❌🎤 Ошибка обработки команды: {e}") \ No newline at end of file diff --git a/app/voice_service.py b/app/voice_service.py index 2cc835a..60c6004 100644 --- a/app/voice_service.py +++ b/app/voice_service.py @@ -6,9 +6,10 @@ import time import numpy as np from vosk import Model, KaldiRecognizer import sounddevice as sd +import uuid from collections import deque -VOICE_COMMANDS_RESPONSE_TO_STORE = 15 +VOICE_COMMANDS_RESPONSE_TO_STORE = 3 class VoiceService: def __init__(self, model_path, samplerate=48000): @@ -20,7 +21,10 @@ class VoiceService: self.history = [] self.history_lock = threading.Lock() self.last_processed_timestamp = 0.0 - self.responses = {"regular": "", "commands": []} + self.responses = { + "regular": deque(maxlen=VOICE_COMMANDS_RESPONSE_TO_STORE), + "commands": deque(maxlen=VOICE_COMMANDS_RESPONSE_TO_STORE) + } self.lock = threading.Lock() self._stop_event = threading.Event()