diff --git a/README.md b/README.md index 891ed05..bd10fdc 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ ## Возможности - Активация по wake word `Alexandr` (Porcupine). -- Непрерывный follow-up режим после активации (без повторного wake word до команды `Стоп`/`Хватит`). +- Follow-up окно 4 секунды после ответа: если пользователь молчит, ассистент возвращается к ожиданию wake word. - Распознавание речи через Deepgram (WebSocket, VAD, fast stop). - Озвучка через Silero TTS (RU + EN, с прерыванием по wake word). - AI-диалог через Perplexity API со streaming-ответом и контекстом. diff --git a/app/main.py b/app/main.py index c4322ae..271d808 100644 --- a/app/main.py +++ b/app/main.py @@ -272,8 +272,9 @@ def main(): # (True = режим диалога, слушаем сразу. False = ждем "Alexandr") skip_wakeword = False - # После первой активации по wake word остаемся в диалоге до явной стоп-команды. - continuous_followup_mode = True + # После ответа ассистент ждет продолжение фразы 4 секунды. + # Если речи нет, выходим из диалога и снова ждем wake word. + followup_idle_timeout_seconds = 4.0 # Контекст уточнения "на какое время поставить ...". # Может быть: "timer", "alarm". @@ -338,14 +339,16 @@ def main(): continue # Продолжаем цикл else: # Режим диалога (Follow-up): ждем продолжения речи без "Alexandr" - if continuous_followup_mode: - print("👂 Непрерывный диалог: слушаю следующий вопрос...") - else: - print("👂 Слушаю продолжение диалога (5 сек)...") - # Ждем начала речи 5 сек. Если начали говорить, слушаем до 7 сек. + print( + "👂 Слушаю продолжение диалога " + f"({followup_idle_timeout_seconds:.0f} сек)..." + ) + # Ждем начала речи 4 сек. Если начали говорить, слушаем до 7 сек. try: user_text = listen( - timeout_seconds=7.0, detection_timeout=5.0, fast_stop=True + timeout_seconds=7.0, + detection_timeout=followup_idle_timeout_seconds, + fast_stop=True, ) except Exception as e: print(f"Ошибка при прослушивании: {e}") @@ -358,15 +361,15 @@ def main(): skip_wakeword = False continue - if not user_text and not continuous_followup_mode: + if not user_text: # Пользователь промолчал — выходим из режима диалога, засыпаем. skip_wakeword = False continue # --- Шаг 2: Анализ распознанного текста --- if not user_text: - # В непрерывном режиме не требуем повторный wake word после тишины. - skip_wakeword = continuous_followup_mode + # Пустой ввод: без лишних ответов возвращаемся к ожиданию wake word. + skip_wakeword = False continue # Проверка на команду "Стоп" @@ -558,12 +561,12 @@ def main(): except Exception as init_error: print(f"Ошибка переинициализации STT: {init_error}") speak("Произошла ошибка при распознавании речи.") - skip_wakeword = continuous_followup_mode + skip_wakeword = False continue if not text_to_translate: speak("Я не расслышал текст для перевода.") - skip_wakeword = continuous_followup_mode + skip_wakeword = False continue # Выполняем перевод через AI