diff --git a/README.md b/README.md index 61a37b0..6338ceb 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,9 @@ ### 4. Volcengine Doubao Seedance - 豆包Seedance视频生成节点 (新增) - 火山引擎豆包Seedance视频生成模型 -- 支持文生视频和图生视频两种模式 +- 支持文生视频、图生视频和首尾帧图生视频三种模式 +- 支持两种模型:pro和lite-i2v版本 +- lite-i2v模型支持首尾帧图生视频(传入2张图片) - 支持所有模型文本命令参数:分辨率、宽高比、时长、帧率等 - 支持多种视频分辨率:480p、720p、1080p - 支持9种宽高比和2种特殊比例模式 @@ -99,10 +101,10 @@ pip install -r requirements.txt 2. 添加 `Volcengine Doubao Seedance` 节点 3. 配置参数: - **ark_api_key**: 火山方舟API密钥 - - **model**: 模型ID (默认doubao-seedance-1-0-pro-250528) + - **model**: 模型ID (doubao-seedance-1-0-pro-250528 或 doubao-seedance-1-0-lite-i2v-250428) - **prompt**: 视频生成提示词,支持中英文 - - **image**: 输入图片 (可选,图生视频模式) - - **image_role**: 图片角色 (可选,first_frame或last_frame) + - **first_frame**: 首帧图片 (可选,图生视频模式) + - **last_frame**: 尾帧图片 (可选,首尾帧图生视频模式) - **resolution**: 视频分辨率 (可选,480p/720p/1080p) - **ratio**: 视频宽高比 (可选,9种比例+特殊模式) - **duration**: 视频时长 (可选,5秒或10秒) @@ -189,13 +191,25 @@ pip install -r requirements.txt - 16fps → 较低帧率 - 24fps → 标准帧率(默认) -- **图片角色**(图生视频模式): - - first_frame → 首帧图片(默认) - - last_frame → 尾帧图片 +- **图片输入方式**(图生视频模式): + - first_frame → 首帧图片输入 + - last_frame → 尾帧图片输入 + +- **模型选择**: + - doubao-seedance-1-0-pro-250528 → 专业版模型,支持文生视频和单图生视频 + - doubao-seedance-1-0-lite-i2v-250428 → 轻量版图生视频模型,支持首尾帧图生视频 + +- **使用模式**: + - 文生视频:仅输入提示词 + - 首帧图生视频:连接first_frame输入+提示词 + - 尾帧图生视频:连接last_frame输入+提示词 + - 首尾帧图生视频:连接first_frame和last_frame输入+提示词(推荐使用lite-i2v模型) - **使用建议**: - 提示词描述要清晰具体,避免过于抽象 - 图生视频模式下,输入图片质量会影响生成效果 + - 首尾帧模式下,两张图片的宽高比应该一致,系统会以首帧为准自动裁剪尾帧 + - 参数名称直观:first_frame表示首帧,last_frame表示尾帧,用户一目了然 - 建议根据实际需求选择合适的分辨率和时长 - 使用keep_ratio或adaptive可以更好地适配输入图片 @@ -251,8 +265,11 @@ pip install -r requirements.txt ### Doubao Seedance 特定注意事项 (新增) - 视频生成为异步处理,通常需要几分钟时间 - 程序会自动轮询查询结果,请耐心等待 -- 支持文生视频和图生视频两种模式 +- 支持文生视频、图生视频和首尾帧图生视频三种模式 - 图生视频模式下,输入图片质量会影响生成效果 +- 首尾帧模式需要使用lite-i2v模型,连接first_frame和last_frame两个输入 +- 首尾帧图片的宽高比不一致时,以首帧图片为主,尾帧会自动裁剪适配 +- 参数名称已优化:first_frame和last_frame直观明确,无需额外的角色设置 - 生成的视频URL有效期为24小时,请及时下载保存 - 输入图片和提示词需要通过内容审核 - 建议根据实际用途选择合适的分辨率和时长参数 @@ -290,6 +307,8 @@ pip install -r requirements.txt - **提示词审核未通过**: 检查提示词内容是否符合平台规范 - **图片审核未通过**: 检查输入图片内容是否符合平台规范 - **参数错误**: 确认所有参数值是否在支持范围内 +- **首尾帧图片错误**: 使用首尾帧模式时确保正确连接first_frame和last_frame输入 +- **模型与功能不匹配**: pro模型不支持首尾帧,lite-i2v模型专为图生视频设计 - **任务超时**: 可能服务器繁忙,可稍后重试 - **视频生成失败**: 检查提示词和参数设置,重新尝试 - **下载失败**: 网络连接问题,检查网络状态 @@ -321,7 +340,8 @@ pip install -r requirements.txt - 支持异步任务提交和轮询查询机制 - 完整的模型文本命令参数支持 - 智能图片格式转换和Base64编码 -- 支持文生视频和图生视频两种模式 +- 支持文生视频、图生视频和首尾帧图生视频三种模式 +- 支持多张图片输入和角色配置 - 完善的错误处理和重试机制 - 视频文件自动下载和命名管理 - 支持所有官方模型参数配置 diff --git a/nodes/volcengine_doubao_seedance.py b/nodes/volcengine_doubao_seedance.py index bab386d..e5f6926 100644 --- a/nodes/volcengine_doubao_seedance.py +++ b/nodes/volcengine_doubao_seedance.py @@ -23,7 +23,7 @@ class VolcengineDoubaoSeedance: "multiline": False, "tooltip": "火山方舟API密钥" }), - "model": (["doubao-seedance-1-0-pro-250528"], { + "model": (["doubao-seedance-1-0-pro-250528", "doubao-seedance-1-0-lite-i2v-250428"], { "default": "doubao-seedance-1-0-pro-250528", "tooltip": "模型ID" }), @@ -34,12 +34,11 @@ class VolcengineDoubaoSeedance: }), }, "optional": { - "image": ("IMAGE", { - "tooltip": "输入图片(图生视频模式)" + "first_frame": ("IMAGE", { + "tooltip": "首帧图片(图生视频模式)" }), - "image_role": (["first_frame", "last_frame"], { - "default": "first_frame", - "tooltip": "图片角色:首帧或尾帧" + "last_frame": ("IMAGE", { + "tooltip": "尾帧图片(首尾帧图生视频模式,配合lite-i2v模型使用)" }), "resolution": (["480p", "720p", "1080p"], { "default": "720p", @@ -264,7 +263,7 @@ class VolcengineDoubaoSeedance: print(f"下载视频时发生错误: {str(e)}") return None - def generate_video(self, ark_api_key, model, prompt, image=None, image_role="first_frame", + def generate_video(self, ark_api_key, model, prompt, first_frame=None, last_frame=None, resolution="720p", ratio="adaptive", duration=5, framepersecond=24, watermark=False, seed=-1, camerafixed=False, filename_prefix="doubao_seedance"): """主要的视频生成函数""" @@ -292,23 +291,55 @@ class VolcengineDoubaoSeedance: "text": text_with_commands }) - # 如果有图片,添加图片内容(图生视频模式) - if image is not None: - print("检测到输入图片,使用图生视频模式") - image_base64 = self.image_to_base64(image) - - image_content = { - "type": "image_url", - "image_url": { - "url": image_base64 + # 处理图片输入(图生视频模式) + if first_frame is not None or last_frame is not None: + if first_frame is not None and last_frame is not None: + print("检测到首尾帧图片,使用首尾帧图生视频模式") + # 处理首帧图片 + first_frame_base64 = self.image_to_base64(first_frame) + first_frame_content = { + "type": "image_url", + "image_url": { + "url": first_frame_base64 + }, + "role": "first_frame" } - } - - # 如果指定了图片角色,添加role字段 - if image_role in ["first_frame", "last_frame"]: - image_content["role"] = image_role - - content_list.append(image_content) + content_list.append(first_frame_content) + + # 处理尾帧图片 + last_frame_base64 = self.image_to_base64(last_frame) + last_frame_content = { + "type": "image_url", + "image_url": { + "url": last_frame_base64 + }, + "role": "last_frame" + } + content_list.append(last_frame_content) + + elif first_frame is not None: + print("检测到首帧图片,使用图生视频模式") + first_frame_base64 = self.image_to_base64(first_frame) + first_frame_content = { + "type": "image_url", + "image_url": { + "url": first_frame_base64 + }, + "role": "first_frame" + } + content_list.append(first_frame_content) + + elif last_frame is not None: + print("检测到尾帧图片,使用图生视频模式") + last_frame_base64 = self.image_to_base64(last_frame) + last_frame_content = { + "type": "image_url", + "image_url": { + "url": last_frame_base64 + }, + "role": "last_frame" + } + content_list.append(last_frame_content) else: print("使用文生视频模式")