From 124b185b8aec61cd2ceae7a9b5eb639e46917a71 Mon Sep 17 00:00:00 2001 From: jeremygan2021 Date: Mon, 2 Mar 2026 22:58:02 +0800 Subject: [PATCH] new --- font.py | 273 +++++++++++------- main.py | 81 +----- websocket_client.py | 9 + .../__pycache__/server.cpython-312.pyc | Bin 12204 -> 12855 bytes websocket_server/received_audio.mp3 | Bin 8540 -> 7244 bytes websocket_server/received_audio.raw | Bin 86016 -> 71680 bytes websocket_server/server.py | 125 ++++++-- 7 files changed, 297 insertions(+), 191 deletions(-) diff --git a/font.py b/font.py index aa6e669..42e67fd 100644 --- a/font.py +++ b/font.py @@ -19,8 +19,47 @@ class Font: color_bytes = struct.pack(">H", color) bg_bytes = struct.pack(">H", bg) + # Create LUT for current color/bg + lut = [bytearray(16) for _ in range(256)] + for i in range(256): + for bit in range(8): + # bit 7 is first pixel (leftmost) + # target index: (7-bit)*2 + val = (i >> bit) & 1 + idx = (7 - bit) * 2 + if val: + lut[i][idx] = color_bytes[0] + lut[i][idx+1] = color_bytes[1] + else: + lut[i][idx] = bg_bytes[0] + lut[i][idx+1] = bg_bytes[1] + initial_x = x + # 1. Identify missing fonts + missing_codes = set() + for char in text: + if ord(char) > 127: + code = ord(char) + if code not in self.cache: + missing_codes.add(code) + + # 2. Batch request missing fonts + if missing_codes and self.ws: + # Convert to list for consistent order/string + missing_list = list(missing_codes) + # Limit batch size? Maybe 20 chars at a time? + # For short ASR result, usually < 20 chars. + + req_str = ",".join([str(c) for c in missing_list]) + print(f"Batch requesting fonts: {req_str}") + try: + self.ws.send(f"GET_FONTS_BATCH:{req_str}") + self._wait_for_fonts(missing_codes) + except Exception as e: + print(f"Batch font request failed: {e}") + + # 3. Draw text for char in text: # Handle newlines if char == '\n': @@ -38,56 +77,20 @@ class Font: is_chinese = False buf_data = None - # Check if it's Chinese + # Check if it's Chinese (or non-ASCII) if ord(char) > 127: - try: - gb = char.encode('gb2312') - if len(gb) == 2: - code = struct.unpack('>H', gb)[0] - # Try to get from cache - if code in self.cache: - buf_data = self.cache[code] - is_chinese = True - else: - # Need to fetch from server - # Since we can't block easily here (unless we use a blocking socket recv or a callback mechanism), - # we have to rely on the main loop to handle responses. - # But we want to draw *now*. - # - # Solution: - # 1. Send request - # 2. Wait for response with timeout (blocking wait) - # This is slow for long text but works for small amounts. - - if self.ws: - # Send request: GET_FONT:0xA1A1 - hex_code = "0x{:04X}".format(code) - print(f"Requesting font for {hex_code} ({char})") - self.ws.send(f"GET_FONT:{hex_code}") - - # Wait for response - # We need to peek/read from WS until we get FONT_DATA - buf_data = self._wait_for_font(hex_code) - - if buf_data: - self.cache[code] = buf_data - is_chinese = True - print(f"Font loaded for {hex_code}") - else: - print(f"Font fetch timeout for {hex_code}") - # Fallback: draw question mark or box - self._draw_ascii(tft, '?', x, y, color, bg) - x += 8 - continue # Skip drawing bitmap logic - else: - print("WS not available for font fetch") - except Exception as e: - print(f"Font error: {e}") + code = ord(char) + if code in self.cache: + buf_data = self.cache[code] + is_chinese = True + else: + # Still missing after batch request? + # Could be timeout or invalid char. pass if is_chinese and buf_data: # Draw Chinese character (16x16) - self._draw_bitmap(tft, buf_data, x, y, 16, 16, color_bytes, bg_bytes) + self._draw_bitmap(tft, buf_data, x, y, 16, 16, lut) x += 16 else: # Draw ASCII (8x16) using built-in framebuf font (8x8 actually) @@ -97,78 +100,148 @@ class Font: self._draw_ascii(tft, char, x, y, color, bg) x += 8 - def _wait_for_font(self, target_hex_code): + def _wait_for_fonts(self, target_codes): """ - Blocking wait for specific font data from WebSocket. - Timeout 1s. - WARNING: This might consume other messages (like audio playback commands)! - We need to handle them or put them back? - WebSocketClient doesn't support peeking easily. - - This is a limitation. If we receive other messages, we should probably print them or ignore them. - But for ASR result display, usually we are in a state where we just received ASR result and are waiting for TTS. + Blocking wait for a set of font codes. + Buffers other messages to self.ws.unread_messages. """ - if not self.ws: - return None + if not self.ws or not target_codes: + return start = time.ticks_ms() - while time.ticks_diff(time.ticks_ms(), start) < 1000: - # We use a non-blocking poll if possible, but here we want to block until data arrives - # ws.recv() is blocking. - # But we might block forever if server doesn't reply. - # So we should use poll with timeout. + self.local_deferred = [] + + # 2 seconds timeout for batch + while time.ticks_diff(time.ticks_ms(), start) < 2000 and target_codes: - # Using uselect in main.py, but here we don't have easy access to it unless passed in. - # Let's try a simple approach: set socket timeout temporarily? - # Or use select.poll() + # Check unread_messages first? + # Actually ws.recv() in our modified client already checks unread_messages. + # But wait, if we put something BACK into unread_messages, we need to be careful not to read it again immediately if we are looping? + # No, we only put NON-FONT messages back. We are looking for FONT messages. + # So if we pop a non-font message, we put it back? + # If we put it back at head, we will read it again next loop! Infinite loop! + # + # Solution: We should NOT use ws.recv() which pops from unread. + # We should assume unread_messages might contain what we need? + # + # Actually, `ws.recv()` pops from `unread_messages`. + # If we get a message that is NOT what we want, we should store it in a temporary list, and push them all back at the end? + # Or append to `unread_messages` (if it's a queue). + # But `unread_messages` is used as a LIFO or FIFO? + # pop(0) -> FIFO. + # If we append, it goes to end. + # So: + # 1. recv() -> gets msg. + # 2. Is it font? + # Yes -> process. + # No -> append to `temp_buffer`. + # 3. After function finishes (or timeout), extend `unread_messages` with `temp_buffer`? + # Wait, `unread_messages` should be preserved order. + # If we had [A, B] in unread. + # recv() gets A. Not font. Temp=[A]. + # recv() gets B. Not font. Temp=[A, B]. + # recv() gets network C (Font). Process. + # End. + # Restore: unread = Temp + unread? (unread is empty now). + # So unread becomes [A, B]. Correct. import uselect - poller = uselect.poll() - poller.register(self.ws.sock, uselect.POLLIN) - events = poller.poll(200) # 200ms timeout - if events: - try: - msg = self.ws.recv() + # Fast check if we can read + # But we want to block until SOMETHING arrives. + + # If unread_messages is not empty, we should process them first. + # But we can't peak easily without modifying recv again. + # Let's just use recv() and handle the buffering logic here. + + try: + # Use a poller for the socket part to implement timeout + # But recv() handles logic. + # If unread_messages is empty, we poll socket. + + can_read = False + if self.ws.unread_messages: + can_read = True + else: + poller = uselect.poll() + poller.register(self.ws.sock, uselect.POLLIN) + events = poller.poll(100) # 100ms + if events: + can_read = True + + if can_read: + msg = self.ws.recv() # This will pop from unread or read from sock + if msg is None: + # Socket closed or error? + # Or just timeout in recv (but we polled). + continue + if isinstance(msg, str): - if msg.startswith(f"FONT_DATA:{target_hex_code}:"): - # Found it! - hex_data = msg.split(":")[2] - return binascii.unhexlify(hex_data) + if msg == "FONT_BATCH_END": + # Batch complete. Mark remaining as failed. + # We need to iterate over a copy because we are modifying target_codes? + # Actually we just clear it. + # But wait, target_codes is passed by reference (set). + # If we clear it, loop breaks. + # But we also want to mark cache as None for missing ones. + temp_missing = list(target_codes) + for c in temp_missing: + print(f"Batch missing/failed: {c}") + self.cache[c] = None # Cache failure + target_codes.clear() + elif msg.startswith("FONT_DATA:"): - # Wrong font data? Ignore or cache it? + # General font data handler parts = msg.split(":") if len(parts) >= 3: - c = int(parts[1], 16) - d = binascii.unhexlify(parts[2]) - self.cache[c] = d + try: + key_str = parts[1] + if key_str.startswith("0x"): + c = int(key_str, 16) + else: + c = int(key_str) + + d = binascii.unhexlify(parts[2]) + self.cache[c] = d + if c in target_codes: + target_codes.remove(c) + # print(f"Batch loaded: {c}") + except: + pass else: # Other message, e.g. START_PLAYBACK - # We can't put it back easily. - # For now, just print it and ignore (it will be lost!) - # ideally we should have a message queue. - print(f"Ignored msg during font fetch: {msg}") - except: - pass - - return None + self.local_deferred.append(msg) + + elif msg is not None: + # Binary message? Buffer it too. + self.local_deferred.append(msg) + + except Exception as e: + print(f"Wait font error: {e}") + + # End of wait. Restore deferred messages. + if self.local_deferred: + # We want new_list = local_deferred + old_list + self.ws.unread_messages = self.local_deferred + self.ws.unread_messages + self.local_deferred = [] - def _draw_bitmap(self, tft, bitmap, x, y, w, h, color_bytes, bg_bytes): - # Convert 1bpp bitmap to RGB565 buffer - # bitmap length is w * h / 8 = 32 bytes for 16x16 + def _wait_for_font(self, target_code_str): + # Compatibility wrapper or deprecated? + # The new logic uses batch wait. + pass + + def _draw_bitmap(self, tft, bitmap, x, y, w, h, lut): + # Convert 1bpp bitmap to RGB565 buffer using LUT # Optimize buffer allocation - rgb_buf = bytearray(w * h * 2) - idx = 0 - for byte in bitmap: - for i in range(7, -1, -1): - if (byte >> i) & 1: - rgb_buf[idx] = color_bytes[0] - rgb_buf[idx+1] = color_bytes[1] - else: - rgb_buf[idx] = bg_bytes[0] - rgb_buf[idx+1] = bg_bytes[1] - idx += 2 + # bitmap length is w * h / 8 = 32 bytes for 16x16 + + # Create list of chunks + chunks = [lut[b] for b in bitmap] + + # Join chunks into one buffer + rgb_buf = b''.join(chunks) + tft.blit_buffer(rgb_buf, x, y, w, h) def _draw_ascii(self, tft, char, x, y, color, bg): diff --git a/main.py b/main.py index d3d85ac..4a88825 100644 --- a/main.py +++ b/main.py @@ -406,89 +406,32 @@ def main(): if display.tft: display.init_ui() - # 停止录音并等待回放 + # 停止录音并通知服务器 if ws: try: - print(">>> Sending STOP & Waiting for playback...") + print(">>> Sending STOP to server...") ws.send("STOP_RECORDING") - # 重新初始化 Speaker (16kHz Mono 16-bit) - if speaker.i2s: - cfg = speaker.config - speaker.i2s.deinit() - speaker.i2s = machine.I2S( - 0, - sck=machine.Pin(cfg['bck']), - ws=machine.Pin(cfg['ws']), - sd=machine.Pin(cfg['sd']), - mode=machine.I2S.TX, - bits=16, - format=machine.I2S.MONO, - rate=16000, - ibuf=40000, - ) - - # 接收回放循环 - playback_timeout = 5000 # 5秒无数据则退出 - last_data_time = time.ticks_ms() - - while True: - # Check for data with timeout + # 不再等待回放,直接退出录音状态 + # 稍微等待一下可能的最后 ASR 结果 (非阻塞) + # 等待 500ms 接收剩余的 ASR 结果 + t_wait = time.ticks_add(time.ticks_ms(), 500) + while time.ticks_diff(t_wait, time.ticks_ms()) > 0: poller = uselect.poll() poller.register(ws.sock, uselect.POLLIN) - events = poller.poll(100) # 100ms wait - + events = poller.poll(100) if events: msg = ws.recv() - last_data_time = time.ticks_ms() - - if isinstance(msg, str): - if msg == "START_PLAYBACK": - print(">>> Server starting playback stream...") - continue - elif msg == "STOP_PLAYBACK": - print(">>> Server finished playback.") - break - elif msg.startswith("ASR:"): - print_nice_asr(msg[4:], display) - - elif isinstance(msg, bytes): - # 播放接收到的音频数据 - if speaker.i2s: - # 使用 try-except 防止 write 阻塞导致的问题 - try: - speaker.i2s.write(msg) - except Exception as e: - print(f"I2S Write Error: {e}") - - elif msg is None: - print("WS Connection closed or error (recv returned None)") - try: - ws.close() - except: - pass - ws = None - break - else: - # No data received in this poll window - if time.ticks_diff(time.ticks_ms(), last_data_time) > playback_timeout: - print("Playback timeout - no data received for 5 seconds") - break - - # Feed watchdog or do other small tasks if needed - # time.sleep(0.01) - + if isinstance(msg, str) and msg.startswith("ASR:"): + print_nice_asr(msg[4:], display) + # 不需要处理其他类型的消息了 except Exception as e: - print(f"Playback loop error: {e}") + print(f"Stop recording error: {e}") try: ws.close() except: pass ws = None - - # 恢复 Speaker 原始配置 - if speaker.i2s: speaker.i2s.deinit() - speaker._init_audio() gc.collect() diff --git a/websocket_client.py b/websocket_client.py index 8c4cbed..cb6d08e 100644 --- a/websocket_client.py +++ b/websocket_client.py @@ -10,6 +10,7 @@ class WebSocketClient: self.sock = None self.uri = uri self.timeout = timeout + self.unread_messages = [] # Queue for buffered messages self.connect() def connect(self): @@ -109,6 +110,13 @@ class WebSocketClient: self.sock.write(masked_data) def recv(self): + # 1. Check if we have unread messages in the buffer + if self.unread_messages: + return self.unread_messages.pop(0) + + if not self.sock: + return None + # Read header try: # Read 2 bytes at once @@ -176,3 +184,4 @@ class WebSocketClient: if self.sock: self.sock.close() self.sock = None + self.unread_messages = [] diff --git a/websocket_server/__pycache__/server.cpython-312.pyc b/websocket_server/__pycache__/server.cpython-312.pyc index 14433d6d8356c3a98ea134759348f9275bc7e9d0..333045ea8e575309c1291a0ec30fb8f5e1117e24 100644 GIT binary patch delta 3071 zcmaJ@eN0=|6~FgAKd=cQfbl07Kie1##1Jq9urbs?KFAj&Bn3BsZCHEZB*LSq+Jz~Y}HFi!bkY3(rM}+lTenaTl3HEHF=n& zRgF0JcYo)1&OPVc$1}eT{E^GJvw3qGz@LMce;xiw)$cNN>C}%hQBnFGn&B(Zztb0K zCXzF8f3sOZ(-9hdmBl)Svc;5vRuc68AFlj8xW3b=gI6wWyBeh}ryc zVZR(Cs%3dhBebovnsrvI0-|={pzKMmT;;k(C*;b!sFPXFbf{_Ty{PBhQ5683CyIv} zGvIxF6wid)zeX5E16Ogf8-P*BPl?8L{1M?v2h$MHPme50u0pSj!Cs(dPR>bl*JfQh9%QYk((4Cx>1E;EDX3;!w5^dJy zp-1|hDy~JA#aM2Kn1jpPCbH+ic}2`3f&pLh7#WEcw5TaE?EJQ)aP%%@(wgG-4Xy7c zt)Hjlb0COlH+Wm|W4q^^g4-(^aP&UWm>5v%26YE_KvbLoe4D7?4kZ3?tU{(-&A|6$ zlw3t?JQ*$w$_~*gX@y<9*6;PYb4hH2I$ULv(3LvAqHf*)`o#(bX{O&zhUp|kKT zSg(f~DYStKFa*z15cmPaKcjHuAHy_yq_e>NXwaAoCy>wRgl!2ti?JH==$A$VY)2m$ z``|%j%6$zUns_JoDHYG!wc~JLXWN0pfg=Z6o7-A;;MbH)x#yw#OY-8LPdRbC(p6E( zm*Gv6YS9%3Vd0vlw{1W$!Iw$ge0H6g_AY9cXgA67=Qb_T13l^OYCORpYwZBgSoZC)EZgKB8L+(7vjTbLY$kOhh0%6>+tcR zpqq`Vwz91eE;NjxX$Q{_@@#)F!kr37POzjUmJhvpIy5ApJLY}RJ)vjq5O$*m%V7iE z*U!(VtX0BSCOSMFc_r9)61{DS!UB|TeY-g=JQO$`36o;ymBa>y1b%*t5adsUguptn z>6s>gtDaYoX6JEJ0WyIh^c!mfd=vfMT8wjUv02epn>p z?^1EeUVBedH+lHOzz2b;qxZf3RYfz@G{aeY@s+^EfKrHft-o;=bs<+IP8e zyyC8{dQ7=eQaQHe^IZEviSugzd(N@F3%0@wuTR@tV=b$c%2YgCTK>N0nrD1?y7Yw$ zO5z;8>>c-gW~*K(t$5#i%{!ShIXqoax_c_?Zt32OEngHAU)?hG$w zZ8U&Fk7Rd0$pe-`$>E(0Pac&DTko@bzA#xOd(-u*DR|v6<&Zi$r9)j(S5P{BLJIav z{b9*AaL;rS)i^p~Y~sg`Juvw7lM+zid<-a4@d9g?9CecgliEpf$~Wbb3fu0n?Tf7A z=_-TWU$4FhLGeEL->)?I_`7!Z(ds1VBM)|#D{hz+1Y7Dc|55(-E-Uyr z$ByyG?p(hT{6*u!_!DKe-${RBR1$3Sd0qnGWo|F+4e>`{VG z)fA>a)$CAUZrb3h=yB2a(_qiGl>3`Z1Ut&G!Jcp7H3rjP$Hpfu*xL;-1x0gfTMMJ8Py1Z&mpjdbTvv59nDBgPA$NU}laX-Z`bp zUqa7iW%%v%oH>Osc7`w|39pm!*QCx>lG)6;A)dgTm)Lm_S9jOZ^J<^{XaoJQmc%`5 z&|zvpL*f?nN`l#p?kakrjCdES7{b(%N*5Z*JuOlR%OtE))#IcWv$A>|^rDpvX0ed8 zyy##E@1zN{4dUr6x|kks>SAqNiK!)^>b25Ks*GL}y`&?@ESVU>SV<8}c2yviUMkB7 zQ1ntg@h(#gW|mWlcR5WPr08W!X23-)S5SC#%PuNV%Pdzz!f#J7wKTz=1okR1USTqi zdFd5xX5q0SYNZg8O%Zjhlvyce2rk=#6Rmg|Ed89KgA6h|-%NQOzd`s@=$iB8;^PF8 z|26n9F(G2!ASRuddSW&ca|zX!aq#!(eA&+pe*Dm1RXqk|{TB_Wyj6<8)ibEQy!(H= CPTWNR delta 2342 zcmZuxT}&HS7QT1xjPW!;jP0?OI!4>8zd>li7$BmV9#^ei+V*nJRyzeUW zI7*uoliZZz$+_kfxpmr1;+7OS`y>_=vm7`R0pKD`tSiFLe1+=tgxs3qNKKNVQHplZ zMwPTBc}%Ckk=rm1qI->gEs6`jI7GJhwSr|CMm9DxyH4m0_EG7knFEvI}*If~%u|?gADOg!BLNfdH6>vkU~s0VID!`#V18@WJQtC5Hq4 z5s!*)oDoam5gH5EWsv6Ho*NNEVOiT_+>oE8&eRbfFH0HGq#NzT~{FL;>JpJ1F z_;f5NeM`5PLiP3a__B25pwJhe89zHIOT7p7H3jxb6X#`OO6jGloG8OHmR8m}!Y!Vouyye*j~~J?UhocLi|-BS#ut5;c>U?vg(xkG<%%x& zJN!{aHS4B5-m7rqhZXi`-X+07@;@EHqW=K%CbJmv|Cwq3ApAfGY_S2MJ1@Fascnh9 zKBJa*t%%)OU**Ta4}%L6A9Y_3-1D_u*5}>c584;{@4Fi>vx|SNYKHaMmhKz+rBtRY z)1IkOn_gMa=d0?}#@>uxeR)vrAIy~8m{W(2tMw;Vs=`_PWA)yU73>MA{@_D9@a$2m z_AgB?h1ETM52Pbsxx7SQYG10k@qA`5b6D*UtC4Xvd{R9*q59+%R}4pMhT-wW&uWgq zmY=pF5L6$9KmFH43f}VvA3c?1V!)cG<;J?&&1@KgwH&I>1e{pYWSO$FLjx zQ)nXmOTBS~MPJ(Wl>2%@BUW&$9FCN+x7=3BTj7YAz17yUiv+hBH*wwe!0?=jz3mN= z;EoH1ExJ49PRfHYY}4Hd*$KZZz_63OYw=MYJme2IfP3x(DC|Y|y)f+7-S@c&UjcO_ zu~OH=5Zi;svWOY1LdsVWBonRbAnAXV=Z9L+s!<#Ypw$|dX6xq)=>~>M0gk3y5lwXP z!%nou7>2EA&BzgD&B{^5NwaHiegvYms?y<3wAQMlN+(B@ETq{i%Z-#4WqG=YY#Aiu zX3Yh(n!*N@t?BWf5YYN=dTd>ovl4B+mY!R0&{N)48s3F+98KqTaYV@(XsbC3{Zewa z0y+!mhGg=bmkZYxu801F-Meq8Lgi;^O07Rca=s0D8ILm z4RCW*DvX@(u#5%JhQToEWi}*+Y;D8Kj8<|R6_D!wf>MbnuPN|aJ>|`Yv0Ajr8OAKk zrT{6oFk^OZQ{*Uj?Iv|LYdPZF3?RbS_0j0L@yU2Jnj)`?#0>tTVOlp!eu#-PxViDw z>Tyb6rEr>pOhKVgOreuP359p@%|;ns!&QOzY`x@RUf{n6^!ft=jB|^jbgLid0+Ig% D8~j6x diff --git a/websocket_server/received_audio.mp3 b/websocket_server/received_audio.mp3 index 0115652fe4bfa42caa60357e623e957fdf887083..b0d90577106dc4393f1621617745fabafa1c5de0 100644 GIT binary patch literal 7244 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%0DsdKWqkQ*(Pl90<^ENa8R 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 MK>z>d{$mUO1;)Q9m;e9( diff --git a/websocket_server/received_audio.raw b/websocket_server/received_audio.raw index 405bd41161ce2162a91fde38ca77153a5fe756d9..a515f878783256bb0c1e3d02d4281c467cc2b1ce 100644 GIT binary patch literal 71680 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 QV>F3B(QB_p(R<_gFVN*v%m4rY diff --git a/websocket_server/server.py b/websocket_server/server.py index 4424f28..0a14c76 100644 --- a/websocket_server/server.py +++ b/websocket_server/server.py @@ -167,30 +167,110 @@ async def websocket_endpoint(websocket: WebSocket): except Exception as e: print(f"Error converting to MP3: {e}") - # 4. 发送回客户端播放 - print("Sending audio back...") - await websocket.send_text("START_PLAYBACK") + # 4. 不再发送回客户端播放,提升性能 + # print("Sending audio back...") + # await websocket.send_text("START_PLAYBACK") # 分块发送 - chunk_size = 4096 - for i in range(0, len(processed_audio), chunk_size): - chunk = processed_audio[i:i+chunk_size] - await websocket.send_bytes(chunk) - # 小延时,避免发送过快导致 ESP32 缓冲区溢出 - # 4096 bytes / 32000 bytes/s (16k*2) = ~0.128s - # 0.04s 约为 3 倍速发送,既保证缓冲又不至于拥塞 - await asyncio.sleep(0.04) + # chunk_size = 4096 + # for i in range(0, len(processed_audio), chunk_size): + # chunk = processed_audio[i:i+chunk_size] + # await websocket.send_bytes(chunk) + # # 小延时,避免发送过快导致 ESP32 缓冲区溢出 + # # 4096 bytes / 32000 bytes/s (16k*2) = ~0.128s + # # 0.04s 约为 3 倍速发送,既保证缓冲又不至于拥塞 + # await asyncio.sleep(0.04) - await websocket.send_text("STOP_PLAYBACK") - print("Audio sent back finished.") + # await websocket.send_text("STOP_PLAYBACK") + print("Server processing finished (No playback sent).") - elif text.startswith("GET_FONT:"): - # 格式: GET_FONT:0xA1A1 + elif text.startswith("GET_FONTS_BATCH:"): + # Format: GET_FONTS_BATCH:code1,code2,code3 (decimal unicode) try: - print(f"Font Request Received: {text}") - hex_code = text.split(":")[1] - code = int(hex_code, 16) + codes_str = text.split(":")[1] + code_list = codes_str.split(",") + print(f"Batch Font Request for {len(code_list)} chars: {code_list}") + for code_str in code_list: + if not code_str: continue + + try: + unicode_val = int(code_str) + char = chr(unicode_val) + + gb_bytes = char.encode('gb2312') + if len(gb_bytes) == 2: + code = struct.unpack('>H', gb_bytes)[0] + else: + print(f"Character {char} is not a valid 2-byte GB2312 char") + # Send empty/dummy? Or just skip. + # Better to send something so client doesn't wait forever if it counts responses. + # But client probably uses a set of missing chars. + continue + + # Calc offset + area = (code >> 8) - 0xA0 + index = (code & 0xFF) - 0xA0 + + if area >= 1 and index >= 1: + offset = ((area - 1) * 94 + (index - 1)) * 32 + + # Read font file + # Optimization: Open file once outside loop? + # For simplicity, keep it here, OS caching helps. + + script_dir = os.path.dirname(os.path.abspath(__file__)) + font_path = os.path.join(script_dir, FONT_FILE) + if not os.path.exists(font_path): + font_path = os.path.join(script_dir, "..", FONT_FILE) + if not os.path.exists(font_path): + font_path = FONT_FILE + + if os.path.exists(font_path): + with open(font_path, "rb") as f: + f.seek(offset) + font_data = f.read(32) + if len(font_data) == 32: + import binascii + hex_data = binascii.hexlify(font_data).decode('utf-8') + response = f"FONT_DATA:{code_str}:{hex_data}" + await websocket.send_text(response) + # Small yield to let network flush? + # await asyncio.sleep(0.001) + except Exception as e: + print(f"Error processing batch item {code_str}: {e}") + + # Send a completion marker + await websocket.send_text("FONT_BATCH_END") + + except Exception as e: + print(f"Error handling BATCH FONT request: {e}") + await websocket.send_text("FONT_BATCH_END") # Ensure we unblock client + + elif text.startswith("GET_FONT_UNICODE:") or text.startswith("GET_FONT:"): + # 格式: GET_FONT_UNICODE:12345 (decimal) or GET_FONT:0xA1A1 (hex) + try: + is_unicode = text.startswith("GET_FONT_UNICODE:") + code_str = text.split(":")[1] + + target_code_str = code_str # Used for response + + if is_unicode: + unicode_val = int(code_str) + char = chr(unicode_val) + try: + gb_bytes = char.encode('gb2312') + if len(gb_bytes) == 2: + code = struct.unpack('>H', gb_bytes)[0] + else: + print(f"Character {char} is not a valid 2-byte GB2312 char") + continue + except Exception as e: + print(f"Failed to encode {char} to gb2312: {e}") + continue + else: + code = int(code_str, 16) + # 计算偏移量 # GB2312 编码范围:0xA1A1 - 0xFEFE # 区码:高字节 - 0xA0 @@ -225,17 +305,18 @@ async def websocket_endpoint(websocket: WebSocket): if len(font_data) == 32: import binascii hex_data = binascii.hexlify(font_data).decode('utf-8') - response = f"FONT_DATA:{hex_code}:{hex_data}" - print(f"Sending Font Response: {response[:30]}...") + # Return the original requested code (unicode or hex) so client can map it back + response = f"FONT_DATA:{target_code_str}:{hex_data}" + # print(f"Sending Font Response: {response[:30]}...") await websocket.send_text(response) else: print(f"Error: Read {len(font_data)} bytes for font data (expected 32)") else: print(f"Font file not found: {font_path}") else: - print(f"Invalid GB2312 code: {hex_code} (Area: {area}, Index: {index})") + print(f"Invalid GB2312 code derived: {code:X} (Area: {area}, Index: {index})") except Exception as e: - print(f"Error handling GET_FONT: {e}") + print(f"Error handling FONT request: {e}") elif "bytes" in message: # 接收音频数据并追加到缓冲区