From e0776a1839ddf667435bb5b081498446ee4b3f52 Mon Sep 17 00:00:00 2001 From: jeremygan2021 Date: Mon, 2 Mar 2026 22:43:04 +0800 Subject: [PATCH] t --- .trae/rules/rule.md | 3 +- LICENSE | 21 - audio.py | 75 +++- display.py | 10 + font.py | 208 +++++++++ main.py | 421 ++++++++++++++++-- websocket_client.py | 178 ++++++++ websocket_server/.env | 1 + websocket_server/GB2312-16.bin | Bin 0 -> 282752 bytes websocket_server/README.md | 31 ++ .../__pycache__/server.cpython-312.pyc | Bin 0 -> 12200 bytes .../__pycache__/server.cpython-313.pyc | Bin 0 -> 5071 bytes websocket_server/generate_font.py | 127 ++++++ websocket_server/received_audio.mp3 | Bin 0 -> 11672 bytes websocket_server/received_audio.raw | Bin 0 -> 118784 bytes websocket_server/requirements.txt | 6 + websocket_server/server.py | 277 ++++++++++++ websocket_server/test_font.py | 55 +++ 18 files changed, 1331 insertions(+), 82 deletions(-) delete mode 100644 LICENSE create mode 100644 font.py create mode 100644 websocket_client.py create mode 100644 websocket_server/.env create mode 100644 websocket_server/GB2312-16.bin create mode 100644 websocket_server/README.md create mode 100644 websocket_server/__pycache__/server.cpython-312.pyc create mode 100644 websocket_server/__pycache__/server.cpython-313.pyc create mode 100644 websocket_server/generate_font.py create mode 100644 websocket_server/received_audio.mp3 create mode 100644 websocket_server/received_audio.raw create mode 100644 websocket_server/requirements.txt create mode 100644 websocket_server/server.py create mode 100644 websocket_server/test_font.py diff --git a/.trae/rules/rule.md b/.trae/rules/rule.md index 9601240..7a43358 100644 --- a/.trae/rules/rule.md +++ b/.trae/rules/rule.md @@ -1,4 +1,5 @@ 这是一个esp32 s3项目 用的是Micropython 使用的spi7789 方形的屏幕封装 -硬件是基于c++文件夹里的代码改到MicroPython上面 \ No newline at end of file +硬件是基于c++文件夹里的代码改到MicroPython上面 +websocket_server是这个esp32的服务器项目 \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index ecd5bbf..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 Ivan Belokobylskiy - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/audio.py b/audio.py index f3c7eb1..37d2c1a 100644 --- a/audio.py +++ b/audio.py @@ -42,33 +42,70 @@ class AudioPlayer: self.i2s = None def play_tone(self, frequency, duration_ms, volume=0.5): - """播放指定频率的音调""" + """播放指定频率的音调 (优化内存版)""" if self.i2s is None: return sample_rate = self.config.get('sample_rate', 24000) - n_samples = int(sample_rate * duration_ms / 1000) + + if frequency <= 0: + # 静音处理 + time.sleep_ms(duration_ms) + return + + # 振幅 amplitude = int(32767 * volume) - # STEREO: 每个采样 2 个声道 (L+R),每个声道 2 字节 (16-bit) -> 4 字节/帧 - buffer = bytearray(n_samples * 4) - if frequency > 0: - period = sample_rate // frequency - half_period = period // 2 + # 计算单周期采样数 + period = sample_rate // frequency + + # 目标 buffer 大小约 2048 字节 (防止 buffer 只有几字节导致 underrun) + target_size = 2048 + frame_size = 4 # 16bit stereo + + # 计算 buffer 中包含多少个完整周期 + period_bytes = period * frame_size + repeats = max(1, target_size // period_bytes) + buffer_bytes = repeats * period_bytes + + buffer = bytearray(buffer_bytes) + + # 填充 buffer + half_period = period // 2 + + # 预计算采样值的高低字节 + pos_val = amplitude + neg_val = -amplitude + + pos_low = pos_val & 0xFF + pos_high = (pos_val >> 8) & 0xFF + neg_low = neg_val & 0xFF + neg_high = (neg_val >> 8) & 0xFF + + for i in range(period * repeats): + # 方波:前半周期高电平,后半周期低电平 + if (i % period) < half_period: + low, high = pos_low, pos_high + else: + low, high = neg_low, neg_high - for i in range(n_samples): - # 方波:前半周期高电平,后半周期低电平 - sample = amplitude if (i % period) < half_period else -amplitude - # 左声道 - struct.pack_into('>> Initializing Display...") @@ -41,6 +43,14 @@ class Display: if self.tft: self.tft.fill_rect(x, y, w, h, color) + def set_ws(self, ws): + if self.font: + self.font.set_ws(ws) + + def text(self, text, x, y, color): + if self.tft: + self.font.text(self.tft, text, x, y, color) + def init_ui(self): """初始化 UI 背景""" if self.tft: diff --git a/font.py b/font.py new file mode 100644 index 0000000..aa6e669 --- /dev/null +++ b/font.py @@ -0,0 +1,208 @@ +import framebuf +import struct +import time +import binascii + +class Font: + def __init__(self, ws=None): + self.ws = ws + self.cache = {} # Simple cache for font bitmaps: {code: bytes} + + def set_ws(self, ws): + self.ws = ws + + def text(self, tft, text, x, y, color, bg=0x0000): + """ + Draw text on ST7789 display using WebSocket to fetch fonts + """ + # Pre-calculate color bytes + color_bytes = struct.pack(">H", color) + bg_bytes = struct.pack(">H", bg) + + initial_x = x + + for char in text: + # Handle newlines + if char == '\n': + x = initial_x + y += 16 + continue + + # Boundary check + if x + 16 > tft.width: + x = initial_x + y += 16 + if y + 16 > tft.height: + break + + is_chinese = False + buf_data = None + + # Check if it's Chinese + 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}") + 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) + x += 16 + else: + # Draw ASCII (8x16) using built-in framebuf font (8x8 actually) + # If char is not ASCII, replace with '?' to avoid framebuf errors + if ord(char) > 127: + char = '?' + self._draw_ascii(tft, char, x, y, color, bg) + x += 8 + + def _wait_for_font(self, target_hex_code): + """ + 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. + """ + if not self.ws: + return None + + 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. + + # 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() + + 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() + 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) + elif msg.startswith("FONT_DATA:"): + # Wrong font data? Ignore or cache it? + parts = msg.split(":") + if len(parts) >= 3: + c = int(parts[1], 16) + d = binascii.unhexlify(parts[2]) + self.cache[c] = d + 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 + + 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 + + # 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 + tft.blit_buffer(rgb_buf, x, y, w, h) + + def _draw_ascii(self, tft, char, x, y, color, bg): + # Use framebuf for ASCII + w, h = 8, 8 + buf = bytearray(w * h // 8) + fb = framebuf.FrameBuffer(buf, w, h, framebuf.MONO_VLSB) + fb.fill(0) + fb.text(char, 0, 0, 1) + + # Since framebuf.text is 8x8, we center it vertically in 16px height + # Drawing pixel by pixel is slow but compatible + # To optimize, we can build a small buffer + + # Create a 8x16 RGB565 buffer + rgb_buf = bytearray(8 * 16 * 2) + # Fill with background + bg_high, bg_low = bg >> 8, bg & 0xFF + color_high, color_low = color >> 8, color & 0xFF + + for i in range(0, len(rgb_buf), 2): + rgb_buf[i] = bg_high + rgb_buf[i+1] = bg_low + + # Draw the 8x8 character into the buffer (centered) + # MONO_VLSB: each byte is a column of 8 pixels + for col in range(8): # 0..7 + byte = buf[col] + for row in range(8): # 0..7 + if (byte >> row) & 1: + # Calculate position in rgb_buf + # Target: x=col, y=row+4 + pos = ((row + 4) * 8 + col) * 2 + rgb_buf[pos] = color_high + rgb_buf[pos+1] = color_low + + tft.blit_buffer(rgb_buf, x, y, 8, 16) diff --git a/main.py b/main.py index 1786af0..d3d85ac 100644 --- a/main.py +++ b/main.py @@ -4,15 +4,195 @@ import math import struct import array import gc +import network import st7789py as st7789 from config import CURRENT_CONFIG from audio import AudioPlayer, Microphone from display import Display +from websocket_client import WebSocketClient +import uselect + +# ============================================================================= +# 网络配置 +# ============================================================================= +WIFI_SSID = "Tangledup-AI" +WIFI_PASS = "djt12345678" +# 请修改为你的电脑 IP 地址 +SERVER_IP = "6.6.6.88" +SERVER_PORT = 8000 +SERVER_URL = f"ws://{SERVER_IP}:{SERVER_PORT}/ws/audio" + +def diagnose_wifi(): + """ + 诊断WiFi模块状态,打印详细的调试信息 + """ + print("\n" + "="*50) + print("WiFi DIAGNOSTIC INFORMATION") + print("="*50) + + wlan = network.WLAN(network.STA_IF) + + # 基本状态 + print(f"WiFi Module Active: {wlan.active()}") + print(f"Connection Status: {wlan.isconnected()}") + + if wlan.isconnected(): + print(f"Network Config: {wlan.ifconfig()}") + print(f"Network SSID: {wlan.config('essid')}") + print(f"Signal Strength: {wlan.status('rssi')} dBm") + + # 扫描可用网络 + try: + print("\nScanning for available networks...") + wlan.active(True) + time.sleep(1) + + networks = wlan.scan() + print(f"Found {len(networks)} networks:") + + for net in networks: + ssid = net[0].decode('utf-8') if net[0] else "Hidden" + bssid = ':'.join(['%02x' % b for b in net[1]]) + channel = net[2] + rssi = net[3] + security = net[4] + + # 标记目标网络 + marker = " [TARGET]" if ssid == WIFI_SSID else "" + + print(f" {ssid}{marker}") + print(f" BSSID: {bssid}, Channel: {channel}, RSSI: {rssi}dBm") + + # 信号强度解释 + if rssi > -50: + signal_desc = "Excellent" + elif rssi > -60: + signal_desc = "Good" + elif rssi > -70: + signal_desc = "Fair" + else: + signal_desc = "Weak" + + print(f" Signal: {signal_desc}") + print("") + + except Exception as e: + print(f"Network scan failed: {e}") + + print("="*50 + "\n") + + +def connect_wifi(max_retries=3): + """ + 连接WiFi网络,包含完整的错误处理和重试机制 + + Args: + max_retries: 最大重试次数,默认为3次 + + Returns: + bool: 连接成功返回True,失败返回False + """ + wlan = network.WLAN(network.STA_IF) + + # 首先确保WiFi模块处于干净状态 + try: + wlan.active(False) # 先关闭WiFi + time.sleep(1) # 等待1秒让模块完全关闭 + wlan.active(True) # 重新激活WiFi + time.sleep(1) # 等待模块初始化完成 + except Exception as e: + print(f"WiFi module initialization error: {e}") + return False + + # 尝试连接,包含重试机制 + for attempt in range(max_retries): + try: + print(f"WiFi connection attempt {attempt + 1}/{max_retries}") + + # 检查是否已连接 + if wlan.isconnected(): + print('Already connected to WiFi') + print('Network config:', wlan.ifconfig()) + return True + + # 尝试连接 + print(f'Connecting to WiFi {WIFI_SSID}...') + wlan.connect(WIFI_SSID, WIFI_PASS) + + # 等待连接完成,设置超时 + start_time = time.time() + while not wlan.isconnected(): + if time.time() - start_time > 20: # 单次连接超时20秒 + print("WiFi connection timeout!") + break + time.sleep(0.5) + print(".", end="") + + print("") # 换行 + + # 检查连接结果 + if wlan.isconnected(): + print('WiFi connected successfully!') + print('Network config:', wlan.ifconfig()) + return True + else: + print(f"Connection attempt {attempt + 1} failed") + + # 在重试前进行清理 + if attempt < max_retries - 1: # 如果不是最后一次尝试 + print("Resetting WiFi module for retry...") + wlan.disconnect() # 断开连接 + time.sleep(2) # 等待2秒 + + except OSError as e: + print(f"WiFi connection error on attempt {attempt + 1}: {e}") + if "Wifi Internal State Error" in str(e): + print("Detected internal state error, resetting WiFi module...") + try: + wlan.active(False) + time.sleep(2) + wlan.active(True) + time.sleep(1) + except: + pass + + if attempt < max_retries - 1: + print(f"Retrying in 3 seconds...") + time.sleep(3) + + except Exception as e: + print(f"Unexpected error on attempt {attempt + 1}: {e}") + if attempt < max_retries - 1: + time.sleep(2) + + # 所有尝试都失败 + print("All WiFi connection attempts failed!") + try: + wlan.active(False) # 关闭WiFi模块节省电力 + except: + pass + return False # ============================================================================= # 硬件引脚配置 (从 config.py 获取) # ============================================================================= +def print_nice_asr(text, display=None): + """在终端美观地打印ASR结果,并在屏幕显示""" + print("\n" + "*"*40) + print(" ASR RESULT:") + print(f" {text}") + print("*"*40 + "\n") + + if display and display.tft: + # 清除之前的文本区域 (保留顶部的状态栏和底部的可视化条) + # 假设状态栏 30px,底部 240-200=40px 用于可视化? + # init_ui 画了 0-30 的白条。 + # update_audio_bar 在 240-bar_height 画条。 + # 我们使用中间区域 40 - 200 + display.fill_rect(0, 40, 240, 160, st7789.BLACK) + display.text(text, 0, 40, st7789.WHITE) + def main(): print("\n" + "="*40) print("AUDIO & MIC DIAGNOSTIC V5 (Modular & Clean)") @@ -35,7 +215,44 @@ def main(): speaker = AudioPlayer() if speaker.i2s: # 默认播放马里奥 - speaker.play_mario() + # speaker.play_mario() + + # 播放简单方波 (1kHz, 1秒) + # 直接在 main.py 中实现分块播放,避免因 audio.py 未同步导致的 MemoryError + print("Playing 1kHz square wave...") + try: + import struct + + # 1. 参数设置 + sr = 24000 # 默认采样率 + if hasattr(speaker, 'config') and speaker.config: + sr = speaker.config.get('sample_rate', 24000) + freq = 1000 + duration = 1000 # ms + vol = 10000 # 音量 (max 32767) + + # 2. 准备缓冲区 (只生成一小段,循环播放) + # 1kHz @ 24kHz -> 24 samples/cycle + period = sr // freq + # 生成约 1000 字节的 buffer (包含整数个周期) + cycles_in_buf = 10 + buf = bytearray(period * cycles_in_buf * 4) # 16bit stereo = 4 bytes/frame + + # 3. 填充方波数据 + for i in range(period * cycles_in_buf): + # 方波逻辑 + sample = vol if (i % period) < (period // 2) else -vol + # 写入左右声道 (Little Endian, 16-bit signed) + struct.pack_into(' 0: + speaker.i2s.write(buf) + + except Exception as e: + print(f"Tone error: {e}") + else: print("!!! Speaker initialization failed") @@ -57,7 +274,49 @@ def main(): # 录音状态变量 is_recording = False - recorded_chunks = [] + + # WebSocket 连接 + ws = None + + # 定义连接函数 + def connect_ws(): + nonlocal ws + # Reset existing connection object to ensure clean slate + try: + if ws: + ws.close() + except: + pass + ws = None + + try: + print(f"Connecting to WebSocket Server: {SERVER_URL}") + ws = WebSocketClient(SERVER_URL) + print("WebSocket connected successfully!") + + # Pass WebSocket to display for font loading + if display: + display.set_ws(ws) + + return True + except Exception as e: + print(f"WebSocket connection failed: {e}") + return False + + # 先运行WiFi诊断 + print("Running WiFi diagnostics...") + diagnose_wifi() + + # 尝试连接WiFi + print("Starting WiFi connection process...") + if connect_wifi(max_retries=3): + print("WiFi connected successfully!") + connect_ws() + else: + print("WiFi connection failed after all attempts!") + print("Continuing in offline mode without WebSocket functionality...") + print("You can still use the device for local audio recording and visualization.") + # 调试:打印一次 Boot 键状态 print(f"Boot Button Initial State: {boot_btn.value()}") @@ -86,68 +345,151 @@ def main(): if not is_recording: print("\n>>> Start Recording (Boot Pressed)...") is_recording = True - recorded_chunks = [] if display.tft: print(">>> Filling Screen WHITE") display.fill(st7789.WHITE) else: print(">>> Display TFT is None!") + + # 尝试重连 WS + if ws is None or not ws.is_connected(): + print(">>> WS not connected, trying to reconnect...") + connect_ws() + + # 发送开始录音指令 + if ws and ws.is_connected(): + try: + ws.send("START_RECORDING") + except Exception as e: + print(f"WS Send Error: {e}") + ws = None # Disconnect on error + else: + print(">>> Warning: No WebSocket connection! Audio will be discarded.") - # 录音 + # 录音并流式传输 if mic.i2s: num_read = mic.readinto(read_buf) if num_read > 0: - try: - recorded_chunks.append(bytes(read_buf[:num_read])) - except MemoryError: - print("Memory Full!") + if ws and ws.is_connected(): + try: + # 发送二进制数据 + ws.send(read_buf[:num_read], opcode=2) + + # 检查是否有回传的 ASR 结果 (非阻塞) + poller = uselect.poll() + poller.register(ws.sock, uselect.POLLIN) + events = poller.poll(0) # 0 = return immediately + if events: + msg = ws.recv() + if isinstance(msg, str) and msg.startswith("ASR:"): + print_nice_asr(msg[4:], display) + + except Exception as e: + print(f"WS Send/Recv Error: {e}") + # 如果发送失败,视为断开 + try: + ws.close() + except: + pass + ws = None + else: + # 如果没有 WS,就不保存了,避免内存溢出 + pass + continue # 跳过可视化逻辑 # === 按键释放处理 === elif is_recording: - print(f"\n>>> Stop Recording. Captured {len(recorded_chunks)} chunks.") + print(f"\n>>> Stop Recording.") is_recording = False if display.tft: display.init_ui() - # 播放录音 - if speaker.i2s and len(recorded_chunks) > 0: - print(">>> Playing...") + # 停止录音并等待回放 + if ws: try: - cfg = speaker.config - # 重新初始化 Speaker (16kHz Mono 16-bit) 以匹配 Mic 数据 - 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=20000, - ) + print(">>> Sending STOP & Waiting for playback...") + ws.send("STOP_RECORDING") - # 播放数据 - for chunk in recorded_chunks: - # 32-bit Mono -> 16-bit Mono (取高16位) - # chunk 是 bytes, 转为 array('h') 方便访问 16-bit word - # 32-bit 数据: LowWord, HighWord - # 我们需要 HighWord - arr = array.array('h', chunk) - samples = arr[1::2] - speaker.i2s.write(samples) + # 重新初始化 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 + poller = uselect.poll() + poller.register(ws.sock, uselect.POLLIN) + events = poller.poll(100) # 100ms wait + + 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) except Exception as e: - print(f"Playback error: {e}") + print(f"Playback loop error: {e}") + try: + ws.close() + except: + pass + ws = None # 恢复 Speaker 原始配置 if speaker.i2s: speaker.i2s.deinit() speaker._init_audio() - recorded_chunks = [] gc.collect() # === 原有的可视化逻辑 === @@ -178,10 +520,7 @@ def main(): last_print = time.ticks_ms() if display.tft: - # 调整缩放比例,让显示更敏感 - # 你的日志显示安静时 Max ~2000-3000, 说话时 Max ~40000 - # 我们可以把 Max 40000 映射到满格 - + # 调整缩放比例 bar_height = int((max_val / 40000) * 200) if bar_height > 200: bar_height = 200 if bar_height < 0: bar_height = 0 diff --git a/websocket_client.py b/websocket_client.py new file mode 100644 index 0000000..8c4cbed --- /dev/null +++ b/websocket_client.py @@ -0,0 +1,178 @@ +import usocket as socket +import ubinascii +import uos + +class WebSocketError(Exception): + pass + +class WebSocketClient: + def __init__(self, uri, timeout=5): + self.sock = None + self.uri = uri + self.timeout = timeout + self.connect() + + def connect(self): + uri = self.uri + assert uri.startswith("ws://") + + uri = uri[5:] + if "/" in uri: + host, path = uri.split("/", 1) + else: + host, path = uri, "" + path = "/" + path + + if ":" in host: + host, port = host.split(":") + port = int(port) + else: + port = 80 + + print(f"Connecting to {host}:{port}{path}...") + self.sock = socket.socket() + + # Add timeout + self.sock.settimeout(self.timeout) + + addr_info = socket.getaddrinfo(host, port) + addr = addr_info[0][-1] + print(f"Resolved address: {addr}") + + try: + self.sock.connect(addr) + except OSError as e: + print(f"Socket connect failed: {e}") + if e.args[0] == 113: + print("Hint: Check firewall settings on server or if server is running.") + raise + + # Random key + key = ubinascii.b2a_base64(uos.urandom(16)).strip() + + + req = "GET {} HTTP/1.1\r\n".format(path) + req += "Host: {}:{}\r\n".format(host, port) + req += "Connection: Upgrade\r\n" + req += "Upgrade: websocket\r\n" + req += "Sec-WebSocket-Key: {}\r\n".format(key.decode()) + req += "Sec-WebSocket-Version: 13\r\n" + req += "\r\n" + + self.sock.write(req.encode()) + + # Read handshake response + header = b"" + while b"\r\n\r\n" not in header: + chunk = self.sock.read(1) + if not chunk: + raise WebSocketError("Connection closed during handshake") + header += chunk + + if b" 101 " not in header: + raise WebSocketError("Handshake failed: " + header.decode()) + + print("WebSocket connected!") + + def is_connected(self): + return self.sock is not None + + def send(self, data, opcode=1): # 1=Text, 2=Binary + if not self.sock: + print("WebSocket is not connected (send called on closed socket)") + raise WebSocketError("Connection closed") + + if isinstance(data, str): + data = data.encode('utf-8') + + header = bytearray() + header.append(0x80 | opcode) # FIN + Opcode + + length = len(data) + if length < 126: + header.append(0x80 | length) # Masked + length + elif length < 65536: + header.append(0x80 | 126) + header.extend(length.to_bytes(2, 'big')) + else: + header.append(0x80 | 127) + header.extend(length.to_bytes(8, 'big')) + + mask = uos.urandom(4) + header.extend(mask) + + masked_data = bytearray(length) + for i in range(length): + masked_data[i] = data[i] ^ mask[i % 4] + + self.sock.write(header) + self.sock.write(masked_data) + + def recv(self): + # Read header + try: + # Read 2 bytes at once + header = self.sock.read(2) + if not header or len(header) < 2: return None + + b1 = header[0] + b2 = header[1] + + fin = b1 & 0x80 + opcode = b1 & 0x0f + + mask = b2 & 0x80 + length = b2 & 0x7f + + if length == 126: + length_bytes = self.sock.read(2) + if not length_bytes: return None + length = int.from_bytes(length_bytes, 'big') + elif length == 127: + length_bytes = self.sock.read(8) + if not length_bytes: return None + length = int.from_bytes(length_bytes, 'big') + + if mask: + mask_key = self.sock.read(4) + if not mask_key: return None + + # Read payload + data = bytearray(length) + view = memoryview(data) + pos = 0 + while pos < length: + read_len = self.sock.readinto(view[pos:]) + if read_len == 0: + return None + pos += read_len + + if mask: + unmasked = bytearray(length) + for i in range(length): + unmasked[i] = data[i] ^ mask_key[i % 4] + data = unmasked + + if opcode == 1: # Text + return data.decode('utf-8') + elif opcode == 2: # Binary + return data + elif opcode == 8: # Close + self.close() + return None + elif opcode == 9: # Ping + self.send(data, opcode=10) # Pong + return self.recv() + + return data + + except Exception as e: + # Don't print timeout errors as they are expected in non-blocking polling + if "ETIMEDOUT" not in str(e) and "110" not in str(e): + print(f"WS Recv Error: {e}") + return None + + def close(self): + if self.sock: + self.sock.close() + self.sock = None diff --git a/websocket_server/.env b/websocket_server/.env new file mode 100644 index 0000000..4e472f7 --- /dev/null +++ b/websocket_server/.env @@ -0,0 +1 @@ +DASHSCOPE_API_KEY=sk-a294f382488d46a1aa0d7cd8e750729b \ No newline at end of file diff --git a/websocket_server/GB2312-16.bin b/websocket_server/GB2312-16.bin new file mode 100644 index 0000000000000000000000000000000000000000..75b182a9b3d34224f7e317a9f4e5392c76242e80 GIT binary patch literal 282752 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 a25K0nVW5VA8U|_@s9~Unf&Y&&@c#e@>3InN literal 0 HcmV?d00001 diff --git a/websocket_server/README.md b/websocket_server/README.md new file mode 100644 index 0000000..3a670c1 --- /dev/null +++ b/websocket_server/README.md @@ -0,0 +1,31 @@ +# WebSocket Audio Server + +This is a FastAPI server that receives audio from an ESP32 via WebSocket, saves it, processes it (converts 32-bit to 16-bit), and sends it back for playback. + +## Installation + +1. Install dependencies: + ```bash + pip install -r requirements.txt + ``` + +## Usage + +1. Start the server: + ```bash + python server.py + ``` + Or: + ```bash + uvicorn server:app --host 0.0.0.0 --port 8000 + ``` + +2. Update the IP address in `main.py` on your ESP32 to match your computer's IP address. + Look for `SERVER_IP` variable. + +## Features + +- Receives raw audio stream from ESP32. +- Saves raw audio to `received_audio.raw`. +- Converts 32-bit audio (from ICS-43434) to 16-bit audio (for MAX98357A). +- Streams processed audio back to ESP32 for playback. diff --git a/websocket_server/__pycache__/server.cpython-312.pyc b/websocket_server/__pycache__/server.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d9d5feeb05090d9a9aa244156aad2518de39909 GIT binary patch literal 12200 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 literal 0 HcmV?d00001 diff --git a/websocket_server/generate_font.py b/websocket_server/generate_font.py new file mode 100644 index 0000000..ba28aa5 --- /dev/null +++ b/websocket_server/generate_font.py @@ -0,0 +1,127 @@ +import struct +import freetype +import os + +# Font file and output file +FONT_FILE = "/Users/jeremygan/Desktop/python_dev/epaper2/websocket_server/GB2312.ttf" +OUTPUT_FILE = "/Users/jeremygan/Desktop/python_dev/epaper2/GB2312-16.bin" + +# Font size (16x16) +FONT_SIZE = 16 + +def create_gb2312_font(): + # Load the face + try: + face = freetype.Face(FONT_FILE) + except Exception as e: + print(f"Error loading font: {e}") + return + + # Set char size + face.set_pixel_sizes(FONT_SIZE, FONT_SIZE) + + print(f"Generating GB2312 font file: {OUTPUT_FILE}") + + with open(OUTPUT_FILE, 'wb') as f: + # Iterate through GB2312 code points + # Area: 0xA1 - 0xFE (161 - 254) -> 94 areas + # Index: 0xA1 - 0xFE (161 - 254) -> 94 chars per area + + count = 0 + total_chars = 94 * 94 + + # Buffer for empty char (32 bytes of 0x00) + empty_char = b'\x00' * 32 + + for area in range(0xA1, 0xFF): + for index in range(0xA1, 0xFF): + # Construct GB2312 code + gb_code = bytes([area, index]) + + try: + # Decode to unicode character + char = gb_code.decode('gb2312') + + # Load glyph + face.load_char(char, freetype.FT_LOAD_RENDER | freetype.FT_LOAD_TARGET_MONO) + bitmap = face.glyph.bitmap + + # Convert bitmap to 32 bytes (16x16 / 8) + # The bitmap.buffer is a flat list of bytes. + # For mono rendering, each byte is 0 or 255? No, it's packed? + # FT_LOAD_TARGET_MONO packs 8 pixels into 1 byte. + + # We need to ensure it's 16x16. + # Center the glyph in 16x16 box. + + glyph_width = bitmap.width + glyph_rows = bitmap.rows + glyph_pitch = bitmap.pitch + + # Create a 16x16 buffer (32 bytes) + char_buffer = bytearray(32) + + # Calculate offsets to center + x_off = (FONT_SIZE - glyph_width) // 2 + # Vertical alignment is tricky. Let's use bearing Y or just center based on rows. + # A better way is using face.glyph.bitmap_top + # But for fixed height font generation, usually we just center or align baseline. + # Let's try simple centering for now. + y_off = (FONT_SIZE - glyph_rows) // 2 + # Adjust y_off if it's too high/low? + # Let's align to baseline approximately. + # Usually baseline is at 12-13px for 16px font. + # face.size.ascender might help but let's stick to bitmap center for simplicity first. + + # Copy bitmap to buffer + src_buf = bitmap.buffer + + for row in range(glyph_rows): + # Target row + dst_row = row + y_off + if dst_row < 0 or dst_row >= FONT_SIZE: + continue + + # Source row bytes + # pitch is bytes per row + src_start = row * glyph_pitch + + # We need to copy bits. + # This is getting complicated because FreeType mono bitmap format + # might not match our target format exactly (MSB/LSB). + # Let's iterate pixels. + + for col in range(glyph_width): + dst_col = col + x_off + if dst_col < 0 or dst_col >= FONT_SIZE: + continue + + # Get pixel from src + byte_idx = src_start + (col >> 3) + bit_idx = 7 - (col & 7) + pixel = (src_buf[byte_idx] >> bit_idx) & 1 + + if pixel: + # Set pixel in dst + # format: row by row, 2 bytes per row. + # row 0: byte 0, byte 1 + # byte 0: bits 0-7 (left to right) -> wait, usually MSB is left. + dst_byte_idx = dst_row * 2 + (dst_col >> 3) + dst_bit_idx = 7 - (dst_col & 7) + char_buffer[dst_byte_idx] |= (1 << dst_bit_idx) + + f.write(char_buffer) + count += 1 + + except Exception: + # Character not found or decode error + f.write(empty_char) + + # Progress + if count % 1000 == 0: + print(f"Processed {count} characters...") + + print(f"Done! Generated {OUTPUT_FILE} with size {os.path.getsize(OUTPUT_FILE)} bytes.") + +if __name__ == "__main__": + create_gb2312_font() diff --git a/websocket_server/received_audio.mp3 b/websocket_server/received_audio.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..fb471c3a7d4a9f31fa9d42d431bb7f71c42cca7c GIT binary patch literal 11672 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 None: + print("ASR Session started") + + def on_close(self) -> None: + print("ASR Session closed") + + def on_event(self, result: RecognitionResult) -> None: + if result.get_sentence(): + text = result.get_sentence()['text'] + print(f"ASR Result: {text}") + # 将识别结果发送回客户端 + try: + asyncio.run_coroutine_threadsafe( + self.websocket.send_text(f"ASR:{text}"), + self.loop + ) + except Exception as e: + print(f"Failed to send ASR result to client: {e}") + +def process_chunk_32_to_16(chunk_bytes, gain=1.0): + processed_chunk = bytearray() + # Iterate 4 bytes at a time + for i in range(0, len(chunk_bytes), 4): + if i+3 < len(chunk_bytes): + # 取 chunk[i+2] 和 chunk[i+3] 组成 16-bit signed int + sample = struct.unpack_from(' 32767: sample = 32767 + elif sample < -32768: sample = -32768 + + # 重新打包为 16-bit little-endian + processed_chunk.extend(struct.pack('> 8) - 0xA0 + index = (code & 0xFF) - 0xA0 + + if area >= 1 and index >= 1: + offset = ((area - 1) * 94 + (index - 1)) * 32 + + # 读取字体文件 + # 注意:这里为了简单,每次都打开文件。如果并发高,应该缓存文件句柄或内容。 + # 假设字体文件在当前目录或上级目录 + # Prioritize finding the file in the script's directory + script_dir = os.path.dirname(os.path.abspath(__file__)) + font_path = os.path.join(script_dir, FONT_FILE) + + # Fallback: check one level up + if not os.path.exists(font_path): + font_path = os.path.join(script_dir, "..", FONT_FILE) + + # Fallback: check current working directory + if not os.path.exists(font_path): + font_path = FONT_FILE + + if os.path.exists(font_path): + print(f"Reading font from: {font_path} (Offset: {offset})") + 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:{hex_code}:{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})") + except Exception as e: + print(f"Error handling GET_FONT: {e}") + + elif "bytes" in message: + # 接收音频数据并追加到缓冲区 + data = message["bytes"] + audio_buffer.extend(data) + + # 实时处理并发送给 ASR + pcm_chunk = process_chunk_32_to_16(data, VOLUME_GAIN) + processed_buffer.extend(pcm_chunk) + + if recognition: + try: + recognition.send_audio_frame(pcm_chunk) + except Exception as e: + print(f"Error sending audio frame to ASR: {e}") + + except WebSocketDisconnect: + print("Client disconnected") + if recognition: + try: + recognition.stop() + except: + pass + except Exception as e: + print(f"Error: {e}") + if recognition: + try: + recognition.stop() + except: + pass + +if __name__ == "__main__": + # 获取本机IP,方便ESP32连接 + import socket + hostname = socket.gethostname() + local_ip = socket.gethostbyname(hostname) + print(f"Server running on ws://{local_ip}:8000/ws/audio") + + uvicorn.run(app, host="0.0.0.0", port=8000) diff --git a/websocket_server/test_font.py b/websocket_server/test_font.py new file mode 100644 index 0000000..090c972 --- /dev/null +++ b/websocket_server/test_font.py @@ -0,0 +1,55 @@ +import os + +FONT_FILE = "/Users/jeremygan/Desktop/python_dev/epaper2/websocket_server/GB2312-16.bin" + +def test_font(): + if not os.path.exists(FONT_FILE): + print(f"Error: File not found at {FONT_FILE}") + return + + file_size = os.path.getsize(FONT_FILE) + print(f"Font file size: {file_size} bytes") + + # Expected size for GB2312-16 (94x94 chars * 32 bytes) + expected_size = 94 * 94 * 32 + print(f"Expected size: {expected_size} bytes") + + if file_size != expected_size: + print(f"Warning: File size mismatch! (Diff: {file_size - expected_size})") + + # Try to render '中' (0xD6D0) + # Area: 0xD6 - 0xA0 = 54 + # Index: 0xD0 - 0xA0 = 48 + area = 0xD6 - 0xA0 + index = 0xD0 - 0xA0 + offset = ((area - 1) * 94 + (index - 1)) * 32 + + print(f"Testing character '中' (0xD6D0)") + print(f"Area: {area}, Index: {index}, Offset: {offset}") + + with open(FONT_FILE, "rb") as f: + f.seek(offset) + data = f.read(32) + + if len(data) != 32: + print("Error: Could not read 32 bytes") + return + + print("Bitmap data:") + for i in range(16): + # Each row is 2 bytes (16 bits) + byte1 = data[i*2] + byte2 = data[i*2+1] + + # Print as bits + line = "" + for b in range(8): + if (byte1 >> (7-b)) & 1: line += "##" + else: line += ".." + for b in range(8): + if (byte2 >> (7-b)) & 1: line += "##" + else: line += ".." + print(line) + +if __name__ == "__main__": + test_font()