mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-25 16:43:55 +08:00
fix: prevent duplicate TTS when LLM streams text before tool call
This commit is contained in:
@@ -1082,11 +1082,12 @@ class ConnectionHandler:
|
|||||||
f"工具调用统计更新: 当前轮次={current_turn}"
|
f"工具调用统计更新: 当前轮次={current_turn}"
|
||||||
)
|
)
|
||||||
|
|
||||||
# 如需要大模型先处理一轮,添加相关处理后的日志情况
|
# LLM 流式阶段已播报过的文本
|
||||||
|
streamed_text = ""
|
||||||
if len(response_message) > 0:
|
if len(response_message) > 0:
|
||||||
text_buff = "".join(response_message)
|
streamed_text = "".join(response_message)
|
||||||
self.tts_MessageText = text_buff
|
self.tts_MessageText = streamed_text
|
||||||
self.dialogue.put(Message(role="assistant", content=text_buff))
|
self.dialogue.put(Message(role="assistant", content=streamed_text))
|
||||||
response_message.clear()
|
response_message.clear()
|
||||||
|
|
||||||
# 收集所有工具调用的 Future
|
# 收集所有工具调用的 Future
|
||||||
@@ -1134,7 +1135,7 @@ class ConnectionHandler:
|
|||||||
|
|
||||||
# 统一处理工具调用结果
|
# 统一处理工具调用结果
|
||||||
if tool_results:
|
if tool_results:
|
||||||
self._handle_function_result(tool_results, depth=depth)
|
self._handle_function_result(tool_results, depth=depth, streamed_text=streamed_text)
|
||||||
|
|
||||||
# 存储对话内容
|
# 存储对话内容
|
||||||
if len(response_message) > 0:
|
if len(response_message) > 0:
|
||||||
@@ -1194,7 +1195,7 @@ class ConnectionHandler:
|
|||||||
result = "、".join(datas)
|
result = "、".join(datas)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def _handle_function_result(self, tool_results, depth):
|
def _handle_function_result(self, tool_results, depth, streamed_text=""):
|
||||||
need_llm_tools = []
|
need_llm_tools = []
|
||||||
|
|
||||||
for result, tool_call_data in tool_results:
|
for result, tool_call_data in tool_results:
|
||||||
@@ -1202,9 +1203,14 @@ class ConnectionHandler:
|
|||||||
Action.RESPONSE,
|
Action.RESPONSE,
|
||||||
Action.NOTFOUND,
|
Action.NOTFOUND,
|
||||||
Action.ERROR,
|
Action.ERROR,
|
||||||
]: # 直接回复前端
|
]:
|
||||||
text = result.response if result.response else result.result
|
text = result.response if result.response else result.result
|
||||||
self.tts.tts_one_sentence(self, ContentType.TEXT, content_detail=text)
|
if streamed_text:
|
||||||
|
self.logger.bind(tag=TAG).debug(
|
||||||
|
f"Skipping duplicate TTS for tool {tool_call_data['name']}, already streamed"
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
self.tts.tts_one_sentence(self, ContentType.TEXT, content_detail=text)
|
||||||
self.dialogue.put(Message(role="assistant", content=text))
|
self.dialogue.put(Message(role="assistant", content=text))
|
||||||
elif result.action == Action.REQLLM:
|
elif result.action == Action.REQLLM:
|
||||||
# 收集需要 LLM 处理的工具
|
# 收集需要 LLM 处理的工具
|
||||||
|
|||||||
Reference in New Issue
Block a user