Merge pull request #2818 from xinnan-tech/fix_wakeup_audioRate

修复设备播放音频时打断后使用唤醒词时流控器未重置造成的死锁
This commit is contained in:
milieyo
2026-01-08 17:27:53 +08:00
committed by GitHub
2 changed files with 25 additions and 6 deletions
@@ -1,5 +1,6 @@
import time import time
import json import json
import uuid
import random import random
import asyncio import asyncio
from core.utils.dialogue import Message from core.utils.dialogue import Message
@@ -105,6 +106,9 @@ async def checkWakeupWords(conn, text):
# 播放唤醒词回复 # 播放唤醒词回复
conn.client_abort = False conn.client_abort = False
# 将唤醒词回复视为新会话,生成新的 sentence_id,确保流控器重置
conn.sentence_id = str(uuid.uuid4().hex)
conn.logger.bind(tag=TAG).info(f"播放唤醒词回复: {response.get('text')}") conn.logger.bind(tag=TAG).info(f"播放唤醒词回复: {response.get('text')}")
await sendAudioMessage(conn, SentenceType.FIRST, opus_packets, response.get("text")) await sendAudioMessage(conn, SentenceType.FIRST, opus_packets, response.get("text"))
await sendAudioMessage(conn, SentenceType.LAST, [], None) await sendAudioMessage(conn, SentenceType.LAST, [], None)
@@ -133,12 +133,27 @@ def _get_or_create_rate_controller(conn, frame_duration, is_single_packet):
Returns: Returns:
(rate_controller, flow_control) (rate_controller, flow_control)
""" """
# 判断是否需要重置:单包模式且 sentence_id 变化,或者控制器不存在 # 检查是否需要重置控制器
need_reset = ( need_reset = False
is_single_packet
and getattr(conn, "audio_flow_control", {}).get("sentence_id") if not hasattr(conn, "audio_rate_controller"):
!= conn.sentence_id # 控制器不存在,需要创建
) or not hasattr(conn, "audio_rate_controller") need_reset = True
else:
rate_controller = conn.audio_rate_controller
# 后台发送任务已停止, 则需要重置
if (
not rate_controller.pending_send_task
or rate_controller.pending_send_task.done()
):
need_reset = True
# 当sentence_id 变化,需要重置
elif (
getattr(conn, "audio_flow_control", {}).get("sentence_id")
!= conn.sentence_id
):
need_reset = True
if need_reset: if need_reset:
# 创建或获取 rate_controller # 创建或获取 rate_controller