wangzhibo
2026-09-11 659c470eba542383987aad227b7f918100f131fa
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:
    """