[bug] board

This commit is contained in:
IrvingGao 2024-05-23 17:09:57 +08:00
parent 4c60b07df1
commit ebc7c9452c
1 changed files with 42 additions and 25 deletions

View File

@ -160,6 +160,12 @@ class WebSocketClinet:
pass pass
else: else:
self.wakeup_event.clear() self.wakeup_event.clear()
if self.interrupt_event.is_set():
self.speaking_event.clear()
self.listening_event.set()
self.interrupt_event.clear()
time.sleep(0.1) time.sleep(0.1)
def voice_trigger_thread(self, recorder): def voice_trigger_thread(self, recorder):
@ -313,8 +319,9 @@ class WebSocketClinet:
continue continue
print(f"web socket: {self.wakeup_event.is_set()}, {self.interrupt_event.is_set()}, {self.listening_event.is_set()}") print(f"web socket: {self.wakeup_event.is_set()}, {self.interrupt_event.is_set()}, {self.listening_event.is_set()}")
print(f"{datetime.now()}: start setup web socket connection.") print(f"{datetime.now()}: start setup web socket connection.")
# 唤醒
if self.wakeup_event.is_set() and not self.interrupt_event.is_set(): # 第一级:唤醒状态下,连接服务器
if self.wakeup_event.is_set():
client.wakeup_client() client.wakeup_client()
clear_queue_flag = False clear_queue_flag = False
else: else:
@ -325,14 +332,17 @@ class WebSocketClinet:
# 发送数据 # 发送数据
for queue_data in QueueIterator(self.client_queue): for queue_data in QueueIterator(self.client_queue):
# 当唤醒状态被关闭时,退出循环; 当被打断时,退出循环 # 当唤醒状态被关闭时,退出循环
if not self.wakeup_event.is_set() or self.interrupt_event.is_set(): if not self.wakeup_event.is_set():
clear_queue_flag = True self.listening_event.clear()
self.speaking_event.clear()
if clear_queue_flag:
client.close_client() client.close_client()
break break
# 播放时不得发送数据,默认废消息
if self.speaking_event.is_set() and not self.listening_event.is_set():
break
# 发送音频数据 # 发送音频数据
if queue_data[0] == 'audio': if queue_data[0] == 'audio':
audio_dict = queue_data[1] audio_dict = queue_data[1]
@ -345,14 +355,27 @@ class WebSocketClinet:
encoding='base64', encoding='base64',
) )
if clear_queue_flag: if not self.wakeup_event.is_set():
continue continue
# 等待播放 # 切换播放模式
self.listening_event.clear() self.listening_event.clear()
self.speaking_event.set()
# 接收数据 # 接收数据
while True: while True:
# 当唤醒状态被关闭时,退出循环
if not self.wakeup_event.is_set():
self.listening_event.clear()
self.speaking_event.clear()
client.close_client()
break
# 当正在说话时接收到时,默认全是废消息
if self.listening_event.is_set() and not self.speaking_event.is_set():
client.close_client()
break
response, data_type = client.receive_per_data() response, data_type = client.receive_per_data()
if data_type == dict: if data_type == dict:
print(f"{datetime.now()}: receive json data: {response}") # 打印接收到的消息 print(f"{datetime.now()}: receive json data: {response}") # 打印接收到的消息
@ -362,9 +385,6 @@ class WebSocketClinet:
continue continue
elif data_type == bytes: elif data_type == bytes:
# 开始播放 # 开始播放
if self.listening_event.is_set():
self.speaking_event.set()
self.listening_event.clear()
print(f"{datetime.now()}: receive audio data") print(f"{datetime.now()}: receive audio data")
self.audio_play_queue.put(('audio_bytes', response)) self.audio_play_queue.put(('audio_bytes', response))
elif data_type == None: elif data_type == None:
@ -388,19 +408,17 @@ class WebSocketClinet:
if not self.wakeup_event.is_set(): if not self.wakeup_event.is_set():
continue continue
# 打断状态 audio_list.append(item[1])
if self.interrupt_event.is_set(): print(f"{datetime.now()}: start playing audio.")
self.listening_event.set()
self.speaking_event.clear()
if self.listening_event.is_set():
# 停止播放状态 continue
if not self.speaking_event.is_set(): if not self.speaking_event.is_set():
assert self.listening_event.is_set(), f"speaking event is not set, got wakeup_event [{self.wakeup_event.is_set()}], interrupt_event [{self.interrupt_event.is_set()}], listening_event [{self.listening_event.is_set()}]"
continue continue
# 播放音频 # 播放音频
audio_list.append(item[1])
print(f"{datetime.now()}: start playing audio.")
try: try:
tts_audio = audio_list[0] # 取出第一个音频 tts_audio = audio_list[0] # 取出第一个音频
@ -410,18 +428,17 @@ class WebSocketClinet:
print("Playing {} data...{}/{}".format(item[0], i, len(tts_audio))) print("Playing {} data...{}/{}".format(item[0], i, len(tts_audio)))
# 按键打断播放 # 按键打断播放
if self.interrupt_event.is_set(): if self.listening_event.is_set() and not self.speaking_event.is_set():
self.listening_event.set() print(f"{datetime.now()}: speaker interrupt.")
self.speaking_event.clear()
break break
# 关闭状态 # 关闭状态
if not self.wakeup_event.is_set(): if not self.wakeup_event.is_set():
print(f"{datetime.now()}: speaker close.")
self.listening_event.clear() self.listening_event.clear()
self.speaking_event.clear() self.speaking_event.clear()
break break
if not self.speaking_event: if not self.speaking_event:
print(f"{datetime.now()}: speaker interrupt.")
audio_list = [] # 清空音频列表 audio_list = [] # 清空音频列表
continue continue
# 播放最后一段音频 # 播放最后一段音频