From 00375a80b272c45e7b2af4a947dd9bf9f59f7ff9 Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Sat, 31 Jan 2026 17:29:57 +0800 Subject: [PATCH] 'commit' --- Util/AlyTtsKit.py | 7 +++ Util/__pycache__/AlyTtsKit.cpython-310.pyc | Bin 6355 -> 6490 bytes WeiXin/ChatMonitorAll_ReplyAudio.py | 41 +++++++++++++---- WeiXin/ChatMonitorAll_ReplyTxt.py | 28 ++++++++++-- WeiXin/WxUtil.py | 50 +++++++++++++-------- WeiXin/__pycache__/WxUtil.cpython-310.pyc | Bin 39393 -> 39461 bytes 6 files changed, 94 insertions(+), 32 deletions(-) diff --git a/Util/AlyTtsKit.py b/Util/AlyTtsKit.py index e7f2f88..7306680 100644 --- a/Util/AlyTtsKit.py +++ b/Util/AlyTtsKit.py @@ -98,6 +98,13 @@ class MyCallback(QwenTtsRealtimeCallback): print('[TTS] 会话结束') self.all_data_received = True self.complete_event.set() + + # [Fix] 如果直到会话结束都还没达到缓冲阈值(短文本情况),强制启动播放 + if not self.is_playing: + print("[TTS] 会话已结束但未达缓冲阈值,强制启动播放...") + self.is_playing = True + self.playback_thread = threading.Thread(target=self._playback_worker) + self.playback_thread.start() except Exception as e: print(f'[Error] 处理回调事件异常: {e}') diff --git a/Util/__pycache__/AlyTtsKit.cpython-310.pyc b/Util/__pycache__/AlyTtsKit.cpython-310.pyc index 2573873b26fed0ba77811ca91db3a9228c67ba99..04761392e30e6d494282e677e4ebbbdce73633d3 100644 GIT binary patch delta 1490 zcmZWpO>7%Q6!ygS`rol#yAElH^F!2_HV%|vKr|>x3sS45^e2EYqN~k%f;ZT^%gj1y zLPIMdRTTn(7!DOA0tpFK{8cofl|mY>T;KrWG6D&tI%&Be4)nkQ@!lEwP~=l#ul z^S(Fx!~Jq!+=|7*9(cUpEEzv{eGwn@Mr2U0Xr@W4T&|9L+eqMUu>aL}P#pGMPwav< zLq!w1Mb`iAcqhtt0Z8AhWtc1t%Tk0pmaTG!QLQHZde!2TrO+qjP*yWc4gPvT&U@J| zF`)ECT6SGMp}awIXk`fu@p9@gH%rD9ZOdk9@pquJAL}Va^h(`)QPr)w=}2E$bF^(G zJ{nw5Y~t}Ou86hZujHaw4t2!OcxD6qJ%^Ncyh?~i+!xxH@_C%(!ZqSqQix|U4yLsD zKGaV#;&$i(BE`MoKETQFvDQk(rSSaFgIH)0;UR=a5L!-y;(h=X7o*}xWcG;(SUxv3 zb@KV18|&}hyu8x5c4g};vAOd8jqB$(mp{I_v9Yx-8t1Rvx_F^+ZvFT5*Bk3=jSE*B zZ(VM@c4_nN&oVH&(b%a&M_)&d z!=xCx!w#X0g|%$xZrv?L<2|HboQnTOisDfFm^*CjB)U#*_wPm#Q!K20+P+4@QqiHc zFyKSNPVR|Fzg90BR=$l*iI0-IVT!&>9w$-JlghxlnCeZ8L99z2HIY0iUPujfx=Apd z3^MvsopOgupKWnRiqBKM9jCyO54()W(2P-~s;xN{RuWsOp-~yIwS}q$^y1V>AEVrE zIUp7+v&|yaIm^(gN=;@}t2N;C-0JZi2S~6Bd=`i2xrimZ#acQw;MVgrXqgRAiot~j zLg3ofYK8;XSi?=lAL;#R*QpIX-I!-w!+55+*B#bKb0}4Zo_5$C^xBIKN|QI2i@X9K zg%2}>87zXC2rYDrUovU(f%r4?NzToL-w1XX;m*MjU+?T98{(&(6NyQ*A4PZ);g~37 zb0jB@X1mUERJ@FE2I0R<%{f5b34l7hJPHu>_(h;wn#4(n$fiw&QR3tAy04qP~JMM45G-x!gkSn|*Fz2A-&f2ikz zY*tsqM?HDyRW5#&n~SB*q|>&2A9tvEyc!!qiHk!1=d{b;P*3t>;!S`tfGRJ?pRHDa zE(?g%{lN1{K|IYgWkG0BMzGzD;!Y=^nB+l_VwiM2-xfcUf;M7gjL&M*=`&uBTiT~+ z5~L(2Ac|4Uh>TK{WEg~`!2eE+&pC*xq>zij&T z7G8!7>i~-Y4S+Lc0C`P-1&{0eO(_9Tz`LDU(P@R82{Hk0D0(p~-^ZHdFWr*Xe`6oy>HAl2ltl>QW zW8_lWjN3ie3ydMM!50cIiIHy?-Y&y+MDc^bbFeWIB|@9EJKnCzPYP4{Wg(LT#6Aqr zx>@(SC6X-LA*PY3%@)AC9hE zkV-?KDQz~T;JeYK%dn1Sda!mD!-tH_ftCSmZ7?O-c|#M2I$xTb9|y7A>C;(2Z=+$k zjTY_utc|HhKjR;jzFd)k;f%=|Kn>tI!}5Py5q9kUuI=0xe;i`5zu`{#Mt&VEUITa? z;1>V7JoyOb7?o}|*H^c1Z&{nI=6bW$YTmT&tZp=k4SE=058yPKe91j{QwV(Vr5OQ9 zMMb$-CZX3d69gnil?;oYXeglK68n_g6BJnnco!fIYcc549e%H}lQ)wj2$ r + 30 and g > b + 30 and g > 100: - return "green" + # 1. 绿色气泡特征 (我) + # Light Mode: BGR (101, 225, 152) -> G 显著大于 R 和 B + # Dark Mode: BGR (30, 80, 40) -> G 依然显著大于 R 和 B + if g > r + 15 and g > b + 15: # 降低差值阈值,适应暗色模式 + if g > 50: # 只要不是太暗 + return "green" - # 白色气泡特征: - # R, G, B 都很高且接近 - # 考虑黑色文字的影响,如果是中位数,应该很高 (>200) - # 放宽对灰色的容忍度 (Dark Mode 可能偏灰) - if abs(r - g) < 30 and abs(g - b) < 30 and abs(r - b) < 30: - # 且亮度不能太低 (太低可能是黑色背景或深色物体) - if g > 150: + # 2. 白色/浅灰/深灰气泡特征 (对方) + # Light Mode: BGR (255, 255, 255) + # Dark Mode: BGR (45, 45, 45) + if abs(r - g) < 20 and abs(g - b) < 20 and abs(r - b) < 20: + # 白色 (Light Mode) + if g > 180: return "white" + # 深灰 (Dark Mode) + if 40 < g < 100: + return "white" # 统一归类为"对方"气泡颜色 - # 特殊补丁:如果 B, G, R 都很接近且在 130 左右,可能是微信的背景灰 (通常用于时间戳或系统消息) - if 110 < r < 160 and 110 < g < 160 and 110 < b < 160: - if abs(r - g) < 15 and abs(g - b) < 15: + # 3. 特殊补丁:系统消息 (灰色/极暗) + if abs(r - g) < 15 and abs(g - b) < 15: + # 系统背景灰 (Light Mode: 130 左右) + if 110 < g < 160: + return "system_gray" + # 极暗背景 (Dark Mode: 30 左右) + if g < 40: return "system_gray" return "unknown" @@ -399,9 +406,14 @@ def _scan_chat_messages(image_path): # 优先取最接近水平中心的文本作为标题 potential_titles.sort(key=lambda x: abs(x[0] - w/2)) chat_title = potential_titles[0][1] - # 去除可能包含的括号(比如备注名后的群聊人数,虽然后面会被截断) + # 去除可能包含的括号(比如备注名后的群聊人数) chat_title = re.sub(r'\(\d+\)$', '', chat_title).strip() - logger.info(f"识别到聊天标题/对方昵称: {chat_title}") + # [Fix] 过滤掉包含 ".." 的动态标题(如“对方正在输入..”),避免哈希失效 + if ".." in chat_title: + logger.info(f"忽略动态标题: {chat_title}") + chat_title = "对方" + else: + logger.info(f"识别到聊天标题/对方昵称: {chat_title}") # 微信菜单关键字(用于排除干扰) MENU_KEYWORDS = ["听筒播放", "收藏", "背景播放", "删除", "多选", "取消转文字", "转文字", "引用", "提醒"] diff --git a/WeiXin/__pycache__/WxUtil.cpython-310.pyc b/WeiXin/__pycache__/WxUtil.cpython-310.pyc index b757945b709e043e9a4c2ad0cfc23ca1eed81d43..ac1f5c1629f3a637bb268272845264c3b528dc6b 100644 GIT binary patch delta 5804 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 delta 5443 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 Ti35wmrYZp?5YZ(p_r?DoCsX)k