Sleep after 4s of follow-up silence
This commit is contained in:
@@ -21,7 +21,7 @@
|
|||||||
## Возможности
|
## Возможности
|
||||||
|
|
||||||
- Активация по wake word `Alexandr` (Porcupine).
|
- Активация по wake word `Alexandr` (Porcupine).
|
||||||
- Непрерывный follow-up режим после активации (без повторного wake word до команды `Стоп`/`Хватит`).
|
- Follow-up окно 4 секунды после ответа: если пользователь молчит, ассистент возвращается к ожиданию 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-ответом и контекстом.
|
||||||
|
|||||||
29
app/main.py
29
app/main.py
@@ -272,8 +272,9 @@ def main():
|
|||||||
# (True = режим диалога, слушаем сразу. False = ждем "Alexandr")
|
# (True = режим диалога, слушаем сразу. False = ждем "Alexandr")
|
||||||
skip_wakeword = False
|
skip_wakeword = False
|
||||||
|
|
||||||
# После первой активации по wake word остаемся в диалоге до явной стоп-команды.
|
# После ответа ассистент ждет продолжение фразы 4 секунды.
|
||||||
continuous_followup_mode = True
|
# Если речи нет, выходим из диалога и снова ждем wake word.
|
||||||
|
followup_idle_timeout_seconds = 4.0
|
||||||
|
|
||||||
# Контекст уточнения "на какое время поставить ...".
|
# Контекст уточнения "на какое время поставить ...".
|
||||||
# Может быть: "timer", "alarm".
|
# Может быть: "timer", "alarm".
|
||||||
@@ -338,14 +339,16 @@ def main():
|
|||||||
continue # Продолжаем цикл
|
continue # Продолжаем цикл
|
||||||
else:
|
else:
|
||||||
# Режим диалога (Follow-up): ждем продолжения речи без "Alexandr"
|
# Режим диалога (Follow-up): ждем продолжения речи без "Alexandr"
|
||||||
if continuous_followup_mode:
|
print(
|
||||||
print("👂 Непрерывный диалог: слушаю следующий вопрос...")
|
"👂 Слушаю продолжение диалога "
|
||||||
else:
|
f"({followup_idle_timeout_seconds:.0f} сек)..."
|
||||||
print("👂 Слушаю продолжение диалога (5 сек)...")
|
)
|
||||||
# Ждем начала речи 5 сек. Если начали говорить, слушаем до 7 сек.
|
# Ждем начала речи 4 сек. Если начали говорить, слушаем до 7 сек.
|
||||||
try:
|
try:
|
||||||
user_text = listen(
|
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:
|
except Exception as e:
|
||||||
print(f"Ошибка при прослушивании: {e}")
|
print(f"Ошибка при прослушивании: {e}")
|
||||||
@@ -358,15 +361,15 @@ def main():
|
|||||||
skip_wakeword = False
|
skip_wakeword = False
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if not user_text and not continuous_followup_mode:
|
if not user_text:
|
||||||
# Пользователь промолчал — выходим из режима диалога, засыпаем.
|
# Пользователь промолчал — выходим из режима диалога, засыпаем.
|
||||||
skip_wakeword = False
|
skip_wakeword = False
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# --- Шаг 2: Анализ распознанного текста ---
|
# --- Шаг 2: Анализ распознанного текста ---
|
||||||
if not user_text:
|
if not user_text:
|
||||||
# В непрерывном режиме не требуем повторный wake word после тишины.
|
# Пустой ввод: без лишних ответов возвращаемся к ожиданию wake word.
|
||||||
skip_wakeword = continuous_followup_mode
|
skip_wakeword = False
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Проверка на команду "Стоп"
|
# Проверка на команду "Стоп"
|
||||||
@@ -558,12 +561,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 = continuous_followup_mode
|
skip_wakeword = False
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if not text_to_translate:
|
if not text_to_translate:
|
||||||
speak("Я не расслышал текст для перевода.")
|
speak("Я не расслышал текст для перевода.")
|
||||||
skip_wakeword = continuous_followup_mode
|
skip_wakeword = False
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Выполняем перевод через AI
|
# Выполняем перевод через AI
|
||||||
|
|||||||
Reference in New Issue
Block a user