feat: add character regeneration endpoint and integrate emotion limits for AI-generated scripts

This commit is contained in:
2026-03-13 13:58:01 +08:00
parent 0a12f204ba
commit 16947d6b8b
4 changed files with 128 additions and 16 deletions

View File

@@ -319,6 +319,29 @@ class LLMService:
result = await self.stream_chat_json(system_prompt, user_message, max_tokens=4096, usage_callback=usage_callback)
return result.get("chapters", [])
@staticmethod
def _emotion_limits(violence_level: int, eroticism_level: int) -> tuple[str, str]:
v = violence_level / 10
e = eroticism_level / 10
female_happy = round(0.35 + 0.45 * e, 2)
angry = round(0.15 + 0.65 * v, 2)
sad = round(0.10 + 0.40 * v, 2)
fear = round(0.10 + 0.60 * v, 2)
hate = round(0.35 + 0.25 * max(v, e), 2)
low = round(0.35 + 0.45 * e, 2)
surprise= round(0.10 + 0.40 * max(v, e), 2)
limits = (
f"愤怒={angry}、悲伤={sad}、恐惧={fear}、厌恶={hate}、低沉={low}、惊讶={surprise}"
f"开心:男性角色上限=0.35,女性角色上限={female_happy}"
)
guidance_parts = []
if violence_level >= 4:
guidance_parts.append(f"暴力程度{violence_level}/10台词中的愤怒、恐惧、悲伤情绪必须强烈外露不得克制")
if eroticism_level >= 4:
guidance_parts.append(f"色情程度{eroticism_level}/10女性台词中的开心、低沉、挑逗情绪应充分表达")
guidance = "".join(guidance_parts)
return limits, guidance
async def generate_chapter_script(
self,
genre: str,
@@ -334,6 +357,19 @@ class LLMService:
) -> str:
char_names = [c.get("name", "") for c in characters if c.get("name") not in ("narrator", "旁白")]
names_str = "".join(char_names)
limits_str, emo_guidance = self._emotion_limits(violence_level, eroticism_level)
emo_guidance_line = f"- {emo_guidance}\n" if emo_guidance else ""
max_level = max(violence_level, eroticism_level)
if max_level >= 9:
narrator_rule = "- 旁白全程必须主动标注情感,强烈场景情感需饱满,不得留空\n"
elif max_level >= 7:
narrator_rule = "- 旁白在激烈/情欲场景中必须添加情感标注,其余场景也应酌情标注\n"
elif max_level >= 5:
narrator_rule = "- 旁白在激烈/情欲场景中应添加情感标注,平淡过渡段落可省略\n"
elif max_level >= 3:
narrator_rule = "- 旁白在情绪明显的场景中可适当添加情感标注\n"
else:
narrator_rule = "- 旁白叙述一般不需要情感标注\n"
system_prompt = (
"你是一个专业的有声书剧本创作助手。请根据章节信息创作完整的对话脚本。\n\n"
"输出格式规则(严格遵守):\n"
@@ -342,10 +378,11 @@ class LLMService:
" 【角色名】\"对话内容\"(情感词:强度)\n\n"
"情感标注规则:\n"
"- 情感词可选:开心、愤怒、悲伤、恐惧、厌恶、低沉、惊讶\n"
"- 各情感强度上限(严格不超过):开心=0.35、愤怒=0.15、悲伤=0.1、恐惧=0.1、厌恶=0.35、低沉=0.35、惊讶=0.1\n"
f"- 各情感强度上限(严格不超过):{limits_str}\n"
"- 情感不明显时可省略(情感词:强度)整个括号\n"
"- 旁白叙述一般不需要情感标注\n\n"
"其他规则:\n"
+ narrator_rule
+ emo_guidance_line
+ "\n其他规则:\n"
"- 旁白使用【旁白】标记\n"
f"- 主要角色名从以下列表选择:{names_str}\n"
"- 若剧情需要路人/群众/配角台词,可使用简短中文描述性名称(如:路人甲、镇民、警察、店员等),不必限于主角列表\n"