update: 更新了进入沉默模式的功能

This commit is contained in:
killua4396 2024-06-12 22:56:39 +08:00
parent 76c7adc1b5
commit 34f3fd62f5
4 changed files with 34 additions and 0 deletions

View File

@ -2,6 +2,8 @@ from abc import ABC, abstractmethod
#------ 抽象 ASR, LLM, TTS 类 ------ #
class ASR(ABC):
def __init__(self):
self.is_slience = False
@abstractmethod
async def stream_recognize(self, chunk):
pass

View File

@ -29,6 +29,7 @@ LAST_FRAME =3
class XF_ASR(ASR):
def __init__(self):
super().__init__()
self.websocket = None
self.current_message = ""
self.audio = ""
@ -58,6 +59,16 @@ class XF_ASR(ASR):
self.current_message += parse_xfasr_recv(json.loads(await self.websocket.recv()))
if self.current_message == "":
raise AsrResultNoneError()
if "进入沉默模式" in self.current_message:
self.is_slience = True
asyncio.create_task(self.websocket.close())
raise EnterSlienceMode()
if "退出沉默模式" in self.current_message:
self.is_slience = False
self.current_message = "已退出沉默模式"
if self.is_slience:
asyncio.create_task(self.websocket.close())
raise SlienceMode()
asyncio.create_task(self.websocket.close())
return [{"text":self.current_message, "audio":self.audio}]
@ -145,6 +156,9 @@ class VOLCENGINE_LLM(LLM):
model = model,
messages=messages,
stream=True,
temperature=llm_info['temperature'],
top_p=llm_info['top_p'],
max_tokens=llm_info['max_tokens'],
stream_options={'include_usage': True}
)
for chunk in stream:

View File

@ -51,3 +51,15 @@ class LLMResponseEnd(Exception):
def __init__(self, message="LLM Response End!"):
super().__init__(message)
self.message = message
# 进入静音模式(非异常)
class EnterSlienceMode(Exception):
def __init__(self, message="Enter Slience Mode!"):
super().__init__(message)
self.message = message
# 处于静音模式(非异常)
class SlienceMode(Exception):
def __init__(self, message="Slience Mode!"):
super().__init__(message)
self.message = message

View File

@ -221,6 +221,12 @@ async def streaming_chat(ws: WebSocket,db=Depends(get_db)):
agent.recorder.output_text = llm_text
agent.save()
logger.debug("音频保存成功")
except EnterSlienceMode:
tts_audio = agent.synthetize(assistant, "已进入沉默模式", db)
await ws.send_bytes(agent.encode("已进入沉默模式", tts_audio))
await ws.send_text(json.dumps({"type":"info","code":201,"msg":"进入沉默模式"}, ensure_ascii=False))
except SlienceMode:
await ws.send_text(json.dumps({"type":"info","code":201,"msg":"处于沉默模式"}, ensure_ascii=False))
except AsrResultNoneError:
await ws.send_text(json.dumps({"type":"error","code":501,"msg":"asr结果为空"}, ensure_ascii=False))
except AbnormalLLMFrame as e: