From af57f32abb61fbc41feaa6f920935917f7ffecfc Mon Sep 17 00:00:00 2001 From: Cyber Dick Lang <286878701@qq.com> Date: Thu, 31 Jul 2025 16:00:21 +0800 Subject: [PATCH] feat: add Video Prompt Helper node (English name), MIT info, and config files --- __init__.py | 12 + nodes/tools/README_prompt_helper.md | 109 +++++++ nodes/tools/prompt_helper.py | 364 +++++++++++++++++++++++ nodes/tools/prompt_presets.json | 432 ++++++++++++++++++++++++++++ nodes/tools/prompt_ui_labels.json | 80 ++++++ 5 files changed, 997 insertions(+) create mode 100644 nodes/tools/README_prompt_helper.md create mode 100644 nodes/tools/prompt_helper.py create mode 100644 nodes/tools/prompt_presets.json create mode 100644 nodes/tools/prompt_ui_labels.json diff --git a/__init__.py b/__init__.py index 9982651..41eb4a2 100644 --- a/__init__.py +++ b/__init__.py @@ -539,6 +539,16 @@ except ImportError as e: KONTEXT_PRESETS_MAPPINGS = {} KONTEXT_PRESETS_DISPLAY_MAPPINGS = {} +try: + from .nodes.tools.prompt_helper import \ + NODE_CLASS_MAPPINGS as PROMPT_HELPER_MAPPINGS + from .nodes.tools.prompt_helper import \ + NODE_DISPLAY_NAME_MAPPINGS as PROMPT_HELPER_DISPLAY_MAPPINGS +except ImportError as e: + print(f"导入错误: {e}") + PROMPT_HELPER_MAPPINGS = {} + PROMPT_HELPER_DISPLAY_MAPPINGS = {} + # 合并所有节点映射 NODE_CLASS_MAPPINGS = {} NODE_CLASS_MAPPINGS.update(EMPTY_UNIT_MAPPINGS) @@ -568,6 +578,7 @@ NODE_CLASS_MAPPINGS.update(MATH_EXPRESSION_MAPPINGS) NODE_CLASS_MAPPINGS.update(THINK_REMOVER_MAPPINGS) NODE_CLASS_MAPPINGS.update(LORA_INFO_MAPPINGS) NODE_CLASS_MAPPINGS.update(KONTEXT_PRESETS_MAPPINGS) +NODE_CLASS_MAPPINGS.update(PROMPT_HELPER_MAPPINGS) # 合并显示名称映射 NODE_DISPLAY_NAME_MAPPINGS = {} @@ -598,6 +609,7 @@ NODE_DISPLAY_NAME_MAPPINGS.update(MATH_EXPRESSION_DISPLAY_MAPPINGS) NODE_DISPLAY_NAME_MAPPINGS.update(THINK_REMOVER_DISPLAY_MAPPINGS) NODE_DISPLAY_NAME_MAPPINGS.update(LORA_INFO_DISPLAY_MAPPINGS) NODE_DISPLAY_NAME_MAPPINGS.update(KONTEXT_PRESETS_DISPLAY_MAPPINGS) +NODE_DISPLAY_NAME_MAPPINGS.update(PROMPT_HELPER_DISPLAY_MAPPINGS) NODE_CATEGORIES = { "UniversalToolkit": [ diff --git a/nodes/tools/README_prompt_helper.md b/nodes/tools/README_prompt_helper.md new file mode 100644 index 0000000..447f564 --- /dev/null +++ b/nodes/tools/README_prompt_helper.md @@ -0,0 +1,109 @@ +# 视频提示词生成器 (Video Prompt Generator) + +## 简介 + +视频提示词生成器是一个专为 ComfyUI 设计的自定义节点插件,提供强大的视频提示词生成功能。该插件支持中英文双语界面,帮助用户快速构建专业的电影化提示词。 + +## 原作者信息 + +- **原作者**: flybirdxx +- **项目地址**: https://github.com/flybirdxx/ComfyUI_Prompt_Helper +- **许可证**: MIT License + +## 功能特点 + +* 🎬 **专业电影化提示词生成** - 构建高质量的视频生成提示词 +* 🌐 **双语支持** - 自动检测系统语言,支持中文和英文界面 +* 📋 **14个专业分类** - 覆盖电影制作的各个方面 +* 🎯 **三种格式输出** - 专业、简单、详细三种提示词格式 +* 🔧 **高度可定制** - 丰富的配置选项和预设 +* 📚 **内置示例** - 包含多个使用示例和最佳实践 + +## 分类选项 + +插件提供以下14个专业分类: + +1. **镜头大小 / Shot Size** - 全景、中景、特写等 +2. **灯光类型 / Lighting Type** - 自然光、戏剧化灯光、柔光等 +3. **光源 / Light Source** - 阳光、月光、火光等 +4. **色调 / Color Tone** - 暖色调、冷色调、高对比度等 +5. **摄像机角度 / Camera Angle** - 平视、仰视、俯视等 +6. **镜头 / Lens** - 广角、人像、长焦等 +7. **基础摄像机运动 / Basic Camera Movement** - 静态、平移、缩放等 +8. **高级摄像机运动 / Advanced Camera Movement** - 推轨、斯坦尼康、航拍等 +9. **时间 / Time of Day** - 黎明、黄昏、夜晚等 +10. **运动 / Motion** - 慢动作、快动作、正常速度等 +11. **视觉效果 / Visual Effects** - 镜头光晕、雨滴、雾气等 +12. **视觉风格 / Visual Style** - 电影风格、纪录片、动作等 +13. **角色情感 / Character Emotion** - 开心、悲伤、紧张等 +14. **构图 / Composition** - 三分法、对称、非对称等 + +## 使用方法 + +1. **启动 ComfyUI** - 插件会自动加载并检测系统语言 +2. **添加节点** - 在节点菜单中找到 "🎬 视频提示词生成器" 或 "🎬 Video Prompt Generator" +3. **配置参数** - 从各个分类中选择所需的选项 +4. **生成提示词** - 插件会自动组合生成专业的提示词 + +### 示例工作流 + +``` +用户输入: "一个战士在战场上奔跑" +配置选项: +- 镜头大小: 中景 +- 灯光类型: 戏剧化灯光 +- 色调: 高对比度 +- 摄像机角度: 仰视角度 +- 提示词格式: 专业 + +输出结果: "一个战士在战场上奔跑,中景,戏剧化灯光,高对比度,仰视角度,专业电影质量,高细节,4K分辨率" +``` + +## 文件结构 + +``` +nodes/tools/ +├── prompt_helper.py # 主要功能代码 +├── prompt_presets.json # 预设配置文件 +├── prompt_ui_labels.json # 界面标签文件 +└── README_prompt_helper.md # 说明文档 +``` + +## 配置文件 + +* **prompt_presets.json** - 包含所有分类的预设选项 +* **prompt_ui_labels.json** - 定义界面标签的多语言文本 + +## 自定义配置 + +您可以通过编辑 JSON 配置文件来自定义选项: + +1. 编辑 `prompt_presets.json` 添加新的预设选项 +2. 修改 `prompt_ui_labels.json` 更新界面文本 + +## 兼容性 + +* **ComfyUI** - 支持最新版本的 ComfyUI +* **Python** - 需要 Python 3.7+ +* **操作系统** - 支持 Windows、macOS、Linux + +## 许可证 + +本项目采用 MIT 许可证 - 详见 LICENSE 文件 + +## 致谢 + +* 感谢 flybirdxx 提供的优秀视频提示词生成工具 +* 感谢 ComfyUI 提供的优秀平台 + +--- + +## 更新日志 + +### v1.0.0 (集成版本) + +* 初始集成到 ComfyUI-UniversalToolkit +* 支持14个专业分类 +* 双语界面支持 +* 三种提示词格式 +* 保持原作者信息和 MIT 协议 \ No newline at end of file diff --git a/nodes/tools/prompt_helper.py b/nodes/tools/prompt_helper.py new file mode 100644 index 0000000..33cfd0b --- /dev/null +++ b/nodes/tools/prompt_helper.py @@ -0,0 +1,364 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +视频提示词生成器 ComfyUI 自定义节点 (双语版本) +Video Prompt Generator ComfyUI Custom Node (Bilingual Version) + +原作者 / Original Author: flybirdxx +项目地址 / Project URL: https://github.com/flybirdxx/ComfyUI_Prompt_Helper +许可证 / License: MIT License + +基于 Denge AI 的视频提示词生成工具创建 +支持中文和英文两种语言 +""" + +import json +import os +import locale + +# 获取当前文件所在的目录路径 +CURRENT_DIR = os.path.dirname(os.path.abspath(__file__)) + +# 检测系统语言 +def detect_system_language(): + """检测系统语言并返回支持的语言代码""" + try: + # 获取系统语言设置 + system_locale = locale.getdefaultlocale()[0] + if system_locale: + # 如果是中文相关的locale,返回zh + if system_locale.startswith('zh'): + return 'zh' + # 其他情况返回英文 + else: + return 'en' + except Exception as e: + pass + + # 默认返回中文 + return 'zh' + +# 获取系统默认语言 +DEFAULT_LANGUAGE = detect_system_language() + +# 构建 JSON 文件的完整路径 +PRESETS_FILE_PATH = os.path.join(CURRENT_DIR, 'prompt_presets.json') +UI_LABELS_FILE_PATH = os.path.join(CURRENT_DIR, 'prompt_ui_labels.json') + +# 从 JSON 文件加载预设数据 +def load_video_presets(): + try: + with open(PRESETS_FILE_PATH, 'r', encoding='utf-8') as f: + return json.load(f) + except Exception as e: + print(f"Error loading prompt_presets.json: {e}") + return {} + +# 从 JSON 文件加载UI标签 +def load_ui_labels(): + try: + with open(UI_LABELS_FILE_PATH, 'r', encoding='utf-8') as f: + return json.load(f) + except Exception as e: + print(f"Error loading prompt_ui_labels.json: {e}") + # 返回基本的英文标签作为回退 + return { + "zh": {"language": "语言", "default_prompt": "一个美丽的场景"}, + "en": {"language": "Language", "default_prompt": "A beautiful scene"}, + "messages": {"zh": {}, "en": {}}, + "display_names": {"zh": "视频提示词生成器", "en": "Video Prompt Generator"} + } + +# 加载预设数据和UI标签 +VIDEO_PRESETS = load_video_presets() +UI_LABELS_DATA = load_ui_labels() +UI_LABELS = UI_LABELS_DATA # 保持向后兼容 + +class WanVideoPromptGenerator: + """ + 视频提示词生成器节点(双语版本) + Video Prompt Generator Node (Bilingual Version) + + 允许用户从14个不同的电影分类中选择选项来构建专业的电影化提示词 + Allows users to build professional cinematic prompts by selecting from 14 different film categories + + 原作者 / Original Author: flybirdxx + 项目地址 / Project URL: https://github.com/flybirdxx/ComfyUI_Prompt_Helper + 许可证 / License: MIT License + """ + + @classmethod + def INPUT_TYPES(s): + """定义输入类型""" + + # 为每个分类创建选项列表,添加 "none" 选项在前面 + def get_options(category, language=DEFAULT_LANGUAGE): + if language in VIDEO_PRESETS and category in VIDEO_PRESETS[language]: + # 获取本地化的显示文本,而不是键名 + category_data = VIDEO_PRESETS[language][category] + options = [] + + # 先添加 "none" 选项,显示为本地化的文本 + if "none" in category_data: + none_text = UI_LABELS_DATA[language].get("none_option", "none") + options.append(none_text) + + # 添加其他选项的本地化文本 + for key, value in category_data.items(): + if key != "none" and value: # 跳过none和空值 + options.append(value) + + return options + none_text = UI_LABELS_DATA[language].get("none_option", "none") + return [none_text] + + # 根据默认语言设置默认提示词和属性名称 + default_prompt = UI_LABELS[DEFAULT_LANGUAGE]["default_prompt"] + labels = UI_LABELS[DEFAULT_LANGUAGE] + + # 本地化的属性名称映射 + return { + "required": { + labels["language"]: (["zh", "en"], {"default": DEFAULT_LANGUAGE}), + labels["user_prompt"]: ("STRING", { + "multiline": True, + "default": default_prompt + }), + labels["shot_size"]: (get_options("shot_size"), {"default": UI_LABELS_DATA[DEFAULT_LANGUAGE].get("none_option", "none")}), + labels["lighting_type"]: (get_options("lighting_type"), {"default": UI_LABELS_DATA[DEFAULT_LANGUAGE].get("none_option", "none")}), + labels["light_source"]: (get_options("light_source"), {"default": UI_LABELS_DATA[DEFAULT_LANGUAGE].get("none_option", "none")}), + labels["color_tone"]: (get_options("color_tone"), {"default": UI_LABELS_DATA[DEFAULT_LANGUAGE].get("none_option", "none")}), + labels["camera_angle"]: (get_options("camera_angle"), {"default": UI_LABELS_DATA[DEFAULT_LANGUAGE].get("none_option", "none")}), + labels["lens"]: (get_options("lens"), {"default": UI_LABELS_DATA[DEFAULT_LANGUAGE].get("none_option", "none")}), + labels["camera_movement_basic"]: (get_options("camera_movement_basic"), {"default": UI_LABELS_DATA[DEFAULT_LANGUAGE].get("none_option", "none")}), + labels["camera_movement_advanced"]: (get_options("camera_movement_advanced"), {"default": UI_LABELS_DATA[DEFAULT_LANGUAGE].get("none_option", "none")}), + labels["time_of_day"]: (get_options("time_of_day"), {"default": UI_LABELS_DATA[DEFAULT_LANGUAGE].get("none_option", "none")}), + labels["motion"]: (get_options("motion"), {"default": UI_LABELS_DATA[DEFAULT_LANGUAGE].get("none_option", "none")}), + labels["visual_effects"]: (get_options("visual_effects"), {"default": UI_LABELS_DATA[DEFAULT_LANGUAGE].get("none_option", "none")}), + labels["stylization_visual_style"]: (get_options("stylization_visual_style"), {"default": UI_LABELS_DATA[DEFAULT_LANGUAGE].get("none_option", "none")}), + labels["character_emotion"]: (get_options("character_emotion"), {"default": UI_LABELS_DATA[DEFAULT_LANGUAGE].get("none_option", "none")}), + labels["composition"]: (get_options("composition"), {"default": UI_LABELS_DATA[DEFAULT_LANGUAGE].get("none_option", "none")}), + labels["prompt_format"]: ([ + labels["format_professional"], + labels["format_simple"], + labels["format_detailed"] + ], {"default": labels["format_professional"]}) + } + } + + RETURN_TYPES = ("STRING",) + RETURN_NAMES = ("generated_prompt",) + FUNCTION = "generate_video_prompt" + CATEGORY = "UniversalToolkit/Tools" + + def generate_video_prompt(self, **kwargs): + """生成视频提示词""" + + # 创建参数映射以支持本地化的参数名称 + # 将本地化的参数名映射回英文键名 + param_mapping = {} + for lang_code in ["zh", "en"]: + labels = UI_LABELS[lang_code] + for en_key, localized_name in labels.items(): + if en_key in ["language", "user_prompt", "shot_size", "lighting_type", "light_source", + "color_tone", "camera_angle", "lens", "camera_movement_basic", + "camera_movement_advanced", "time_of_day", "motion", "visual_effects", + "stylization_visual_style", "character_emotion", "composition", "prompt_format"]: + param_mapping[localized_name] = en_key + + # 创建选项值的反向映射(本地化文本 -> 键名) + def create_value_to_key_mapping(language): + value_to_key = {} + if language in VIDEO_PRESETS: + for category, items in VIDEO_PRESETS[language].items(): + for key, value in items.items(): + if value: # 只映射非空值 + value_to_key[value] = key + # 处理"无"选项 + none_text = UI_LABELS_DATA[language].get("none_option", "none") + value_to_key[none_text] = "none" + + # 处理prompt_format选项的映射 + labels = UI_LABELS[language] + value_to_key[labels["format_professional"]] = "professional" + value_to_key[labels["format_simple"]] = "simple" + value_to_key[labels["format_detailed"]] = "detailed" + return value_to_key + + # 将本地化参数名和值映射为英文参数名和键名 + params = {} + for key, value in kwargs.items(): + mapped_key = param_mapping.get(key, key) + params[mapped_key] = value + + # 提取参数 + language = params.get("language", DEFAULT_LANGUAGE) + + # 创建当前语言的值到键的映射 + value_to_key = create_value_to_key_mapping(language) + + # 提取并转换参数值 + user_prompt = params.get("user_prompt", UI_LABELS[language]["default_prompt"]) + + # 对于选项类型的参数,需要将本地化文本转换回键名 + def convert_value_to_key(value, default="none"): + if not value: + return default + return value_to_key.get(value, value) + + shot_size = convert_value_to_key(params.get("shot_size")) + lighting_type = convert_value_to_key(params.get("lighting_type")) + light_source = convert_value_to_key(params.get("light_source")) + color_tone = convert_value_to_key(params.get("color_tone")) + camera_angle = convert_value_to_key(params.get("camera_angle")) + lens = convert_value_to_key(params.get("lens")) + camera_movement_basic = convert_value_to_key(params.get("camera_movement_basic")) + camera_movement_advanced = convert_value_to_key(params.get("camera_movement_advanced")) + time_of_day = convert_value_to_key(params.get("time_of_day")) + motion = convert_value_to_key(params.get("motion")) + visual_effects = convert_value_to_key(params.get("visual_effects")) + stylization_visual_style = convert_value_to_key(params.get("stylization_visual_style")) + character_emotion = convert_value_to_key(params.get("character_emotion")) + composition = convert_value_to_key(params.get("composition")) + prompt_format = convert_value_to_key(params.get("prompt_format"), "professional") + + # 验证语言参数 + if language not in VIDEO_PRESETS: + messages = UI_LABELS_DATA.get("messages", {}).get(DEFAULT_LANGUAGE, {}) + unsupported_msg = messages.get("unsupported_language", "Unsupported language") + fallback_msg = messages.get("fallback_to_default", ", fallback to default language") + print(f"[VideoPromptGenerator] {unsupported_msg}: {language}{fallback_msg}: {DEFAULT_LANGUAGE}") + language = DEFAULT_LANGUAGE + + # 获取当前语言的预设数据 + current_presets = VIDEO_PRESETS[language] + current_labels = UI_LABELS[language] + + # 收集所有选择的元素 + selected_elements = [] + + # 定义参数映射 + category_params = { + "shot_size": shot_size, + "lighting_type": lighting_type, + "light_source": light_source, + "color_tone": color_tone, + "camera_angle": camera_angle, + "lens": lens, + "camera_movement_basic": camera_movement_basic, + "camera_movement_advanced": camera_movement_advanced, + "time_of_day": time_of_day, + "motion": motion, + "visual_effects": visual_effects, + "stylization_visual_style": stylization_visual_style, + "character_emotion": character_emotion, + "composition": composition + } + + # 提取选中的非空元素 + for category, value in category_params.items(): + if value != "none" and category in current_presets and value in current_presets[category]: + element_text = current_presets[category][value] + if element_text: # 确保元素文本不为空 + selected_elements.append(element_text) + + # 根据格式生成提示词 + if prompt_format == "professional": + if selected_elements: + cinematic_elements = ",".join(selected_elements) if language == "zh" else ", ".join(selected_elements) + separator = "," if language == "zh" else ", " + generated_prompt = f"{user_prompt}{separator}{cinematic_elements}{current_labels['professional_suffix']}" + else: + generated_prompt = f"{user_prompt}{current_labels['professional_suffix']}" + + elif prompt_format == "detailed": + if selected_elements: + # 按类别组织元素 + shot_elements = [] + lighting_elements = [] + camera_elements = [] + style_elements = [] + + # 分类整理元素 + shot_categories = ["shot_size", "camera_angle", "composition"] + lighting_categories = ["lighting_type", "light_source", "color_tone", "time_of_day"] + camera_categories = ["lens", "camera_movement_basic", "camera_movement_advanced", "motion"] + style_categories = ["visual_effects", "stylization_visual_style", "character_emotion"] + + for category, value in category_params.items(): + if value != "none" and category in current_presets and value in current_presets[category]: + element_text = current_presets[category][value] + if element_text: + if category in shot_categories: + shot_elements.append(element_text) + elif category in lighting_categories: + lighting_elements.append(element_text) + elif category in camera_categories: + camera_elements.append(element_text) + elif category in style_categories: + style_elements.append(element_text) + + # 构建详细提示词 + prompt_parts = [user_prompt] + separator = "," if language == "zh" else ", " + + if language == "zh": + if shot_elements: + prompt_parts.append(f"镜头构图:{separator.join(shot_elements)}") + if lighting_elements: + prompt_parts.append(f"灯光:{separator.join(lighting_elements)}") + if camera_elements: + prompt_parts.append(f"摄像机工作:{separator.join(camera_elements)}") + if style_elements: + prompt_parts.append(f"视觉风格:{separator.join(style_elements)}") + else: + if shot_elements: + prompt_parts.append(f"Shot composition: {separator.join(shot_elements)}") + if lighting_elements: + prompt_parts.append(f"Lighting: {separator.join(lighting_elements)}") + if camera_elements: + prompt_parts.append(f"Camera work: {separator.join(camera_elements)}") + if style_elements: + prompt_parts.append(f"Visual style: {separator.join(style_elements)}") + + prompt_parts.append(current_labels['detailed_suffix'].lstrip(". ")) + connector = "。" if language == "zh" else ". " + generated_prompt = connector.join(prompt_parts) + else: + connector = "。" if language == "zh" else ". " + generated_prompt = f"{user_prompt}{connector}{current_labels['detailed_suffix'].lstrip('. ')}" + + else: # simple format + if selected_elements: + # 选择最重要的几个元素 + key_elements = selected_elements[:3] # 只取前3个元素 + separator = "," if language == "zh" else ", " + generated_prompt = f"{user_prompt}{separator}{separator.join(key_elements)}" + else: + generated_prompt = user_prompt + + # 本地化的输出信息 + messages = UI_LABELS_DATA.get("messages", {}).get(language, {}) + generated_msg = messages.get("generated_prompt", "Generated prompt with") + elements_msg = messages.get("cinematic_elements", "cinematic elements") + selected_msg = messages.get("selected_elements", "Selected elements") + + if language == "zh": + print(f"视频提示词生成器 ({language}): {generated_msg} {len(selected_elements)} {elements_msg}") + else: + print(f"VideoPromptGenerator ({language}): {generated_msg} {len(selected_elements)} {elements_msg}") + + if selected_elements: + print(f"{selected_msg}: {selected_elements}") + + return (generated_prompt,) + +# ComfyUI 节点注册 +NODE_CLASS_MAPPINGS = { + "Video_Prompt_Helper": WanVideoPromptGenerator +} + +# 节点显示名称的本地化映射 +NODE_DISPLAY_NAME_MAPPINGS = { + "Video_Prompt_Helper": "Video Prompt Helper" +} \ No newline at end of file diff --git a/nodes/tools/prompt_presets.json b/nodes/tools/prompt_presets.json new file mode 100644 index 0000000..9e2d744 --- /dev/null +++ b/nodes/tools/prompt_presets.json @@ -0,0 +1,432 @@ +{ + "zh": { + "shot_size": { + "none": "", + "medium_wide_shot": "中景", + "wide_shot": "全景", + "medium_shot": "中景", + "medium_close_up": "中近景", + "extreme_close_up": "大特写", + "clean_single_shot": "单人镜头", + "two_shot": "双人镜头", + "three_shot": "三人镜头", + "group_shot": "群体镜头", + "close_up_shot": "特写镜头", + "long_shot": "远景", + "establishing_shot": "建立镜头", + "medium_long_shot": "中远景", + "extreme_wide_shot": "大远景", + "overhead_wide_shot": "俯视全景" + }, + "lighting_type": { + "none": "", + "natural_light": "自然光", + "studio_lighting": "影棚灯光", + "soft_lighting": "柔光", + "hard_lighting": "硬光", + "dramatic_lighting": "戏剧化灯光", + "rim_lighting": "轮廓光", + "backlighting": "逆光", + "side_lighting": "侧光", + "top_lighting": "顶光", + "bottom_lighting": "底光", + "ambient_lighting": "环境光", + "practical_lighting": "实用灯光" + }, + "light_source": { + "none": "", + "sunlight": "阳光", + "moonlight": "月光", + "candlelight": "烛光", + "firelight": "火光", + "neon_lights": "霓虹灯", + "fluorescent": "荧光灯", + "tungsten": "钨丝灯", + "led_lights": "LED灯", + "street_lights": "路灯", + "car_headlights": "车前灯", + "spotlight": "聚光灯", + "window_light": "窗光" + }, + "color_tone": { + "none": "", + "warm_tones": "暖色调", + "cool_tones": "冷色调", + "neutral_tones": "中性色调", + "vibrant_colors": "鲜艳色彩", + "muted_colors": "柔和色彩", + "monochromatic": "单色调", + "high_contrast": "高对比度", + "low_contrast": "低对比度", + "desaturated": "去饱和色彩", + "oversaturated": "过饱和色彩", + "sepia_tone": "棕褐色调", + "blue_tint": "蓝色调" + }, + "camera_angle": { + "none": "", + "eye_level": "平视角度", + "high_angle": "俯视角度", + "low_angle": "仰视角度", + "birds_eye": "鸟瞰视角", + "worms_eye": "虫眼视角", + "dutch_angle": "荷兰角度", + "over_shoulder": "过肩镜头", + "point_of_view": "主观视角", + "profile_shot": "侧面镜头", + "three_quarter": "四分之三角度", + "frontal_shot": "正面镜头", + "back_shot": "背面镜头" + }, + "lens": { + "none": "", + "wide_angle": "广角镜头", + "ultra_wide": "超广角镜头", + "telephoto": "长焦镜头", + "macro": "微距镜头", + "fisheye": "鱼眼镜头", + "standard_lens": "标准镜头", + "portrait_lens": "人像镜头", + "zoom_lens": "变焦镜头", + "prime_lens": "定焦镜头", + "tilt_shift": "移轴镜头", + "anamorphic": "变形镜头" + }, + "camera_movement_basic": { + "none": "", + "static_shot": "静态镜头", + "pan_left": "向左摇摆", + "pan_right": "向右摇摆", + "tilt_up": "向上倾斜", + "tilt_down": "向下倾斜", + "zoom_in": "推镜", + "zoom_out": "拉镜", + "dolly_in": "推轨前进", + "dolly_out": "推轨后退", + "track_left": "向左跟拍", + "track_right": "向右跟拍", + "track_forward": "向前跟拍", + "track_backward": "向后跟拍" + }, + "camera_movement_advanced": { + "none": "", + "steadicam": "斯坦尼康", + "handheld": "手持拍摄", + "crane_shot": "升降镜头", + "jib_shot": "摇臂镜头", + "drone_shot": "航拍镜头", + "underwater": "水下拍摄", + "aerial_shot": "空中镜头", + "helicopter_shot": "直升机镜头", + "car_mount": "车载拍摄", + "gimbal": "云台稳定器", + "motion_control": "运动控制", + "bullet_time": "子弹时间" + }, + "time_of_day": { + "none": "", + "dawn": "黎明", + "sunrise": "日出", + "morning": "早晨", + "noon": "正午", + "afternoon": "下午", + "sunset": "日落", + "dusk": "黄昏", + "night": "夜晚", + "midnight": "午夜", + "late_night": "深夜", + "early_morning": "凌晨", + "golden_hour": "黄金时段" + }, + "motion": { + "none": "", + "slow_motion": "慢动作", + "fast_motion": "快动作", + "normal_speed": "正常速度", + "time_lapse": "延时摄影", + "freeze_frame": "定格画面", + "motion_blur": "运动模糊", + "sharp_motion": "清晰运动", + "smooth_motion": "平滑运动", + "jerky_motion": "抖动运动", + "fluid_motion": "流畅运动", + "staccato_motion": "断奏运动", + "graceful_motion": "优雅运动" + }, + "visual_effects": { + "none": "", + "lens_flare": "镜头光晕", + "rain": "雨滴", + "fog": "雾气", + "smoke": "烟雾", + "fire": "火焰", + "explosion": "爆炸", + "lightning": "闪电", + "snow": "雪花", + "dust": "灰尘", + "particles": "粒子效果", + "glow": "发光效果", + "reflection": "反射效果" + }, + "stylization_visual_style": { + "none": "", + "cinematic": "电影风格", + "documentary": "纪录片风格", + "action": "动作风格", + "romance": "浪漫风格", + "horror": "恐怖风格", + "comedy": "喜剧风格", + "drama": "戏剧风格", + "sci_fi": "科幻风格", + "fantasy": "奇幻风格", + "noir": "黑色电影", + "western": "西部风格", + "period": "古装风格" + }, + "character_emotion": { + "none": "", + "happy": "开心", + "sad": "悲伤", + "angry": "愤怒", + "fearful": "恐惧", + "surprised": "惊讶", + "disgusted": "厌恶", + "confident": "自信", + "nervous": "紧张", + "calm": "平静", + "excited": "兴奋", + "melancholy": "忧郁", + "joyful": "喜悦" + }, + "composition": { + "none": "", + "rule_of_thirds": "三分法", + "symmetrical": "对称构图", + "asymmetrical": "非对称构图", + "leading_lines": "引导线", + "framing": "框架构图", + "depth_of_field": "景深", + "shallow_focus": "浅景深", + "deep_focus": "深景深", + "low_angle": "低角度", + "high_angle": "高角度", + "eye_level": "平视角度", + "dutch_angle": "倾斜角度" + } + }, + "en": { + "shot_size": { + "none": "", + "medium_wide_shot": "Medium Wide Shot", + "wide_shot": "Wide Shot", + "medium_shot": "Medium Shot", + "medium_close_up": "Medium Close Up", + "extreme_close_up": "Extreme Close Up", + "clean_single_shot": "Clean Single Shot", + "two_shot": "Two Shot", + "three_shot": "Three Shot", + "group_shot": "Group Shot", + "close_up_shot": "Close Up Shot", + "long_shot": "Long Shot", + "establishing_shot": "Establishing Shot", + "medium_long_shot": "Medium Long Shot", + "extreme_wide_shot": "Extreme Wide Shot", + "overhead_wide_shot": "Overhead Wide Shot" + }, + "lighting_type": { + "none": "", + "natural_light": "Natural Light", + "studio_lighting": "Studio Lighting", + "soft_lighting": "Soft Lighting", + "hard_lighting": "Hard Lighting", + "dramatic_lighting": "Dramatic Lighting", + "rim_lighting": "Rim Lighting", + "backlighting": "Backlighting", + "side_lighting": "Side Lighting", + "top_lighting": "Top Lighting", + "bottom_lighting": "Bottom Lighting", + "ambient_lighting": "Ambient Lighting", + "practical_lighting": "Practical Lighting" + }, + "light_source": { + "none": "", + "sunlight": "Sunlight", + "moonlight": "Moonlight", + "candlelight": "Candlelight", + "firelight": "Firelight", + "neon_lights": "Neon Lights", + "fluorescent": "Fluorescent", + "tungsten": "Tungsten", + "led_lights": "LED Lights", + "street_lights": "Street Lights", + "car_headlights": "Car Headlights", + "spotlight": "Spotlight", + "window_light": "Window Light" + }, + "color_tone": { + "none": "", + "warm_tones": "Warm Tones", + "cool_tones": "Cool Tones", + "neutral_tones": "Neutral Tones", + "vibrant_colors": "Vibrant Colors", + "muted_colors": "Muted Colors", + "monochromatic": "Monochromatic", + "high_contrast": "High Contrast", + "low_contrast": "Low Contrast", + "desaturated": "Desaturated", + "oversaturated": "Oversaturated", + "sepia_tone": "Sepia Tone", + "blue_tint": "Blue Tint" + }, + "camera_angle": { + "none": "", + "eye_level": "Eye Level", + "high_angle": "High Angle", + "low_angle": "Low Angle", + "birds_eye": "Bird's Eye", + "worms_eye": "Worm's Eye", + "dutch_angle": "Dutch Angle", + "over_shoulder": "Over the Shoulder", + "point_of_view": "Point of View", + "profile_shot": "Profile Shot", + "three_quarter": "Three Quarter", + "frontal_shot": "Frontal Shot", + "back_shot": "Back Shot" + }, + "lens": { + "none": "", + "wide_angle": "Wide Angle", + "ultra_wide": "Ultra Wide", + "telephoto": "Telephoto", + "macro": "Macro", + "fisheye": "Fisheye", + "standard_lens": "Standard Lens", + "portrait_lens": "Portrait Lens", + "zoom_lens": "Zoom Lens", + "prime_lens": "Prime Lens", + "tilt_shift": "Tilt Shift", + "anamorphic": "Anamorphic" + }, + "camera_movement_basic": { + "none": "", + "static_shot": "Static Shot", + "pan_left": "Pan Left", + "pan_right": "Pan Right", + "tilt_up": "Tilt Up", + "tilt_down": "Tilt Down", + "zoom_in": "Zoom In", + "zoom_out": "Zoom Out", + "dolly_in": "Dolly In", + "dolly_out": "Dolly Out", + "track_left": "Track Left", + "track_right": "Track Right", + "track_forward": "Track Forward", + "track_backward": "Track Backward" + }, + "camera_movement_advanced": { + "none": "", + "steadicam": "Steadicam", + "handheld": "Handheld", + "crane_shot": "Crane Shot", + "jib_shot": "Jib Shot", + "drone_shot": "Drone Shot", + "underwater": "Underwater", + "aerial_shot": "Aerial Shot", + "helicopter_shot": "Helicopter Shot", + "car_mount": "Car Mount", + "gimbal": "Gimbal", + "motion_control": "Motion Control", + "bullet_time": "Bullet Time" + }, + "time_of_day": { + "none": "", + "dawn": "Dawn", + "sunrise": "Sunrise", + "morning": "Morning", + "noon": "Noon", + "afternoon": "Afternoon", + "sunset": "Sunset", + "dusk": "Dusk", + "night": "Night", + "midnight": "Midnight", + "late_night": "Late Night", + "early_morning": "Early Morning", + "golden_hour": "Golden Hour" + }, + "motion": { + "none": "", + "slow_motion": "Slow Motion", + "fast_motion": "Fast Motion", + "normal_speed": "Normal Speed", + "time_lapse": "Time Lapse", + "freeze_frame": "Freeze Frame", + "motion_blur": "Motion Blur", + "sharp_motion": "Sharp Motion", + "smooth_motion": "Smooth Motion", + "jerky_motion": "Jerky Motion", + "fluid_motion": "Fluid Motion", + "staccato_motion": "Staccato Motion", + "graceful_motion": "Graceful Motion" + }, + "visual_effects": { + "none": "", + "lens_flare": "Lens Flare", + "rain": "Rain", + "fog": "Fog", + "smoke": "Smoke", + "fire": "Fire", + "explosion": "Explosion", + "lightning": "Lightning", + "snow": "Snow", + "dust": "Dust", + "particles": "Particles", + "glow": "Glow", + "reflection": "Reflection" + }, + "stylization_visual_style": { + "none": "", + "cinematic": "Cinematic", + "documentary": "Documentary", + "action": "Action", + "romance": "Romance", + "horror": "Horror", + "comedy": "Comedy", + "drama": "Drama", + "sci_fi": "Sci-Fi", + "fantasy": "Fantasy", + "noir": "Noir", + "western": "Western", + "period": "Period" + }, + "character_emotion": { + "none": "", + "happy": "Happy", + "sad": "Sad", + "angry": "Angry", + "fearful": "Fearful", + "surprised": "Surprised", + "disgusted": "Disgusted", + "confident": "Confident", + "nervous": "Nervous", + "calm": "Calm", + "excited": "Excited", + "melancholy": "Melancholy", + "joyful": "Joyful" + }, + "composition": { + "none": "", + "rule_of_thirds": "Rule of Thirds", + "symmetrical": "Symmetrical", + "asymmetrical": "Asymmetrical", + "leading_lines": "Leading Lines", + "framing": "Framing", + "depth_of_field": "Depth of Field", + "shallow_focus": "Shallow Focus", + "deep_focus": "Deep Focus", + "low_angle": "Low Angle", + "high_angle": "High Angle", + "eye_level": "Eye Level", + "dutch_angle": "Dutch Angle" + } + } +} \ No newline at end of file diff --git a/nodes/tools/prompt_ui_labels.json b/nodes/tools/prompt_ui_labels.json new file mode 100644 index 0000000..86a362d --- /dev/null +++ b/nodes/tools/prompt_ui_labels.json @@ -0,0 +1,80 @@ +{ + "zh": { + "language": "语言", + "user_prompt": "用户提示词", + "shot_size": "镜头大小", + "lighting_type": "灯光类型", + "light_source": "光源", + "color_tone": "色调", + "camera_angle": "摄像机角度", + "lens": "镜头", + "camera_movement_basic": "基础摄像机运动", + "camera_movement_advanced": "高级摄像机运动", + "time_of_day": "时间", + "motion": "运动", + "visual_effects": "视觉效果", + "stylization_visual_style": "视觉风格", + "character_emotion": "角色情感", + "composition": "构图", + "prompt_format": "提示词格式", + "default_prompt": "一个美丽的场景", + "professional_suffix": ",专业电影质量,高细节,4K分辨率", + "detailed_suffix": "。专业电影制作,高质量,详细渲染", + "format_professional": "专业", + "format_simple": "简单", + "format_detailed": "详细", + "none_option": "无" + }, + "en": { + "language": "Language", + "user_prompt": "User Prompt", + "shot_size": "Shot Size", + "lighting_type": "Lighting Type", + "light_source": "Light Source", + "color_tone": "Color Tone", + "camera_angle": "Camera Angle", + "lens": "Lens", + "camera_movement_basic": "Camera Movement Basic", + "camera_movement_advanced": "Camera Movement Advanced", + "time_of_day": "Time of Day", + "motion": "Motion", + "visual_effects": "Visual Effects", + "stylization_visual_style": "Visual Style", + "character_emotion": "Character Emotion", + "composition": "Composition", + "prompt_format": "Prompt Format", + "default_prompt": "A beautiful scene", + "professional_suffix": ", professional cinematic quality, high detail, 4K resolution", + "detailed_suffix": ". Professional cinematic production, high quality, detailed rendering", + "format_professional": "Professional", + "format_simple": "Simple", + "format_detailed": "Detailed", + "none_option": "none" + }, + "messages": { + "zh": { + "load_message": "[Self Nodes] 已加载以下节点:", + "detected_locale": "检测到中文语言环境", + "using_default": "语言检测失败,使用默认中文", + "unsupported_language": "不支持的语言", + "fallback_to_default": ",回退到默认语言", + "generated_prompt": "已生成包含", + "cinematic_elements": "个电影元素的提示词", + "selected_elements": "选中的元素" + }, + "en": { + "load_message": "[Self Nodes] Loaded the following nodes:", + "detected_locale": "Detected non-Chinese locale", + "using_default": "Language detection failed, using default Chinese", + "unsupported_language": "Unsupported language", + "fallback_to_default": ", fallback to default language", + "generated_prompt": "Generated prompt with", + "cinematic_elements": "cinematic elements", + "selected_elements": "Selected elements" + } + }, + "display_names": { + "zh": "🎬 视频提示词生成器", + "en": "🎬 Video Prompt Generator" + } +} \ No newline at end of file