@@ -69,6 +69,7 @@ def __init__(
6969 self .server = server # 保存server实例的引用
7070
7171 self .need_bind = False # 是否需要绑定设备
72+ self .bind_completed_event = asyncio .Event ()
7273 self .bind_code = None # 绑定设备的验证码
7374 self .last_bind_prompt_time = 0 # 上次播放绑定提示的时间戳(秒)
7475 self .bind_prompt_interval = 60 # 绑定提示播放间隔(秒)
@@ -266,30 +267,43 @@ def save_memory_task():
266267 f"保存记忆后关闭连接失败: { close_error } "
267268 )
268269
270+ async def _discard_message_with_bind_prompt (self ):
271+ """丢弃消息并检查是否需要播放绑定提示"""
272+ current_time = time .time ()
273+ # 检查是否需要播放绑定提示
274+ if current_time - self .last_bind_prompt_time >= self .bind_prompt_interval :
275+ self .last_bind_prompt_time = current_time
276+ # 复用现有的绑定提示逻辑
277+ from core .handle .receiveAudioHandle import check_bind_device
278+
279+ asyncio .create_task (check_bind_device (self ))
280+
269281 async def _route_message (self , message ):
270282 """消息路由"""
283+ # 检查是否已经获取到真实的绑定状态
284+ if not self .bind_completed_event .is_set ():
285+ # 还没有获取到真实状态,等待直到获取到真实状态或超时
286+ try :
287+ await asyncio .wait_for (self .bind_completed_event .wait (), timeout = 1 )
288+ except asyncio .TimeoutError :
289+ # 超时仍未获取到真实状态,丢弃消息
290+ await self ._discard_message_with_bind_prompt ()
291+ return
292+
293+ # 已经获取到真实状态,检查是否需要绑定
294+ if self .need_bind :
295+ # 需要绑定,丢弃消息
296+ await self ._discard_message_with_bind_prompt ()
297+ return
298+
299+ # 不需要绑定,继续处理消息
300+
271301 if isinstance (message , str ):
272302 await handleTextMessage (self , message )
273303 elif isinstance (message , bytes ):
274304 if self .vad is None or self .asr is None :
275305 return
276306
277- # 未绑定设备直接丢弃所有音频,不进行ASR处理
278- if self .need_bind :
279- current_time = time .time ()
280- # 检查是否需要播放绑定提示
281- if (
282- current_time - self .last_bind_prompt_time
283- >= self .bind_prompt_interval
284- ):
285- self .last_bind_prompt_time = current_time
286- # 复用现有的绑定提示逻辑
287- from core .handle .receiveAudioHandle import check_bind_device
288-
289- asyncio .create_task (check_bind_device (self ))
290- # 直接丢弃音频,不进行ASR处理
291- return
292-
293307 # 处理来自MQTT网关的音频包
294308 if self .conn_from_mqtt_gateway and len (message ) >= 16 :
295309 handled = await self ._process_mqtt_audio_message (message )
@@ -413,6 +427,14 @@ def restart_server():
413427
414428 def _initialize_components (self ):
415429 try :
430+ if self .tts is None :
431+ self .tts = self ._initialize_tts ()
432+ # 打开语音合成通道
433+ asyncio .run_coroutine_threadsafe (
434+ self .tts .open_audio_channels (self ), self .loop
435+ )
436+ if self .need_bind :
437+ return
416438 self .selected_module_str = build_module_string (
417439 self .config .get ("selected_module" , {})
418440 )
@@ -436,17 +458,10 @@ def _initialize_components(self):
436458
437459 # 初始化声纹识别
438460 self ._initialize_voiceprint ()
439-
440461 # 打开语音识别通道
441462 asyncio .run_coroutine_threadsafe (
442463 self .asr .open_audio_channels (self ), self .loop
443464 )
444- if self .tts is None :
445- self .tts = self ._initialize_tts ()
446- # 打开语音合成通道
447- asyncio .run_coroutine_threadsafe (
448- self .tts .open_audio_channels (self ), self .loop
449- )
450465
451466 """加载记忆"""
452467 self ._initialize_memory ()
@@ -461,6 +476,7 @@ def _initialize_components(self):
461476 self .logger .bind (tag = TAG ).error (f"实例化组件失败: { e } " )
462477
463478 def _init_prompt_enhancement (self ):
479+
464480 # 更新上下文信息
465481 self .prompt_manager .update_context_info (self , self .client_ip )
466482 enhanced_prompt = self .prompt_manager .build_enhanced_prompt (
@@ -496,7 +512,11 @@ def _initialize_tts(self):
496512
497513 def _initialize_asr (self ):
498514 """初始化ASR"""
499- if self ._asr is not None and hasattr (self ._asr , "interface_type" ) and self ._asr .interface_type == InterfaceType .LOCAL :
515+ if (
516+ self ._asr is not None
517+ and hasattr (self ._asr , "interface_type" )
518+ and self ._asr .interface_type == InterfaceType .LOCAL
519+ ):
500520 # 如果公共ASR是本地服务,则直接返回
501521 # 因为本地一个实例ASR,可以被多个连接共享
502522 asr = self ._asr
@@ -536,6 +556,8 @@ async def _background_initialize(self):
536556 async def _initialize_private_config_async (self ):
537557 """从接口异步获取差异化配置(异步版本,不阻塞主循环)"""
538558 if not self .read_config_from_api :
559+ self .need_bind = False
560+ self .bind_completed_event .set ()
539561 return
540562 try :
541563 begin_time = time .time ()
@@ -548,15 +570,20 @@ async def _initialize_private_config_async(self):
548570 self .logger .bind (tag = TAG ).info (
549571 f"{ time .time () - begin_time } 秒,异步获取差异化配置成功: { json .dumps (filter_sensitive_info (private_config ), ensure_ascii = False )} "
550572 )
573+ self .need_bind = False
574+ self .bind_completed_event .set ()
551575 except DeviceNotFoundException as e :
552576 self .need_bind = True
577+ self .bind_completed_event .set () # 状态已确定,设置事件
553578 private_config = {}
554579 except DeviceBindException as e :
555580 self .need_bind = True
556581 self .bind_code = e .bind_code
582+ self .bind_completed_event .set () # 状态已确定,设置事件
557583 private_config = {}
558584 except Exception as e :
559585 self .need_bind = True
586+ self .bind_completed_event .set () # 状态已确定,设置事件
560587 self .logger .bind (tag = TAG ).error (f"异步获取差异化配置失败: { e } " )
561588 private_config = {}
562589
0 commit comments