From c7df540c0bdbbac62950a517d7c68980b980b3f5 Mon Sep 17 00:00:00 2001 From: Cosmo Date: Thu, 23 Apr 2026 13:55:39 +0000 Subject: [PATCH] feat(voice): emit listening event between followup turns MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit После ответа Python сразу уходит в record() ждать follow-up (FOLLOWUP_TIMEOUT), но планшет об этом не знал — оверлей тихо скрывался и пользователю казалось что Cosmo его не слышит без повторного wake-word. Теперь между итерациями _conversation_loop шлётся notifier.listening() — планшет показывает мягко пульсирующий орб с 'жду' + сохранённым текстом прошлого ответа. Закрывается только по notifier.idle() (таймаут тишины) или если пользователь что-то сказал (command). --- satellite/modes.py | 6 +++++- satellite/notifier.py | 6 ++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/satellite/modes.py b/satellite/modes.py index 8c8a905..17c3cdb 100644 --- a/satellite/modes.py +++ b/satellite/modes.py @@ -51,9 +51,13 @@ def _handle_reset(text: str, agent_id: str) -> bool: def _conversation_loop(agent_id: str, agent_name: str = "Cosmo"): """Основной цикл диалога. - Первая запись — с большим таймаутом (MAX_DURATION), дальше — короткий FOLLOWUP_TIMEOUT.""" + Первая запись — с большим таймаутом (MAX_DURATION), дальше — короткий FOLLOWUP_TIMEOUT. + Между итерациями шлём listening-event чтобы планшет показывал что всё ещё ждём.""" first = True while True: + if not first: + # Follow-up — подсказываем планшету что слушаем, текст прошлого ответа сохраняется. + notifier.listening(agent_id) timeout = MAX_DURATION if first else FOLLOWUP_TIMEOUT first = False text = record(initial_silence_timeout=timeout) diff --git a/satellite/notifier.py b/satellite/notifier.py index 6895d54..e32e485 100644 --- a/satellite/notifier.py +++ b/satellite/notifier.py @@ -72,3 +72,9 @@ def idle(): def error(text: str, agent_id: str = "cosmo"): _send("error", text=text, agent=agent_id) + + +def listening(agent_id: str): + """Голосовой ассистент слушает follow-up (после ответа) — планшет показывает + мягкую пульсацию, сохраняя текст предыдущего ответа.""" + _send("listening", agent=agent_id)