From 659c470eba542383987aad227b7f918100f131fa Mon Sep 17 00:00:00 2001
From: wangzhibo <wangzhibo@shsening.com>
Date: 星期五, 11 九月 2026 15:09:05 +0800
Subject: [PATCH] 小智终端 5种 场景模式 OK

---
 xiaozhi-esp32-server/main/xiaozhi-server/core/utils/audioRateController.py |   24 ++++++++++++++++++++++++
 1 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/xiaozhi-esp32-server/main/xiaozhi-server/core/utils/audioRateController.py b/xiaozhi-esp32-server/main/xiaozhi-server/core/utils/audioRateController.py
index ef59870..769f983 100644
--- a/xiaozhi-esp32-server/main/xiaozhi-server/core/utils/audioRateController.py
+++ b/xiaozhi-esp32-server/main/xiaozhi-server/core/utils/audioRateController.py
@@ -6,6 +6,30 @@
 TAG = __name__
 logger = setup_logging()
 
+AUDIO_FRAME_DURATION = 60
+AUDIO_COMPLETION_TIMEOUT_MIN = 8.0
+AUDIO_COMPLETION_TIMEOUT_MAX = 180.0
+
+
+def audio_completion_timeout_sec(queue_len: int, frame_ms: int = AUDIO_FRAME_DURATION) -> float:
+    """Wait long enough for remaining opus frames, plus a small drain margin."""
+    try:
+        remaining = int(queue_len or 0)
+    except (TypeError, ValueError):
+        remaining = 0
+    if remaining < 0:
+        remaining = 0
+    try:
+        frame = int(frame_ms or AUDIO_FRAME_DURATION)
+    except (TypeError, ValueError):
+        frame = AUDIO_FRAME_DURATION
+    if frame <= 0:
+        frame = AUDIO_FRAME_DURATION
+    return min(
+        AUDIO_COMPLETION_TIMEOUT_MAX,
+        max(AUDIO_COMPLETION_TIMEOUT_MIN, remaining * frame / 1000.0 + AUDIO_COMPLETION_TIMEOUT_MIN),
+    )
+
 
 class AudioRateController:
     """

--
Gitblit v1.9.1