Keep dialogue active after wake word

This commit is contained in:
2026-02-16 19:04:05 +03:00
parent d36d4be95f
commit 756cc340dc
2 changed files with 13 additions and 6 deletions

View File

@@ -21,6 +21,7 @@
## Возможности ## Возможности
- Активация по wake word `Alexandr` (Porcupine). - Активация по wake word `Alexandr` (Porcupine).
- Непрерывный follow-up режим после активации (без повторного wake word до команды `Стоп`/`Хватит`).
- Распознавание речи через Deepgram (WebSocket, VAD, fast stop). - Распознавание речи через Deepgram (WebSocket, VAD, fast stop).
- Озвучка через Silero TTS (RU + EN, с прерыванием по wake word). - Озвучка через Silero TTS (RU + EN, с прерыванием по wake word).
- AI-диалог через Perplexity API со streaming-ответом и контекстом. - AI-диалог через Perplexity API со streaming-ответом и контекстом.

View File

@@ -272,6 +272,9 @@ def main():
# (True = режим диалога, слушаем сразу. False = ждем "Alexandr") # (True = режим диалога, слушаем сразу. False = ждем "Alexandr")
skip_wakeword = False skip_wakeword = False
# После первой активации по wake word остаемся в диалоге до явной стоп-команды.
continuous_followup_mode = True
# Контекст уточнения "на какое время поставить ...". # Контекст уточнения "на какое время поставить ...".
# Может быть: "timer", "alarm". # Может быть: "timer", "alarm".
pending_time_target = None pending_time_target = None
@@ -335,7 +338,10 @@ def main():
continue # Продолжаем цикл continue # Продолжаем цикл
else: else:
# Режим диалога (Follow-up): ждем продолжения речи без "Alexandr" # Режим диалога (Follow-up): ждем продолжения речи без "Alexandr"
print("👂 Слушаю продолжение диалога (5 сек)...") if continuous_followup_mode:
print("👂 Непрерывный диалог: слушаю следующий вопрос...")
else:
print("👂 Слушаю продолжение диалога (5 сек)...")
# Ждем начала речи 5 сек. Если начали говорить, слушаем до 7 сек. # Ждем начала речи 5 сек. Если начали говорить, слушаем до 7 сек.
try: try:
user_text = listen( user_text = listen(
@@ -352,15 +358,15 @@ def main():
skip_wakeword = False skip_wakeword = False
continue continue
if not user_text: if not user_text and not continuous_followup_mode:
# Пользователь промолчал — выходим из режима диалога, засыпаем. # Пользователь промолчал — выходим из режима диалога, засыпаем.
skip_wakeword = False skip_wakeword = False
continue continue
# --- Шаг 2: Анализ распознанного текста --- # --- Шаг 2: Анализ распознанного текста ---
if not user_text: if not user_text:
# Пустой ввод: без лишних ответов возвращаемся к ожиданию wake word. # В непрерывном режиме не требуем повторный wake word после тишины.
skip_wakeword = False skip_wakeword = continuous_followup_mode
continue continue
# Проверка на команду "Стоп" # Проверка на команду "Стоп"
@@ -552,12 +558,12 @@ def main():
except Exception as init_error: except Exception as init_error:
print(f"Ошибка переинициализации STT: {init_error}") print(f"Ошибка переинициализации STT: {init_error}")
speak("Произошла ошибка при распознавании речи.") speak("Произошла ошибка при распознавании речи.")
skip_wakeword = False skip_wakeword = continuous_followup_mode
continue continue
if not text_to_translate: if not text_to_translate:
speak("Я не расслышал текст для перевода.") speak("Я не расслышал текст для перевода.")
skip_wakeword = False skip_wakeword = continuous_followup_mode
continue continue
# Выполняем перевод через AI # Выполняем перевод через AI