feat: 封面图提示词改为用 LLM 从故事内容提炼 ≤50 字画面描述
新增 _extract_image_description:调用豆包 LLM 提取故事的主体、 场景与核心事件,串联成一幅画的描述(≤50字),再拼接风格前缀后 送入 Seedream 4.5 文生图模型,生成更贴合故事内容的封面。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
764cab37a0
commit
8f9f7824cd
@ -132,7 +132,7 @@ def generate_story_stream(characters, scenes, props):
|
||||
cover_url = ''
|
||||
try:
|
||||
cover_url = _generate_and_upload_cover(
|
||||
result['title'], characters, scenes, props, config
|
||||
result['title'], result['content'], config
|
||||
)
|
||||
except Exception as cover_err:
|
||||
logger.warning(f'Cover generation failed (non-fatal): {cover_err}')
|
||||
@ -173,7 +173,32 @@ def _parse_story_json(text):
|
||||
}
|
||||
|
||||
|
||||
def _generate_and_upload_cover(title, characters, scenes, props, config):
|
||||
def _extract_image_description(title, content, client, model_name):
|
||||
"""
|
||||
用 LLM 从故事内容中提炼 ≤50 字的画面描述:主体 + 场景 + 事件。
|
||||
返回纯文本描述字符串。
|
||||
"""
|
||||
system = (
|
||||
"你是图像提示词专家。从给定的儿童故事中,提取主体、场景与核心事件,"
|
||||
"串联成一幅画的中文描述。要求:\n"
|
||||
"1. 不超过50个汉字\n"
|
||||
"2. 只输出描述本身,不加任何解释、前缀或多余标点\n"
|
||||
"3. 描述需具体生动,适合儿童绘本插画"
|
||||
)
|
||||
user = f"故事标题:{title}\n故事内容:{content[:800]}"
|
||||
resp = client.chat.completions.create(
|
||||
model=model_name,
|
||||
messages=[
|
||||
{'role': 'system', 'content': system},
|
||||
{'role': 'user', 'content': user},
|
||||
],
|
||||
max_tokens=80,
|
||||
stream=False,
|
||||
)
|
||||
return resp.choices[0].message.content.strip()
|
||||
|
||||
|
||||
def _generate_and_upload_cover(title, content, config):
|
||||
"""
|
||||
使用豆包文生图模型生成故事封面,上传到 OSS 并返回 URL。
|
||||
失败时抛出异常(由调用方捕获,不影响主流程)。
|
||||
@ -184,24 +209,18 @@ def _generate_and_upload_cover(title, characters, scenes, props, config):
|
||||
from django.conf import settings
|
||||
from volcenginesdkarkruntime import Ark
|
||||
|
||||
# Build a concise Chinese image prompt
|
||||
elements = []
|
||||
if characters:
|
||||
elements.append('、'.join(characters))
|
||||
if scenes:
|
||||
elements.append('、'.join(scenes))
|
||||
if props:
|
||||
elements.append('、'.join(props))
|
||||
|
||||
element_str = ','.join(elements) if elements else title
|
||||
image_prompt = (
|
||||
f"儿童绘本封面插画,{title},{element_str},"
|
||||
"卡通可爱风格,色彩明亮鲜艳,温馨有趣,适合3-8岁儿童,高质量插画"
|
||||
)
|
||||
|
||||
client = Ark(api_key=config['API_KEY'])
|
||||
|
||||
# 用 LLM 从故事内容提炼 ≤50 字画面描述
|
||||
scene_desc = _extract_image_description(
|
||||
title, content, client, config['MODEL_NAME']
|
||||
)
|
||||
logger.info(f'Cover image description: {scene_desc}')
|
||||
|
||||
image_prompt = f"儿童绘本封面插画,{scene_desc},卡通可爱风格,色彩明亮鲜艳,高质量插画"
|
||||
|
||||
image_model = config.get('IMAGE_MODEL_NAME', 'doubao-seedream-4-5-251128')
|
||||
image_size = config.get('IMAGE_SIZE', '1920x1920')
|
||||
image_size = config.get('IMAGE_SIZE', '2560x1440')
|
||||
|
||||
result = client.images.generate(
|
||||
model=image_model,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user