From ebc7c9452c601ceba25df1a61d1f2d7392ec9555 Mon Sep 17 00:00:00 2001 From: IrvingGao <1729854488@qq.com> Date: Thu, 23 May 2024 17:09:57 +0800 Subject: [PATCH] [bug] board --- takway/clients/web_socket_client_utils.py | 67 ++++++++++++++--------- 1 file changed, 42 insertions(+), 25 deletions(-) diff --git a/takway/clients/web_socket_client_utils.py b/takway/clients/web_socket_client_utils.py index 016c38c..ae4f6dd 100644 --- a/takway/clients/web_socket_client_utils.py +++ b/takway/clients/web_socket_client_utils.py @@ -160,6 +160,12 @@ class WebSocketClinet: pass else: 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) def voice_trigger_thread(self, recorder): @@ -313,8 +319,9 @@ class WebSocketClinet: continue 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.") - # 唤醒 - if self.wakeup_event.is_set() and not self.interrupt_event.is_set(): + + # 第一级:唤醒状态下,连接服务器 + if self.wakeup_event.is_set(): client.wakeup_client() clear_queue_flag = False else: @@ -325,14 +332,17 @@ class WebSocketClinet: # 发送数据 for queue_data in QueueIterator(self.client_queue): - # 当唤醒状态被关闭时,退出循环; 当被打断时,退出循环 - if not self.wakeup_event.is_set() or self.interrupt_event.is_set(): - clear_queue_flag = True - - if clear_queue_flag: + # 当唤醒状态被关闭时,退出循环 + if not self.wakeup_event.is_set(): + self.listening_event.clear() + self.speaking_event.clear() client.close_client() break + # 播放时不得发送数据,默认废消息 + if self.speaking_event.is_set() and not self.listening_event.is_set(): + break + # 发送音频数据 if queue_data[0] == 'audio': audio_dict = queue_data[1] @@ -345,14 +355,27 @@ class WebSocketClinet: encoding='base64', ) - if clear_queue_flag: + if not self.wakeup_event.is_set(): continue - # 等待播放 + # 切换播放模式 self.listening_event.clear() + self.speaking_event.set() # 接收数据 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() if data_type == dict: print(f"{datetime.now()}: receive json data: {response}") # 打印接收到的消息 @@ -362,9 +385,6 @@ class WebSocketClinet: continue 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") self.audio_play_queue.put(('audio_bytes', response)) elif data_type == None: @@ -388,19 +408,17 @@ class WebSocketClinet: if not self.wakeup_event.is_set(): continue - # 打断状态 - if self.interrupt_event.is_set(): - self.listening_event.set() - self.speaking_event.clear() - - # 停止播放状态 + audio_list.append(item[1]) + print(f"{datetime.now()}: start playing audio.") + + + if self.listening_event.is_set(): + continue + 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 # 播放音频 - audio_list.append(item[1]) - print(f"{datetime.now()}: start playing audio.") try: tts_audio = audio_list[0] # 取出第一个音频 @@ -410,18 +428,17 @@ class WebSocketClinet: print("Playing {} data...{}/{}".format(item[0], i, len(tts_audio))) # 按键打断播放 - if self.interrupt_event.is_set(): - self.listening_event.set() - self.speaking_event.clear() + if self.listening_event.is_set() and not self.speaking_event.is_set(): + print(f"{datetime.now()}: speaker interrupt.") break # 关闭状态 if not self.wakeup_event.is_set(): + print(f"{datetime.now()}: speaker close.") self.listening_event.clear() self.speaking_event.clear() break if not self.speaking_event: - print(f"{datetime.now()}: speaker interrupt.") audio_list = [] # 清空音频列表 continue # 播放最后一段音频