diff --git a/src/chat/emoji_system/emoji_manager.py b/src/chat/emoji_system/emoji_manager.py index 60c70bb26..22ec31538 100644 --- a/src/chat/emoji_system/emoji_manager.py +++ b/src/chat/emoji_system/emoji_manager.py @@ -969,7 +969,7 @@ class EmojiManager: image_base64_frames = get_image_manager().transform_gif(image_base64) if not image_base64_frames: raise RuntimeError("GIF表情包转换失败") - prompt = "这是一个GIF动图表情包的关键帧。请用不超过250字,详细描述它的核心内容:1. 动态画面展现了什么变化?2. 它传达了什么核心情绪或玩的是什么梗?3. 通常在什么场景下使用?请确保描述既包含关键信息,又能充分展现其内涵。重要规则:如果图片中包含清晰的文字,请务必完整地转述出来,这部分文字不计入250字限制。" + prompt = "这是一个GIF动图表情包的关键帧。请用不超过250字,进行详尽且严谨的描述。请按照以下结构组织:首先,概括图片的主题和整体氛围。其次,详细描述图片中的核心元素,如果包含二次元角色,请尝试识别角色名称和出处。接着,描述动态画面展现了什么变化,以及它传达的核心情绪或玩的梗。最后,如果图片中包含任何文字,请准确地转述出来,这部分不计入字数限制。请特别注意识别网络文化中的特殊含义,例如,“滑稽”表情应被识别为“滑稽”,而不仅仅是“黄色的脸”。" description = None for i in range(3): try: @@ -985,7 +985,7 @@ class EmojiManager: logger.warning("表情包识别失败,将在1秒后重试...") await asyncio.sleep(1) else: - prompt = "这是一个表情包。请用不超过250字,详细描述它的核心内容:1. 画面描绘了什么?2. 它传达了什么核心情绪或玩的是什么梗?3. 通常在什么场景下使用?请确保描述既包含关键信息,又能充分展现其内涵。重要规则:如果图片中包含清晰的文字,请务必完整地转述出来,这部分文字不计入250字限制。" + prompt = "这是一个表情包。请用不超过250字,进行详尽且严谨的描述。请按照以下结构组织:首先,概括图片的主题和整体氛围。其次,详细描述图片中的核心元素,如果包含二次元角色,请尝试识别角色名称和出处。接着,描述它传达的核心情绪或玩的梗。最后,如果图片中包含任何文字,请准确地转述出来,这部分不计入字数限制。请特别注意识别网络文化中的特殊含义,例如,“滑稽”表情应被识别为“滑稽”,而不仅仅是“黄色的脸”。" description = None for i in range(3): try: @@ -1058,7 +1058,7 @@ class EmojiManager: if emotions: # 只有在成功提取关键词后才进行精炼 logger.info("[自然语言精炼] 开始生成“点睛之笔”的自然语言描述") refine_prompt = f""" - 你的任务是为一张表情包生成一句简洁的精炼描述,用于后续的AI模型处理。 + 你的任务是为一张表情包生成一句自然的、包含核心信息的精炼描述。 这里是关于这个表情包的分析信息: # 详细描述 @@ -1068,17 +1068,18 @@ class EmojiManager: {emotions_text} # 你的任务 - 请结合以上所有信息,用一句话概括出这个表情包的核心内容,既要描述客观事实,也要点明其传达的核心情绪。 + 请结合以上所有信息,用一句自然的语言,概括出这个表情包的核心内容。 # 规则 (非常重要!) - 1. **平衡客观与情感**:首先客观描述画面中的主体、表情和动作,然后点出其最主要的情绪(如:喜悦、悲伤、讽刺等)。 - 2. **包含核心文字**:如果表情包中有文字,必须将文字完整地包含在描述中。 - 3. **简洁精炼**:用最少的文字概括最多的信息。 - 4. **输出格式**:**请直接返回这句描述,不要添加任何前缀、标题、引号或多余的解释。** + 1. **自然流畅**:描述应该像一个普通人看到图片后的自然反应,而不是生硬的机器分析。 + 2. **包含关键信息**:如果详细描述中识别出了角色名称、出处,必须包含在精炼描述中。 + 3. **体现情绪**:描述需要体现出表情包传达的核心情绪。 + 4. **包含核心文字**:如果表情包中有文字,必须将文字完整地包含在描述中。 + 5. **输出格式**:**请直接返回这句描述,不要添加任何前缀、标题、引号或多余的解释。** 示例: - - 原始信息:一只猫戴着墨镜,关键词是“酷、得意”。 - - 正确输出:一只戴着黑色墨镜的猫,表情得意。 + - 详细描述:“图片的核心是一位面带微笑的少女,她被识别为游戏《崩坏3rd》中的角色爱莉希雅(Elysia)...” + - 正确输出:游戏《崩坏3rd》中的角色爱莉希雅,她面带微笑,看起来很开心。 """ refined_description, _ = await self.llm_emotion_judge.generate_response_async( refine_prompt, temperature=0.7, max_tokens=100 diff --git a/src/plugins/built_in/tts_voice_plugin/actions/tts_action.py b/src/plugins/built_in/tts_voice_plugin/actions/tts_action.py index bd99e784b..9ea6a87f3 100644 --- a/src/plugins/built_in/tts_voice_plugin/actions/tts_action.py +++ b/src/plugins/built_in/tts_voice_plugin/actions/tts_action.py @@ -75,7 +75,8 @@ class TTSVoiceAction(BaseAction): """ try: if not self.tts_service: - raise RuntimeError("TTSService 未注册或初始化失败") + logger.error(f"{self.log_prefix} TTSService 未注册或初始化失败,静默处理。") + return False, "TTSService 未注册或初始化失败" initial_text = self.action_data.get("text", "").strip() voice_style = self.action_data.get("voice_style", "default") @@ -84,7 +85,7 @@ class TTSVoiceAction(BaseAction): # 1. 请求主回复模型生成高质量文本 text = await self._generate_final_text(initial_text) if not text: - await self.send_text("❌ 语音合成出错:最终生成的文本为空。") + logger.warning(f"{self.log_prefix} 最终生成的文本为空,静默处理。") return False, "最终生成的文本为空" # 2. 调用 TTSService 生成语音 @@ -99,11 +100,19 @@ class TTSVoiceAction(BaseAction): ) return True, f"成功生成并发送语音,文本长度: {len(text)}字符" else: - await self._handle_error_and_reply("tts_api_error", Exception("TTS服务未能返回音频数据")) + logger.error(f"{self.log_prefix} TTS服务未能返回音频数据,静默处理。") + await self.store_action_info( + action_prompt_display="语音合成失败: TTS服务未能返回音频数据", + action_done=False + ) return False, "语音合成失败" except Exception as e: - await self._handle_error_and_reply("generic_error", e) + logger.error(f"{self.log_prefix} 语音合成过程中发生未知错误: {e!s}", exc_info=True) + await self.store_action_info( + action_prompt_display=f"语音合成失败: {e!s}", + action_done=False + ) return False, f"语音合成出错: {e!s}" async def _generate_final_text(self, initial_text: str) -> str: @@ -136,39 +145,3 @@ class TTSVoiceAction(BaseAction): except Exception as e: logger.error(f"{self.log_prefix} 生成高质量回复内容时失败: {e}", exc_info=True) return "" - - async def _handle_error_and_reply(self, error_context: str, exception: Exception): - """处理错误并生成一个动态的、拟人化的回复""" - logger.error(f"{self.log_prefix} 在 {error_context} 阶段出错: {exception}", exc_info=True) - - error_prompts = { - "generic_error": { - "raw_reply": "糟糕,我的思路好像缠成一团毛线球了,需要一点时间来解开...你能耐心等我一下吗?", - "reason": f"客观原因:插件在执行时发生了未知异常。详细信息: {exception!s}" - }, - "tts_api_error": { - "raw_reply": "我的麦克风好像有点小情绪,突然不想工作了...我正在哄它呢,请稍等片刻哦!", - "reason": f"客观原因:语音合成服务返回了一个错误。详细信息: {exception!s}" - } - } - prompt_data = error_prompts.get(error_context, error_prompts["generic_error"]) - - try: - success, result_message, _ = await generator_api.rewrite_reply( - chat_stream=self.chat_stream, - raw_reply=prompt_data["raw_reply"], - reason=prompt_data["reason"] - ) - if success and result_message: - message_text = "".join(str(seg[1]) if isinstance(seg, tuple) else str(seg) for seg in result_message).strip() - await self.send_text(message_text) - else: - await self.send_text("哎呀,好像出了一点小问题,我稍后再试试吧~") - except Exception as gen_e: - logger.error(f"生成动态错误回复时也出错了: {gen_e}", exc_info=True) - await self.send_text("唔...我的思路好像卡壳了,请稍等一下哦!") - - await self.store_action_info( - action_prompt_display=f"语音合成失败: {exception!s}", - action_done=False - )