From: TimekeeperPL <1624952103@qq.com> Date: Wed, 27 May 2026 09:35:50 +0000 (+0800) Subject: 优化播报未听清提示音以后不重新开启录音的情况 X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=refs%2Fheads%2FJSWM;p=mirrors%2FASR1603_G5.git 优化播报未听清提示音以后不重新开启录音的情况 --- diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_session.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_session.py index 0d1a5b2c..d32bccf1 100644 --- a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_session.py +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_session.py @@ -1496,45 +1496,17 @@ class AI_VC(VCSessionIoMixin, VCSessionMediaMixin, Abstract): self._vc_handle_asr_empty_ptt(hint, reason) def _vc_should_soft_recover_empty_asr(self): - """过短/打断续聊空 ASR:仅重开麦,勿 cancel+synthesis 播「没听清」。""" if self._vc_asr_empty_soft_recover(): return True - try: - if self._vc_is_ptt_mode() and getattr(self, "_turn_has_asr_result", 0) != 1: - return True - except Exception: - pass - min_ms = 1500 - try: - if "vc_config" in globals() and vc_config: - min_ms = int(vc_config.get_int("ASR_EMPTY_MIN_UPLINK_MS", min_ms)) - except Exception: - pass - dur = int(getattr(self, "_vc_last_uplink_dur_ms", -1)) - if dur >= 0 and dur < min_ms: - r = str(getattr(self, "_vc_user_record_open_reason", "") or "") - if hasattr(self, "_vc_uplink_reason_is_user_key") and self._vc_uplink_reason_is_user_key(r): - return True - if r.startswith("key."): - return True + if self._vc_is_ptt_mode() and not getattr(self, "_turn_has_asr_result", 0): + return True + d = getattr(self, "_vc_last_uplink_dur_ms", -1) + if 0 <= d < 1500: + r = getattr(self, "_vc_user_record_open_reason", "") or "" + return self._vc_uplink_reason_is_user_key(r) or r.startswith("key.") return False def _vc_handle_asr_empty_long(self, hint, reason="asr.completed"): - """长对话:空 ASR 提示播完后复用 sid 重新开麦(蓝慢闪)。""" - if self._vc_should_soft_recover_empty_asr(): - try: - self._server_vad_silence = 0 - self._vc_defer_vad_uplink_stop = 0 - self._vc_vad_had_active_after_silence = 0 - self._vc_reopen_uplink_after_empty_hint = 0 - if getattr(self, "VC_record_state_flag", 0): - self.VC_Speech_End() - self._vc_clear_stale_record_state("asr.empty/recover") - self._long_dialogue_publish_listening("asr.empty/recover") - self.request_uplink_start("asr.empty/recover") - except Exception: - pass - return try: self._vc_reopen_uplink_after_empty_hint = 0 if ( @@ -1571,10 +1543,13 @@ class AI_VC(VCSessionIoMixin, VCSessionMediaMixin, Abstract): pass def _vc_long_reopen_after_asr_empty_hint(self): - """长对话:空 ASR 提示 TTS 播完后重新上行(复用当前 sid)。""" if not getattr(self, "_vc_reopen_uplink_after_empty_hint", 0): return False self._vc_reopen_uplink_after_empty_hint = 0 + if getattr(self, "_turn_has_asr_result", 0) or self._vc_tts_pipeline_busy(): + return False + if getattr(self, "_last_tts_kind", "") != "asr_empty_hint": + return False if not self._vc_is_long_dialogue_mode(): return False try: @@ -1594,7 +1569,6 @@ class AI_VC(VCSessionIoMixin, VCSessionMediaMixin, Abstract): self._vc_clear_stale_record_state("asr.empty/reopen") self._long_dialogue_publish_listening("asr.empty/reopen") self.request_uplink_start("asr.empty/reopen") - print("[VC][ASR] long empty hint done -> reopen uplink") return True except Exception as e: usys.print_exception(e) diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_session_io.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_session_io.py index 0ad78cbb..dcb60486 100644 --- a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_session_io.py +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_session_io.py @@ -858,6 +858,8 @@ class VCSessionIoMixin: if (self.AI_ASR_str or "").strip(): self._last_asr_result_text = self.AI_ASR_str self._turn_has_asr_result = 1 + # 有效 ASR 后勿再执行空 ASR 提示音播完开麦 + self._vc_reopen_uplink_after_empty_hint = 0 g = getattr(self, "_turn_guard", None) if g is not None: g.on_asr_result(self.AI_ASR_str) diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_session_media.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_session_media.py index dd6988e9..d3359cbf 100644 --- a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_session_media.py +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_session_media.py @@ -589,7 +589,7 @@ class VCSessionMediaMixin: return if getattr(self, "_turn_has_asr_result", 0) != 1: try: - print("[VC][ASR] skip think tone (no asr.result this turn)") + pass except Exception: pass return @@ -602,13 +602,13 @@ class VCSessionMediaMixin: try: last_ms = int(getattr(self, "_vc_last_think_tone_ms", 0) or 0) if last_ms and utime.ticks_diff(utime.ticks_ms(), last_ms) < debounce_ms: - print("[VC][ASR] skip think tone (debounce {}ms)".format(debounce_ms)) + pass return except Exception: pass if self._vc_local_play_busy(): try: - print("[VC][ASR] skip think tone (local_play busy)") + pass except Exception: pass return @@ -1985,11 +1985,11 @@ class VCSessionMediaMixin: try: if self.play_pcm is not None: pcm_free_pre = self.play_pcm.stream_get_buf_len() + pcm_pending_pre = self._vc_pcm_stream_pending_bytes(pcm_free_pre) else: - pcm_free_pre = 0 + pcm_pending_pre = 0 except Exception: - pcm_free_pre = 0 - pcm_pending_pre = self._vc_pcm_stream_pending_bytes(pcm_free_pre) + pcm_pending_pre = max(0, in_len - out_len) if pcm_pending_pre < 0: pcm_pending_pre = max(0, in_len - out_len) played_ok = (out_len >= in_len) or ( @@ -2011,15 +2011,18 @@ class VCSessionMediaMixin: is_pcm_empty = (self.play_pcm is None) or ( self.play_pcm is not None and self.play_pcm.stream_is_empty() == 1 ) - pcm_free = 0 + pcm_free = -1 if self.play_pcm is not None: try: pcm_free = self.play_pcm.stream_get_buf_len() except Exception: pcm_free = -1 - pcm_pending = self._vc_pcm_stream_pending_bytes(pcm_free) - if pcm_pending < 0: - pcm_pending = max(0, in_len - out_len) + if self.play_pcm is None: + pcm_pending = 0 + else: + pcm_pending = self._vc_pcm_stream_pending_bytes(pcm_free) + if pcm_pending < 0: + pcm_pending = max(0, in_len - out_len) bps = self._vc_tts_bytes_per_sec() fw = getattr(self, "_tts_first_write_ms", 0) diff --git a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_ux.py b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_ux.py index 8ef0223a..8a167eaf 100644 --- a/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_ux.py +++ b/2.sdk/project/7PIN_1_5/sdk/services/microPython/ports/quectel/core/vc_ux.py @@ -23,7 +23,7 @@ def ux_name(ux): def derive_ux_state(vc): """对齐 录音上传与播放-演示文稿:按键表与 LED 均基于此四态。""" try: - if hasattr(vc, "_vc_tts_playback_active") and vc._vc_tts_playback_active(): + if vc._vc_tts_playback_active(): return UX_TTS except Exception: pass