From 9adeee6c83db4e8904b404a3ccd7c15794d058b4 Mon Sep 17 00:00:00 2001 From: ageerle Date: Tue, 21 Jul 2026 16:06:06 +0800 Subject: [PATCH] =?UTF-8?q?fix(short-drama):=20=E4=BF=AE=E5=A4=8D=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E5=BD=A2=E8=B1=A1=E8=B7=A8=E5=88=86=E9=95=9C=E4=B8=8D?= =?UTF-8?q?=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. findRefImageIndex 补上 appearance 参数,与 findStoryboardReferenceImages 的调用对齐。之前多形象角色(换装/青年老年)的 @imageN 绑定查的是 默认形象 URL,和实际参考图列表对不上,导致 prompt 里没有 @imageN 标记 2. buildEnrichedVideoPrompt 角色段追加 visualDescription, 文字 prompt 也承载外貌信息(发型/服装/体态),不能全靠参考图 Co-Authored-By: Claude --- .../shortdrama/impl/ShortDramaServiceImpl.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/shortdrama/impl/ShortDramaServiceImpl.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/shortdrama/impl/ShortDramaServiceImpl.java index 6f07ffa5..219dfb08 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/shortdrama/impl/ShortDramaServiceImpl.java +++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/shortdrama/impl/ShortDramaServiceImpl.java @@ -830,7 +830,7 @@ public class ShortDramaServiceImpl implements IShortDramaService { } catch (Exception e) { log.debug("解析摄影规则失败: {}", e.getMessage()); } } - // 3. 角色信息(名字→年龄性别,附加站位 + @imageN 参考图标记) + // 3. 角色信息(名字→年龄性别+视觉描述,附加站位 + @imageN 参考图标记) List chars = parseCharacterRefs(storyboard.getCharactersJson()); if (chars != null && !chars.isEmpty()) { sb.append("[角色] "); @@ -842,9 +842,13 @@ public class ShortDramaServiceImpl implements IShortDramaService { ? firstNotBlank(ch.getAgeRange(), "") + firstNotBlank(ch.getGender(), "") : ref.getName(); sb.append(desc).append("(").append(ref.getName()).append(")"); + // 附加角色视觉描述,确保文字 prompt 也承载外貌信息,不能全靠参考图 + if (ch != null && StrUtil.isNotBlank(ch.getVisualDescription())) { + sb.append(",外貌:").append(ch.getVisualDescription()); + } // 多参考图模式:附加 @imageN 标记 if (hasRefImages) { - int imgIdx = findRefImageIndex(refImages, storyboard.getProjectId(), ref.getName()); + int imgIdx = findRefImageIndex(refImages, storyboard.getProjectId(), ref.getName(), ref.getAppearance()); if (imgIdx >= 0) sb.append("@image").append(imgIdx + 1); } if (StrUtil.isNotBlank(ref.getSlot())) sb.append("在").append(ref.getSlot()); @@ -972,7 +976,7 @@ public class ShortDramaServiceImpl implements IShortDramaService { CharacterRef ref = chars.get(i); sb.append(ref.getName()); if (hasRefImages) { - int imageIndex = findRefImageIndex(refImages, storyboard.getProjectId(), ref.getName()); + int imageIndex = findRefImageIndex(refImages, storyboard.getProjectId(), ref.getName(), ref.getAppearance()); if (imageIndex >= 0) sb.append("仅绑定@image").append(imageIndex + 1); } } @@ -984,7 +988,12 @@ public class ShortDramaServiceImpl implements IShortDramaService { /** 在参考图列表中找到指定角色图片的索引 */ private int findRefImageIndex(java.util.List refImages, Long projectId, String characterName) { - String targetUrl = findCharacterImageUrl(projectId, characterName); + return findRefImageIndex(refImages, projectId, characterName, null); + } + + /** 在参考图列表中找到指定角色(含形象标识)图片的索引 */ + private int findRefImageIndex(java.util.List refImages, Long projectId, String characterName, String appearance) { + String targetUrl = findCharacterImageUrl(projectId, characterName, appearance); if (StrUtil.isBlank(targetUrl)) return -1; for (int i = 0; i < refImages.size(); i++) { if (targetUrl.equals(refImages.get(i))) return i;