Skip to content

分镜生成:各服务商与模型的 message_filter 形态与兼容策略

本文档记录目前前端/后端对不同服务商与模型返回的分镜 JSON(通常位于 message_filter 或文本内容)进行解析的兼容方式,便于后续查阅与优化。

服务商与模型

  • Volcengine(火山引擎):如 Doubao-Seed-1.6DeepSeek-V3.1 等,通过 Ark API 返回。
  • Qianwen(通义千问):文本或对象结构,可能包含嵌套的 message.message_filter
  • 其他模型:遵循相同的解析流程,只要能提取到包含 storyboard 或分镜数组/对象的 JSON 即可。

常见返回结构

  1. 纯文本或字符串包裹的 JSON

    • 可能带 Markdown 代码块或额外前后缀。
    • 兼容策略:extractJsonSubstring 提取首个完整 {}/[] 片段;cleanArkResponseString 清洗代码块与异常字符;tryJsonDecode 自动提取有效 JSON 子串。
  2. Volcengine Ark 返回数组项

    • 形态:[{ message_filter: "..." }, ...] 或其他对象内含 message_filter
    • 兼容策略:遍历数组,优先读取 item.message_filter,再做清洗与解析。
  3. Qianwen 返回对象或数组

    • 可能存在:obj.message.message_filterobj.message_filterobj.textobj.contentobj.responseData[i].message_filter 等。
    • 兼容策略:在 StoryBoard.vue/LLMGeneratePanel.vue 中使用 pickText/pickMF 递归提取。
  4. 分镜数据形态

    • 对象:{ storyboard: { 分镜1: {...}, 分镜2: {...} }, meta?... } 或直接是 { 分镜1: {...} }
    • 数组:[ { "分镜1": {...} }, { "分镜2": {...} } ]
    • 兼容策略:
      • 归一化:normalizeStoryboardShape(StoryBoard.vue)与 normalizeStoryboardList(LLMGeneratePanel.vue)。
      • 扁平化数组的单键对象:[{"分镜1": {...}}] 提升为分镜项并保留 __indexLabel
      • 数字排序分镜键:按键名中的数字升序(如 分镜1分镜2)。

字段名兼容(分镜项)

  • line(台词):['line','台词','对白','对白文本','对白内容','台词内容','字幕','text']
  • title(标题):['title','titile','标题','分镜标题','镜头名称','名称']
  • description(描述):['description','描述','镜头描述','画面描述','场景描述']
  • name(角色/人物):['name','角色','人物','角色名','人物名称']
  • prompt(提示词):['prompt','Prompt','PROMPT','提示词']
    • 兼容来源:顶层字段或嵌套在 effect 对象中。
  • effect(效果)
    • 可能为对象或字符串。
    • 兼容策略:在 StoryBoard.vue 中统一为字符串(生成流程入口),或保留对象(模板结果应用入口);在两种入口中均会从对象型 effect 中提升 prompt 到顶层。

解析与清洗流程(关键方法)

  • extractJsonSubstring(s):从文本里提取第一个完整的 JSON 片段({}[])。
  • cleanArkResponseString(s):去除 Markdown 代码块和异常字符,便于 JSON 解码。
  • tryJsonDecode(s):尝试直接 JSON.parse,失败时自动截取有效子串再解析。
  • normalizeStoryboardShape/normalizeStoryboardList
    • 支持对象/数组形态,扁平化单键对象数组项。
    • 提取/提升 effect.prompt 到顶层 prompt
  • processLineContent:过滤台词中括号与注释,保留原始台词到 lineOrigin
  • normalizeEffectToString:将 effect 统一为字符串(或在模板应用入口保持对象)。

预览与编辑(生成结果确认弹窗)

  • LLMGeneratePanel.vue
    • 解析后构建树:展示 description/line/prompt
    • 编辑器支持修改 description/line/effect(JSON)/prompt,保存后重建树。

问题诊断清单

  • 预览不显示:检查 generatedResult 是否为清洗后的字符串;若为空或非 JSON,查看原始字符串并手动验证。
  • prompt 缺失:确认是否在顶层或 effect 内部;现在两处入口均会提升并显示。
  • 分镜数量不对:检查是否为数组单键对象形态;归一化已扁平化处理。

后续优化建议

  • 统一使用 prompt 字段,彻底移除 prompt_en 的历史遗留代码。
  • effect 配置显示模板,支持富文本/结构化渲染,提高可读性。
  • 增加服务商/模型返回差异的单元测试数据集,自动回归解析兼容性。