[bug] board

This commit is contained in:
IrvingGao 2024-05-23 20:00:40 +08:00
parent 6a9edd9139
commit 2a298fb5e2
3 changed files with 113 additions and 46 deletions

View File

@ -3,7 +3,7 @@ import json
import time import time
import datetime import datetime
import requests import requests
import struct
from takway.common_utils import encode_bytes2str, decode_str2bytes from takway.common_utils import encode_bytes2str, decode_str2bytes
''' '''
@ -154,8 +154,10 @@ class BaseWebSocketClient:
recv_data = self.websocket.recv() recv_data = self.websocket.recv()
except websocket._exceptions.WebSocketConnectionClosedException: except websocket._exceptions.WebSocketConnectionClosedException:
return None, None return None, None
'''
try: try:
recv_data = json.loads(recv_data) recv_data = json.loads(recv_data)
#解析头信息,假设头信息前 8 个字节包含两个长度字段
except json.JSONDecodeError as e: except json.JSONDecodeError as e:
# print(f"JSONDecodeError: {e}") # print(f"JSONDecodeError: {e}")
# is_end = True # is_end = True
@ -163,4 +165,28 @@ class BaseWebSocketClient:
except Exception as e: except Exception as e:
# print(f"receive_per_data error: {e}") # print(f"receive_per_data error: {e}")
assert isinstance(recv_data, bytes), ValueError(f"Received data is not bytes, got {type(recv_data)}.") assert isinstance(recv_data, bytes), ValueError(f"Received data is not bytes, got {type(recv_data)}.")
return recv_data, type(recv_data) return recv_data, type(recv_data)
'''
try:
#解析头信息,假设头信息前 8 个字节包含两个长度字段
header = recv_data[:8]
text_length, audio_length = struct.unpack('!II', header)
#提取文本和二进制音频数据
text_bytes = recv_data[8:8 + text_length]
audio = recv_data[8 + text_length:8 + text_length + audio_length]
text = text_bytes.decode('utf-8')
print("Received text:",text)
#处理音频数据,例如播放音频
print("Received audio(length):",len(audio))
return [text, audio], list
except TypeError as e:
try:
recv_data = json.loads(recv_data)
print(f"json: {recv_data}")
return recv_data, type(recv_data)
except json.JSONDecodeError as e:
pass

View File

@ -398,19 +398,24 @@ class WebSocketClinet:
self.speaking_event.clear() self.speaking_event.clear()
break break
elif response['code'] == 200: elif response['code'] == 200:
self.audio_play_queue.put(('audio_json', response))
# 切换播放模式 # 切换播放模式
self.listening_event.clear() self.listening_event.clear()
self.speaking_event.set() self.speaking_event.set()
if response['type'] == 'close': if response['type'] == 'close':
break break
elif data_type == list:
# ####################### 更新后的代码 #
print(f"{datetime.now()}: receive audio_list")
self.audio_play_queue.put(('audio_list', response))
elif data_type == bytes: elif data_type == bytes:
# 开始播放 # 开始播放
print(f"{datetime.now()}: receive audio data") # print(f"{datetime.now()}: receive audio data")
print(f"listening_event: {self.listening_event.is_set()}, speaking_event: {self.speaking_event.is_set()}")
self.audio_play_queue.put(('audio_bytes', response)) self.audio_play_queue.put(('audio_bytes', response))
elif data_type == None: elif data_type == None:
print(f"{datetime.now()}: receive None data, break loop.") print(f"{datetime.now()}: receive None data, break loop.")
print(f"listening_event: {self.listening_event.is_set()}, speaking_event: {self.speaking_event.is_set()}") # print(f"listening_event: {self.listening_event.is_set()}, speaking_event: {self.speaking_event.is_set()}")
break # 如果没有接收到消息,则退出循环 break # 如果没有接收到消息,则退出循环
@ -430,51 +435,57 @@ class WebSocketClinet:
if not self.wakeup_event.is_set(): if not self.wakeup_event.is_set():
continue continue
audio_list.append(item[1]) if item[0] == 'audio_list':
print(f"{datetime.now()}: start playing audio.") # TODO: 判断bytes是否是最后一个如果是最后一个则播放完毕切换监听模式
audio_info, audio_data = item[1]
data_type = audio_info['type']
if self.listening_event.is_set():
continue
if not self.speaking_event.is_set():
continue
# 播放音频
try:
tts_audio = audio_list[0] # 取出第一个音频 print(f"{datetime.now()}: start playing audio.")
tts_audio = audio_player.check_audio_type(tts_audio, return_type=None)
for i in range(0, len(tts_audio), audio_player.CHUNK):
audio_player.stream.write(tts_audio[i:i+audio_player.CHUNK])
print("Playing {} data...{}/{}".format(item[0], i, len(tts_audio)))
# 按键打断播放
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: if self.listening_event.is_set():
audio_list = [] # 清空音频列表
continue continue
# 播放最后一段音频
audio_player.stream.write(tts_audio[i+audio_player.CHUNK:]) if not self.speaking_event.is_set():
audio_list.pop(0) # 弹出第一个音频 continue
print(f"{datetime.now()}: audio data played.")
except TypeError as e: audio_list.append(audio_data)
print(f"audio play error: {e}")
continue # 播放音频
try:
tts_audio = audio_list[0] # 取出第一个音频
tts_audio = audio_player.check_audio_type(tts_audio, return_type=None)
for i in range(0, len(tts_audio), audio_player.CHUNK):
audio_player.stream.write(tts_audio[i:i+audio_player.CHUNK])
print("Playing {} data...{}/{}".format(item[0], i, len(tts_audio)))
# 按键打断播放
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:
audio_list = [] # 清空音频列表
continue
# 播放最后一段音频
audio_player.stream.write(tts_audio[i+audio_player.CHUNK:])
audio_list.pop(0) # 弹出第一个音频
print(f"{datetime.now()}: audio data played.")
except TypeError as e:
print(f"audio play error: {e}")
continue
if self.wakeup_event.is_set():
if data_type == 'end':
# 启动监听状态
self.speaking_event.clear()
self.listening_event.set()
if self.wakeup_event.is_set():
# 启动监听状态
self.speaking_event.clear()
self.listening_event.set()

30
tools/easy_client.py Normal file
View File

@ -0,0 +1,30 @@
from takway.clients.client_utils import BaseWebSocketClient
from takway.audio_utils import AudioPlayer
if __name__ == '__main__':
server_url = 'ws://takway-ai.top:8001/chat/streaming/temporary'
session_id = '469f4a99-12a5-45a6-bc91-353df07423b6' # 新
client = BaseWebSocketClient(server_url, session_id)
client.wakeup_client()
wave_file = 'example_recording.wav'
player = AudioPlayer()
frames = player.load_audio_file(wave_file)
client.send_per_data(audio=frames, voice_synthesize=True, is_end=True, encoding='base64')
while True:
try:
response, data_type = client.receive_per_data()
print(response[0], len(response[1]))
except:
pass