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/providers/asr/base.py |   39 ++++++++++++++++++++++++++++++++++-----
 1 files changed, 34 insertions(+), 5 deletions(-)

diff --git a/xiaozhi-esp32-server/main/xiaozhi-server/core/providers/asr/base.py b/xiaozhi-esp32-server/main/xiaozhi-server/core/providers/asr/base.py
index dcfaf3a..32c79b4 100644
--- a/xiaozhi-esp32-server/main/xiaozhi-server/core/providers/asr/base.py
+++ b/xiaozhi-esp32-server/main/xiaozhi-server/core/providers/asr/base.py
@@ -66,7 +66,16 @@
             # 鑷姩/瀹炴椂妯″紡锛氫娇鐢╒AD妫�娴�
             conn.asr_audio.append(pcm_frame)
 
-            # 濡傛灉娌℃湁璇煶锛屼笖涔嬪墠涔熸病鏈夊0闊筹紝缂撳瓨閮ㄥ垎闊抽
+            shadowing_listen = (
+                getattr(conn, "interaction_mode", "") == "SHADOWING"
+                and getattr(conn, "shadowing_awaiting_user", False)
+            )
+            if shadowing_listen:
+                from core.app_runtime.runtime import append_shadowing_listen_pcm
+
+                append_shadowing_listen_pcm(conn, pcm_frame)
+
+            # 璺熻鏁村彞褰曢煶璧� shadowing_listen_pcm銆俛sr_audio 浠嶆寜 VAD 瑁佸壀锛岄伩鍏嶈法鍙ョ矘杩炪��
             if not audio_have_voice and not conn.client_have_voice:
                 conn.asr_audio = conn.asr_audio[-10:]
                 return
@@ -77,7 +86,11 @@
                 pcm_bytes = b"".join(conn.asr_audio)
                 # 妫�鏌ユ槸鍚︽湁瓒冲鐨勯煶棰戞暟鎹紙姣忓抚1920瀛楄妭锛�15甯х害28800瀛楄妭锛�
                 if len(pcm_bytes) > 1920 * 15:
-                    await self.handle_voice_stop(conn, [pcm_bytes])
+                    mode = getattr(conn, "interaction_mode", "CHAT")
+                    if mode == "SHADOWING":
+                        asyncio.create_task(self.handle_voice_stop(conn, [pcm_bytes]))
+                    else:
+                        await self.handle_voice_stop(conn, [pcm_bytes])
                 conn.reset_audio_states()
 
     # 澶勭悊璇煶鍋滄
@@ -163,10 +176,26 @@
             text_len, _ = remove_punctuation_and_length(content_for_length_check)
             self.stop_ws_connection()
 
+            audio_snapshot = asr_audio_task.copy() if asr_audio_task else []
+            mode = getattr(conn, "interaction_mode", "")
+            if mode == "SHADOWING":
+                from core.app_runtime.session import stash_asr_audio
+
+                stash_asr_audio(conn, audio_snapshot)
+
             if text_len > 0:
-                audio_snapshot = asr_audio_task.copy()
-                enqueue_asr_report(conn, enhanced_text, audio_snapshot)
-                # 浣跨敤鑷畾涔夋ā鍧楄繘琛屼笂鎶�
+                from core.app_runtime.session import should_report_asr_now, stash_asr_audio
+
+                if mode != "SHADOWING":
+                    stash_asr_audio(conn, audio_snapshot)
+                if should_report_asr_now(conn):
+                    try:
+                        from core.audio_archive import archive_pcm_snapshot
+
+                        archive_pcm_snapshot(conn, audio_snapshot)
+                    except Exception:
+                        pass
+                    enqueue_asr_report(conn, enhanced_text, audio_snapshot)
                 await startToChat(conn, enhanced_text)
         except Exception as e:
             logger.bind(tag=TAG).error(f"澶勭悊璇煶鍋滄澶辫触: {e}")

--
Gitblit v1.9.1