106 lines
4.1 KiB
Python
106 lines
4.1 KiB
Python
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...")
|