|
@@ -1182,7 +1182,7 @@ class DeepSeekService
|
|
|
yield [
|
|
yield [
|
|
|
'type' => 'content',
|
|
'type' => 'content',
|
|
|
'content' => $delta['content'],
|
|
'content' => $delta['content'],
|
|
|
- 'full_content' => $fullContent
|
|
|
|
|
|
|
+ // 'full_content' => $fullContent
|
|
|
];
|
|
];
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -1961,7 +1961,7 @@ class DeepSeekService
|
|
|
yield [
|
|
yield [
|
|
|
'type' => 'content',
|
|
'type' => 'content',
|
|
|
'content' => $delta['content'],
|
|
'content' => $delta['content'],
|
|
|
- 'full_content' => $fullContent
|
|
|
|
|
|
|
+ // 'full_content' => $fullContent
|
|
|
];
|
|
];
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -2386,7 +2386,7 @@ class DeepSeekService
|
|
|
yield [
|
|
yield [
|
|
|
'type' => 'content',
|
|
'type' => 'content',
|
|
|
'content' => $delta['content'],
|
|
'content' => $delta['content'],
|
|
|
- 'full_content' => $fullContent
|
|
|
|
|
|
|
+ // 'full_content' => $fullContent
|
|
|
];
|
|
];
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -2530,10 +2530,19 @@ class DeepSeekService
|
|
|
$scenes = $base_episode ? json_decode((string)getProp($base_episode, 'scenes'), true) : json_decode((string)getProp($anime, 'scenes'), true);
|
|
$scenes = $base_episode ? json_decode((string)getProp($base_episode, 'scenes'), true) : json_decode((string)getProp($anime, 'scenes'), true);
|
|
|
$roles = is_array($roles) ? $roles : [];
|
|
$roles = is_array($roles) ? $roles : [];
|
|
|
$scenes = is_array($scenes) ? $scenes : [];
|
|
$scenes = is_array($scenes) ? $scenes : [];
|
|
|
|
|
+
|
|
|
// 转换主体列表和场景列表的格式
|
|
// 转换主体列表和场景列表的格式
|
|
|
$roles_content = $this->buildEpisodeItemContent($roles, 'role');
|
|
$roles_content = $this->buildEpisodeItemContent($roles, 'role');
|
|
|
$scenes_content = $this->buildEpisodeItemContent($scenes, 'scene');
|
|
$scenes_content = $this->buildEpisodeItemContent($scenes, 'scene');
|
|
|
|
|
|
|
|
|
|
+ // 获取音色列表
|
|
|
|
|
+ $timbres = DB::table('mp_timbres')->select('timbre_name')->where('is_enabled', 1)->where('id', '<=', 15)->get()->map(function ($value) {
|
|
|
|
|
+ $value = (array)$value;
|
|
|
|
|
+ $value['timbre_name'] = str_replace('(多情感)', '', $value['timbre_name']);
|
|
|
|
|
+ return $value;
|
|
|
|
|
+ })->pluck('timbre_name')->toArray();
|
|
|
|
|
+ $timbres_content = implode('、', $timbres);
|
|
|
|
|
+
|
|
|
$existing_roles = $base_episode ? json_decode((string)getProp($base_episode, 'roles'), true) : [];
|
|
$existing_roles = $base_episode ? json_decode((string)getProp($base_episode, 'roles'), true) : [];
|
|
|
$existing_scenes = $base_episode ? json_decode((string)getProp($base_episode, 'scenes'), true) : [];
|
|
$existing_scenes = $base_episode ? json_decode((string)getProp($base_episode, 'scenes'), true) : [];
|
|
|
$existing_roles = is_array($existing_roles) ? $existing_roles : [];
|
|
$existing_roles = is_array($existing_roles) ? $existing_roles : [];
|
|
@@ -2560,22 +2569,23 @@ class DeepSeekService
|
|
|
$demo = "你是一个专业的文档分析助手及资深编剧,请根据用户提供的文档内容完成示例格式的内容输出(需包含以下几个板块: <剧集标题><故事梗概><美术风格><主体列表><场景列表><分镜剧本>,每个板块之间用###分隔;同时板块之间需满足以下要求:\n
|
|
$demo = "你是一个专业的文档分析助手及资深编剧,请根据用户提供的文档内容完成示例格式的内容输出(需包含以下几个板块: <剧集标题><故事梗概><美术风格><主体列表><场景列表><分镜剧本>,每个板块之间用###分隔;同时板块之间需满足以下要求:\n
|
|
|
强制要求:
|
|
强制要求:
|
|
|
1.你只负责与剧本相关的内容,如果用户输入与剧本无关的内容,请告知用户并拒绝继续回答,此为第一优先原则,不满足此原则就忽略其他要求并停止继续输出
|
|
1.你只负责与剧本相关的内容,如果用户输入与剧本无关的内容,请告知用户并拒绝继续回答,此为第一优先原则,不满足此原则就忽略其他要求并停止继续输出
|
|
|
- 2.如果用户输入修改美术风格、修改画风这类内容,请告知用户不可修改美术风格,并拒绝继续回答\n
|
|
|
|
|
|
|
+ 2.如果用户输入修改美术风格、修改画风这类内容,请告知用户不可修改美术风格,并拒绝继续回答
|
|
|
3.以上两条要求对修改主体角色或场景不生效,允许用户调整主体角色说明和场景描述等\n
|
|
3.以上两条要求对修改主体角色或场景不生效,允许用户调整主体角色说明和场景描述等\n
|
|
|
普通要求:
|
|
普通要求:
|
|
|
1.剧集标题必须与文档内容高度相关,剧集序号是{$episode_number}
|
|
1.剧集标题必须与文档内容高度相关,剧集序号是{$episode_number}
|
|
|
- 2.<主体列表>必须在以下主体中选择多个(根据拆分出的分镜剧本来确认具体几个),不得自定义(需带上冒号后的具体描述):{$roles_content}\n
|
|
|
|
|
|
|
+ 2.<主体列表>必须在以下主体中选择多个(根据拆分出的分镜剧本来确认具体几个),不得自定义(需带上冒号后的具体描述):\n{$roles_content}
|
|
|
2.1如果分集内容中出现了<主体列表>中不存在的新主体,则不用在上述主体中选择,而是按照相同的格式新增一个主体显示在主题列表中
|
|
2.1如果分集内容中出现了<主体列表>中不存在的新主体,则不用在上述主体中选择,而是按照相同的格式新增一个主体显示在主题列表中
|
|
|
- 3.<场景列表>必须在以下场景中选择多个(根据拆分出的分镜剧本来确认具体几个),不得自定义(需带上冒号后的具体描述):{$scenes_content}\n
|
|
|
|
|
- 4.<分镜剧本>要求包含“分幕标题”以及“分镜信息”: \n
|
|
|
|
|
- 4.1“分幕标题”是根据章节中的场景进行拆分,类似于“第1幕 场景、时间及室内或室外”的信息,其中场景只能在所给出的场景列表中选(不带场景详细描述)。\n
|
|
|
|
|
- 4.2“分镜信息”需同一场景内的对话内容完成分镜(每一幕分镜尽量不得低于5个),需包含“画面描述”、“构图设计”、“运镜调度”、“配音音色”、“台词内容”和“画面类型”这几个部分,其中“画面描述”如果出现主体,只能选择上述主体列表中的一个,主体的名称也需要保持一致(不带主体具体描述)。\n
|
|
|
|
|
- 4.3分镜序号用1、2、3显示,如分镜1、分镜2,并且分镜序号需连续(跨分幕中的分镜序号需连续,但跨剧集中的不需要连续,如第2集的第1幕分镜序号从1开始)。\n
|
|
|
|
|
- 4.4“分镜信息”中的“台词内容”需与原文中的台词完全一致,不得修改或添加任何内容。\n
|
|
|
|
|
- 4.5“分镜信息”中的“配音角色”需对应本集中的<主体列表>中的一个(非对话内容则统一固定为“旁白”角色),不得自己生成。\n
|
|
|
|
|
- 4.6“分镜信息”中的“场景”需对应本集中的<场景列表>中的一个(不带详细表述)\n
|
|
|
|
|
- 4.7“分镜信息”中的“出镜角色”需对应本集中的<主体列表>中的一个或多个(不带详细描述),如果没有出镜角色则填无\n
|
|
|
|
|
- 4.8“分镜信息”中的“尾帧描述”需根据本镜和下一镜的剧本信息进行过渡生成,用于后续转视频进行衔接上下镜头的画面\n\n
|
|
|
|
|
|
|
+ 2.2主体列表的音色必须在以下音色中($timbres_content)选择,选择的音色放在描述的最后用{{}}框起来
|
|
|
|
|
+ 3.<场景列表>必须在以下场景中选择多个(根据拆分出的分镜剧本来确认具体几个),不得自定义(需带上冒号后的具体描述):\n{$scenes_content}
|
|
|
|
|
+ 4.<分镜剧本>要求包含“分幕标题”以及“分镜信息”:
|
|
|
|
|
+ 4.1“分幕标题”是根据章节中的场景进行拆分,类似于“第1幕 场景、时间及室内或室外”的信息,其中场景只能在所给出的场景列表中选(不带场景详细描述)。
|
|
|
|
|
+ 4.2“分镜信息”需同一场景内的对话内容完成分镜(每一幕分镜尽量不得低于5个),需包含“画面描述”、“构图设计”、“运镜调度”、“配音音色”、“台词内容”和“画面类型”这几个部分,其中“画面描述”如果出现主体,只能选择上述主体列表中的一个,主体的名称也需要保持一致(不带主体具体描述)。
|
|
|
|
|
+ 4.3分镜序号用1、2、3显示,如分镜1、分镜2,并且分镜序号需连续(跨分幕中的分镜序号需连续,但跨剧集中的不需要连续,如第2集的第1幕分镜序号从1开始)。
|
|
|
|
|
+ 4.4“分镜信息”中的“台词内容”需与原文中的台词完全一致,不得修改或添加任何内容。
|
|
|
|
|
+ 4.5“分镜信息”中的“配音角色”需对应本集中的<主体列表>中的一个(非对话内容则统一固定为“旁白”角色),不得自己生成。
|
|
|
|
|
+ 4.6“分镜信息”中的“场景”需对应本集中的<场景列表>中的一个(不带详细表述)
|
|
|
|
|
+ 4.7“分镜信息”中的“出镜角色”需对应本集中的<主体列表>中的一个或多个(不带详细描述),如果没有出镜角色则填无
|
|
|
|
|
+ 4.8“分镜信息”中的“尾帧描述”需根据本镜和下一镜的剧本信息进行过渡生成,用于后续转视频进行衔接上下镜头的画面\n
|
|
|
示例格式:\n
|
|
示例格式:\n
|
|
|
第1集:隐形的守护者
|
|
第1集:隐形的守护者
|
|
|
|
|
|
|
@@ -2587,11 +2597,11 @@ class DeepSeekService
|
|
|
视觉风格描述:整体采用精致的韩漫厚涂风格,以浅灰冷调为基调,营造出重生复仇的清冷与压抑感。画面强调高对比度的光影处理,网吧场景通过低饱和度的杂乱色调表现颓废感,而清晨车祸瞬间则利用强烈的动态模糊与局部高光,突显“透明守护者”存在的神秘感与宿命感。人物形象细腻,眼神充满坚毅与破碎交织的故事感,完美契合偏执救赎的主题。
|
|
视觉风格描述:整体采用精致的韩漫厚涂风格,以浅灰冷调为基调,营造出重生复仇的清冷与压抑感。画面强调高对比度的光影处理,网吧场景通过低饱和度的杂乱色调表现颓废感,而清晨车祸瞬间则利用强烈的动态模糊与局部高光,突显“透明守护者”存在的神秘感与宿命感。人物形象细腻,眼神充满坚毅与破碎交织的故事感,完美契合偏执救赎的主题。
|
|
|
|
|
|
|
|
###主体列表
|
|
###主体列表
|
|
|
- 许芸-校服装:重生后的“假千金”,清醒果敢,不再任人唯亲。她是一名高中生,身材纤细,留着乌黑齐肩短发,眼神坚定。
|
|
|
|
|
- 许芸-卫衣装:半个月后居家或外出时的装扮,在清冷的环境中透着一丝坚毅与破碎感。
|
|
|
|
|
- 程景:偏执深情的学霸,为救许芸变得“不可见”,是始终默默守护的隐形爱人。他身材高大挺拔,面容英俊。
|
|
|
|
|
- 卞大伟:许芸名义上的表哥,阴险暴戾的无业游民。他身材肥胖,面部肉感重,一双小眼睛透着阴冷。
|
|
|
|
|
- 徐母:许芸亲生母亲,重男轻女且极度刻薄,面容严厉。
|
|
|
|
|
|
|
+ 许芸-校服装:重生后的“假千金”,清醒果敢,不再任人唯亲。她是一名高中生,身材纤细,留着乌黑齐肩短发,眼神坚定。{{甜心小美}}
|
|
|
|
|
+ 许芸-卫衣装:半个月后居家或外出时的装扮,在清冷的环境中透着一丝坚毅与破碎感。{{爽快思思}}
|
|
|
|
|
+ 程景:偏执深情的学霸,为救许芸变得“不可见”,是始终默默守护的隐形爱人。他身材高大挺拔,面容英俊。{{阳光青年}}
|
|
|
|
|
+ 卞大伟:许芸名义上的表哥,阴险暴戾的无业游民。他身材肥胖,面部肉感重,一双小眼睛透着阴冷。{{广州德哥}}
|
|
|
|
|
+ 徐母:许芸亲生母亲,重男轻女且极度刻薄,面容严厉。{{邻居阿姨}}
|
|
|
|
|
|
|
|
###场景列表
|
|
###场景列表
|
|
|
徐家老旧厨房:这是徐母劳作和惩罚许芸的地方。空间狭窄阴暗,充满了生活琐碎的压抑感。室内有一个旧式锅炉,案板上散落着面粉和包好的馄饨,光影对比强烈,凸显出家庭环境的冷酷。
|
|
徐家老旧厨房:这是徐母劳作和惩罚许芸的地方。空间狭窄阴暗,充满了生活琐碎的压抑感。室内有一个旧式锅炉,案板上散落着面粉和包好的馄饨,光影对比强烈,凸显出家庭环境的冷酷。
|
|
@@ -2801,7 +2811,7 @@ class DeepSeekService
|
|
|
yield [
|
|
yield [
|
|
|
'type' => 'content',
|
|
'type' => 'content',
|
|
|
'content' => $delta['content'],
|
|
'content' => $delta['content'],
|
|
|
- 'full_content' => $fullContent
|
|
|
|
|
|
|
+ // 'full_content' => $fullContent
|
|
|
];
|
|
];
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -2847,8 +2857,8 @@ class DeepSeekService
|
|
|
$generated_scenes = isset($episode_arr['scenes']) && is_array($episode_arr['scenes']) ? $episode_arr['scenes'] : [];
|
|
$generated_scenes = isset($episode_arr['scenes']) && is_array($episode_arr['scenes']) ? $episode_arr['scenes'] : [];
|
|
|
$merged_roles = $this->mergeEpisodeResourceItems($existing_roles, $generated_roles, 'role');
|
|
$merged_roles = $this->mergeEpisodeResourceItems($existing_roles, $generated_roles, 'role');
|
|
|
$merged_scenes = $this->mergeEpisodeResourceItems($existing_scenes, $generated_scenes, 'scene');
|
|
$merged_scenes = $this->mergeEpisodeResourceItems($existing_scenes, $generated_scenes, 'scene');
|
|
|
- // dLog('deepseek')->info('修改后的数据: ', [$merged_roles, $merged_scenes]);
|
|
|
|
|
- // exit();
|
|
|
|
|
|
|
+ dLog('deepseek')->info('修改后的数据: ', [$merged_roles, $merged_scenes]);
|
|
|
|
|
+ exit();
|
|
|
$now = date('Y-m-d H:i:s');
|
|
$now = date('Y-m-d H:i:s');
|
|
|
|
|
|
|
|
try {
|
|
try {
|