feat: add character regeneration endpoint and integrate emotion limits for AI-generated scripts
This commit is contained in:
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user