diff --git a/main/xiaozhi-server/core/providers/asr/aliyun_stream.py b/main/xiaozhi-server/core/providers/asr/aliyun_stream.py index a5f327c0..2f16a975 100644 --- a/main/xiaozhi-server/core/providers/asr/aliyun_stream.py +++ b/main/xiaozhi-server/core/providers/asr/aliyun_stream.py @@ -120,6 +120,14 @@ class ASRProvider(ASRProviderBase): await super().open_audio_channels(conn) async def receive_audio(self, conn, audio, audio_have_voice): + # 初始化音频缓存 + if not hasattr(conn, 'asr_audio_for_voiceprint'): + conn.asr_audio_for_voiceprint = [] + + # 存储音频数据 + if audio: + conn.asr_audio_for_voiceprint.append(audio) + conn.asr_audio.append(audio) conn.asr_audio = conn.asr_audio[-10:] @@ -129,7 +137,7 @@ class ASRProvider(ASRProviderBase): await self._start_recognition(conn) except Exception as e: logger.bind(tag=TAG).error(f"开始识别失败: {str(e)}") - await self._cleanup() + await self._cleanup(conn) return if self.asr_ws and self.is_processing and self.server_ready: @@ -138,7 +146,7 @@ class ASRProvider(ASRProviderBase): await self.asr_ws.send(pcm_frame) except Exception as e: logger.bind(tag=TAG).warning(f"发送音频失败: {str(e)}") - await self._cleanup() + await self._cleanup(conn) async def _start_recognition(self, conn): """开始识别会话""" @@ -235,7 +243,11 @@ class ASRProvider(ASRProviderBase): if text: self.text = text conn.reset_vad_states() - await self.handle_voice_stop(conn, None) + # 传递缓存的音频数据 + audio_data = getattr(conn, 'asr_audio_for_voiceprint', []) + await self.handle_voice_stop(conn, audio_data) + # 清空缓存 + conn.asr_audio_for_voiceprint = [] break elif message_name == "TranscriptionCompleted": # 识别完成 @@ -253,12 +265,16 @@ class ASRProvider(ASRProviderBase): except Exception as e: logger.bind(tag=TAG).error(f"结果转发失败: {str(e)}") finally: - await self._cleanup() + await self._cleanup(conn) - async def _cleanup(self): + async def _cleanup(self, conn): """清理资源""" logger.bind(tag=TAG).info(f"开始ASR会话清理 | 当前状态: processing={self.is_processing}, server_ready={self.server_ready}") + # 清理连接的音频缓存 + if conn and hasattr(conn, 'asr_audio_for_voiceprint'): + conn.asr_audio_for_voiceprint = [] + # 判断是否需要发送终止请求 should_stop = self.is_processing or self.server_ready