2025-05-27 15:46:31 +08:00

106 lines
4.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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...")