import socket import threading class Awaker: def __init__(self, host="127.0.0.1", port=8767, callback=None): """ 初始化 Awaker 类。 :param host: 主机地址 (默认: 127.0.0.1) :param port: 端口号 (默认: 8767) :param callback: 当检测到唤醒信号时调用的回调函数 (默认: None) """ self.host = host self.port = port self.server = None self.interrupted = False # 控制服务器运行状态的变量 self.callback = callback # 回调函数 self.UI_recognizing=False def play_default_audio(self): """ 默认音频播放行为。 """ print("Playing default audio...") def start_server(self,callback): """ 启动监听服务器以捕获唤醒信号。 """ self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server.bind((self.host, self.port)) self.server.listen(1) print(f"Server started. Listening on {self.host}:{self.port}...") try: while not self.interrupted: # 检查 self.interrupted 是否为 True self.server.settimeout(1) # 设置超时时间以便及时检查 interrupted try: conn, addr = self.server.accept() except socket.timeout: continue # 超时后继续检查 self.interrupted with conn: print(f"Connected by {addr}") try: data = conn.recv(1024) if data: signal_data = data.decode('utf-8') print(f"Wakeup Signal Received: {signal_data}") self.handle_signal(signal_data) if signal_data=="WAKEUP_TRIGGER": if not self.UI_recognizing: threading.Thread(target=callback).start() # callback() # 调用回调函数 else: print("UI按着说话呢,不执行唤醒后的回调函数") elif signal_data=="INIT_SUCCESS": print("语音唤醒初始化成功") else: self.play_default_audio() except ConnectionResetError: print("Connection was reset. Waiting for new connections.") except Exception as e: print(f"Error processing connection: {e}") except KeyboardInterrupt: print("Shutting down server due to keyboard interrupt...") finally: self.stop_server() def handle_signal(self, signal_data): """ 处理接收到的唤醒信号。 子类可以重写此方法以定义自定义行为。 :param signal_data: 接收到的信号数据 (字符串形式) """ print("Triggering default action for signal:", signal_data) if signal_data=="UI_recognizing": self.UI_recognizing=True if signal_data=="UI_not_recognizing": self.UI_recognizing=False def stop_server(self): """ 停止服务器并释放资源。 """ self.interrupted = True if self.server: self.server.close() print("Server stopped.") # 自定义回调函数示例 def custom_callback(): print(f"Custom callback triggered! Signal: {1}") # 在这里添加自定义逻辑,例如播放音频、记录日志等 print("Performing custom actions based on the wakeup signal...") # 如果直接运行此脚本,则启动 Awaker 监听器 if __name__ == "__main__": awaker = Awaker(host="127.0.0.1", port=8767, callback=custom_callback) # 启动服务器 try: awaker.start_server(custom_callback) except KeyboardInterrupt: # 在终端按 Ctrl+C 可停止服务器 awaker.interrupted = True print("Server interrupted and stopping...")