feat: 将百炼websocket的连接逻辑封装到文件 BaiLianVoiceRecogniseSocket中
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import json
|
||||
from typing import Callable, TypedDict
|
||||
from traceback import print_stack
|
||||
from typing import Callable, TypedDict, Awaitable
|
||||
|
||||
import websockets
|
||||
from websockets.client import ClientConnection
|
||||
@@ -33,13 +34,15 @@ class BaiLianVoiceRecogniseSocket:
|
||||
enable_server_vad: bool = True,
|
||||
|
||||
# 监听开始说话动作,参数为item_id
|
||||
on_speech_started: Callable[[str], None] | None = None,
|
||||
on_speech_started: Callable[[str], Awaitable[None]] | None = None,
|
||||
# 监听正在说话的内容,参数为item_id以及本次说话叠加的完整内容
|
||||
on_speech_content: Callable[[str, str], None] | None = None,
|
||||
on_speech_content: Callable[[str, str], Awaitable[None]] | None = None,
|
||||
# 监听说话结束动作,参数为item_id
|
||||
on_speech_stopped: Callable[[str], None] | None = None,
|
||||
on_speech_stopped: Callable[[str], Awaitable[None]] | None = None,
|
||||
# 监听说话完毕动作,参数为item_id以及本次说话万恒内容
|
||||
on_speech_completed: Callable[[str, str], None] | None = None
|
||||
on_speech_completed: Callable[[str, str], Awaitable[None]] | None = None,
|
||||
# 连接错误处理
|
||||
on_connect_error: Callable[[Exception], Awaitable[None]] | None = None,
|
||||
):
|
||||
"""
|
||||
构造函数,会自动设置连接百炼实时语音识别websocket接口所需要的秘钥,模型名称,websocket接口地址,以及可选的附加头信息
|
||||
@@ -54,6 +57,7 @@ class BaiLianVoiceRecogniseSocket:
|
||||
self.on_speech_content = on_speech_content
|
||||
self.on_speech_stopped = on_speech_stopped
|
||||
self.on_speech_completed = on_speech_completed
|
||||
self.on_connect_error = on_connect_error
|
||||
|
||||
socket: ClientConnection | None = None
|
||||
self.socket = socket
|
||||
@@ -119,32 +123,47 @@ class BaiLianVoiceRecogniseSocket:
|
||||
}
|
||||
}
|
||||
if self.enable_server_vad:
|
||||
self.log(f"send session.update event: {json.dumps(event_vad, indent=2)}")
|
||||
self.socket.send(json.dumps(event_vad))
|
||||
await self.socket.send(json.dumps(event_vad))
|
||||
else:
|
||||
self.log(f"send session.update event: {json.dumps(event_manual, indent=2)}")
|
||||
self.socket.send(json.dumps(event_manual))
|
||||
await self.socket.send(json.dumps(event_manual))
|
||||
|
||||
async def waiting_message_from_socket(self):
|
||||
"""将百炼识别结果转发到客户端"""
|
||||
try:
|
||||
async for message in self.socket:
|
||||
data = json.loads(message)
|
||||
print("data", data)
|
||||
|
||||
message_data_type = data.get('type', None)
|
||||
message_data_item_id = data.get('item_id', None)
|
||||
|
||||
if message_data_type == "input_audio_buffer.speech_started":
|
||||
self.on_speech_started(message_data_item_id)
|
||||
await self.on_speech_started(message_data_item_id)
|
||||
if message_data_type == "conversation.item.input_audio_transcription.text":
|
||||
self.on_speech_content(message_data_item_id, data.get('stash', ""))
|
||||
await self.on_speech_content(message_data_item_id, data.get('stash', ""))
|
||||
if message_data_type == "input_audio_buffer.speech_stopped":
|
||||
self.on_speech_stopped(message_data_item_id)
|
||||
await self.on_speech_stopped(message_data_item_id)
|
||||
if message_data_type == "conversation.item.input_audio_transcription.completed":
|
||||
self.on_speech_completed(message_data_item_id, data.get('transcript', ""))
|
||||
await self.on_speech_completed(message_data_item_id, data.get('transcript', ""))
|
||||
|
||||
except Exception as e:
|
||||
print_stack(e)
|
||||
print(f"等待百炼的消息出错: {e}")
|
||||
await self.on_connect_error(e)
|
||||
|
||||
async def close(self):
|
||||
"""
|
||||
关闭websocket连接
|
||||
"""
|
||||
if self.socket:
|
||||
try:
|
||||
print("准备关闭百炼websocket")
|
||||
await self.socket.close()
|
||||
print("百炼websocket已经关闭")
|
||||
except:
|
||||
pass
|
||||
finally:
|
||||
self.socket = None
|
||||
|
||||
|
||||
class BaiLianRecogniseMessage(TypedDict):
|
||||
|
||||
Reference in New Issue
Block a user