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()