{
  "id": "e68a47ed-7536-485a-8597-dc8fbd2ac52b",
  "revision": 0,
  "last_node_id": 5,
  "last_link_id": 3,
  "nodes": [
    {
      "id": 1,
      "type": "LoadImage",
      "pos": [
        100,
        130
      ],
      "size": [
        282.8,
        320
      ],
      "flags": {},
      "order": 0,
      "mode": 0,
      "inputs": [],
      "outputs": [
        {
          "name": "IMAGE",
          "type": "IMAGE",
          "links": [
            1
          ]
        },
        {
          "name": "MASK",
          "type": "MASK",
          "links": null
        }
      ],
      "properties": {
        "Node name for S&R": "LoadImage"
      },
      "widgets_values": [
        "api_minimax_h3_max_lipsync_input.png",
        "image"
      ],
      "widgets_values_named": {
        "image": "api_minimax_h3_max_lipsync_input.png",
        "upload": "image"
      }
    },
    {
      "id": 2,
      "type": "LoadAudio",
      "pos": [
        101.61294061980271,
        572.2149307478045
      ],
      "size": [
        282.8,
        136
      ],
      "flags": {},
      "order": 1,
      "mode": 0,
      "inputs": [],
      "outputs": [
        {
          "name": "AUDIO",
          "type": "AUDIO",
          "links": [
            2
          ]
        }
      ],
      "properties": {
        "Node name for S&R": "LoadAudio"
      },
      "widgets_values": [
        "api_minimax_h3_max_lipsync_audio.mp3",
        ""
      ],
      "widgets_values_named": {
        "audio": "api_minimax_h3_max_lipsync_audio.mp3",
        "upload": ""
      }
    },
    {
      "id": 3,
      "type": "MinimaxHailuo03MaxLipSyncNode",
      "pos": [
        520,
        130
      ],
      "size": [
        420,
        300
      ],
      "flags": {},
      "order": 3,
      "mode": 0,
      "showAdvanced": true,
      "inputs": [
        {
          "name": "model.image",
          "type": "IMAGE",
          "link": 1
        },
        {
          "name": "model.audio",
          "type": "AUDIO",
          "link": 2
        }
      ],
      "outputs": [
        {
          "name": "VIDEO",
          "type": "VIDEO",
          "links": [
            3
          ]
        }
      ],
      "properties": {
        "Node name for S&R": "MinimaxHailuo03MaxLipSyncNode"
      },
      "widgets_values": [
        "MiniMax H3 Max",
        "768P",
        true,
        42,
        "randomize",
        "randomize"
      ],
      "widgets_values_named": {
        "model": "MiniMax H3 Max",
        "model.resolution": "768P",
        "model.transcription": true,
        "model.seed": 42,
        "control_after_generate#1": "randomize",
        "control_after_generate": "randomize"
      },
      "color": "#432",
      "bgcolor": "#653"
    },
    {
      "id": 4,
      "type": "SaveVideo",
      "pos": [
        1000,
        130
      ],
      "size": [
        453.8,
        300
      ],
      "flags": {},
      "order": 4,
      "mode": 0,
      "inputs": [
        {
          "name": "video",
          "type": "VIDEO",
          "link": 3
        }
      ],
      "outputs": [
        {
          "name": "video",
          "type": "VIDEO",
          "links": null
        }
      ],
      "properties": {},
      "widgets_values": [
        "api_minimax_h3_max_lipsync",
        "auto",
        "auto",
        "auto"
      ],
      "widgets_values_named": {
        "filename_prefix": "api_minimax_h3_max_lipsync",
        "format": "auto",
        "format.codec": "auto",
        "codec": "auto"
      }
    },
    {
      "id": 5,
      "type": "MarkdownNote",
      "pos": [
        -411.7966153212633,
        132.93053609046802
      ],
      "size": [
        441.7276611328125,
        714.5486450195312
      ],
      "flags": {},
      "order": 2,
      "mode": 0,
      "inputs": [],
      "outputs": [],
      "properties": {},
      "widgets_values": [
        "## Lip Sync: MiniMax H3 Max\n\n**Make a still portrait talk.** Give the node a face and a voice track and it animates the mouth to the audio, keeping the rest of the frame still. The clip comes back exactly as long as the audio.\n\n**Input Assets:**\n- [api_minimax_h3_max_lipsync_input.png](https://raw.githubusercontent.com/Comfy-Org/workflow_templates/refs/heads/main/input/api_minimax_h3_max_lipsync_input.png)\n- [api_minimax_h3_max_lipsync_audio.mp3](https://raw.githubusercontent.com/Comfy-Org/workflow_templates/refs/heads/main/input/api_minimax_h3_max_lipsync_audio.mp3)\n---\n\n### What this graph does\n\n1. **Load Image**: the portrait to animate, at least 256 x 256, aspect ratio between 0.4 and 2.5.\n2. **Load Audio**: the voice track, 5 to 899 seconds.\n3. **MiniMax H3 Max Lip Sync**: animates the mouth to the audio.\n4. **Save Video**: writes the MP4.\n\n---\n\n### Controls\n\n| Control | What it does |\n|---|---|\n| `model` | `MiniMax H3 Max` is the only option on this node |\n| `resolution` | `480P`, `768P`, `1080P` or `2K`, default `768P`. The output aspect ratio is the supported one nearest to the image |\n| `transcription` | Transcribes the audio first to guide the lip sync. Off by default; on in this graph |\n| `seed` | Same audio and seed give similar, not identical, results |\n\n---\n\n### Gotchas\n\n- The audio must be at least 5 seconds. A 4.4 second line is rejected before generation, so pad the tail or use a longer take.\n- Output length equals audio length, and there is no duration widget. Trim the audio to the length you want the clip to be.\n- The output is a talking portrait, not a full performance: hands, camera moves and background action are not driven by the audio.\n- Pick a portrait that is already lit the way you want it. The node animates the mouth, it does not relight the shot.\n"
      ],
      "widgets_values_named": {
        "text": "## Lip Sync: MiniMax H3 Max\n\n**Make a still portrait talk.** Give the node a face and a voice track and it animates the mouth to the audio, keeping the rest of the frame still. The clip comes back exactly as long as the audio.\n\n**Input Assets:**\n- [api_minimax_h3_max_lipsync_input.png](https://raw.githubusercontent.com/Comfy-Org/workflow_templates/refs/heads/main/input/api_minimax_h3_max_lipsync_input.png)\n- [api_minimax_h3_max_lipsync_audio.mp3](https://raw.githubusercontent.com/Comfy-Org/workflow_templates/refs/heads/main/input/api_minimax_h3_max_lipsync_audio.mp3)\n---\n\n### What this graph does\n\n1. **Load Image**: the portrait to animate, at least 256 x 256, aspect ratio between 0.4 and 2.5.\n2. **Load Audio**: the voice track, 5 to 899 seconds.\n3. **MiniMax H3 Max Lip Sync**: animates the mouth to the audio.\n4. **Save Video**: writes the MP4.\n\n---\n\n### Controls\n\n| Control | What it does |\n|---|---|\n| `model` | `MiniMax H3 Max` is the only option on this node |\n| `resolution` | `480P`, `768P`, `1080P` or `2K`, default `768P`. The output aspect ratio is the supported one nearest to the image |\n| `transcription` | Transcribes the audio first to guide the lip sync. Off by default; on in this graph |\n| `seed` | Same audio and seed give similar, not identical, results |\n\n---\n\n### Gotchas\n\n- The audio must be at least 5 seconds. A 4.4 second line is rejected before generation, so pad the tail or use a longer take.\n- Output length equals audio length, and there is no duration widget. Trim the audio to the length you want the clip to be.\n- The output is a talking portrait, not a full performance: hands, camera moves and background action are not driven by the audio.\n- Pick a portrait that is already lit the way you want it. The node animates the mouth, it does not relight the shot.\n"
      },
      "color": "#222",
      "bgcolor": "#000"
    }
  ],
  "links": [
    [
      1,
      1,
      0,
      3,
      0,
      "IMAGE"
    ],
    [
      2,
      2,
      0,
      3,
      1,
      "AUDIO"
    ],
    [
      3,
      3,
      0,
      4,
      0,
      "VIDEO"
    ]
  ],
  "groups": [],
  "config": {},
  "extra": {
    "ds": {
      "scale": 0.7513148009015777,
      "offset": [
        1288.9133592256635,
        429.21926644839107
      ]
    },
    "frontendVersion": "1.58.5"
  },
  "extensions": {
    "extra_pnginfo": {
      "workflow": {
        "id": "e68a47ed-7536-485a-8597-dc8fbd2ac52b",
        "revision": 0,
        "last_node_id": 5,
        "last_link_id": 3,
        "nodes": [
          {
            "id": 1,
            "type": "LoadImage",
            "pos": [
              100,
              130
            ],
            "size": [
              282.8,
              320
            ],
            "flags": {},
            "order": 0,
            "mode": 0,
            "inputs": [],
            "outputs": [
              {
                "name": "IMAGE",
                "type": "IMAGE",
                "links": [
                  1
                ]
              },
              {
                "name": "MASK",
                "type": "MASK",
                "links": null
              }
            ],
            "properties": {
              "Node name for S&R": "LoadImage"
            },
            "widgets_values": [
              "api_minimax_h3_max_lipsync_input.png",
              "image"
            ],
            "widgets_values_named": {
              "image": "api_minimax_h3_max_lipsync_input.png",
              "upload": "image"
            }
          },
          {
            "id": 2,
            "type": "LoadAudio",
            "pos": [
              100,
              320
            ],
            "size": [
              282.8,
              120
            ],
            "flags": {},
            "order": 1,
            "mode": 0,
            "inputs": [],
            "outputs": [
              {
                "name": "AUDIO",
                "type": "AUDIO",
                "links": [
                  2
                ]
              }
            ],
            "properties": {
              "Node name for S&R": "LoadAudio"
            },
            "widgets_values": [
              "api_minimax_h3_max_lipsync_audio.mp3"
            ],
            "widgets_values_named": {
              "audio": "api_minimax_h3_max_lipsync_audio.mp3"
            }
          },
          {
            "id": 3,
            "type": "MinimaxHailuo03MaxLipSyncNode",
            "pos": [
              520,
              130
            ],
            "size": [
              420,
              300
            ],
            "flags": {},
            "order": 2,
            "mode": 0,
            "inputs": [
              {
                "name": "model.image",
                "type": "IMAGE",
                "link": 1
              },
              {
                "name": "model.audio",
                "type": "AUDIO",
                "link": 2
              }
            ],
            "outputs": [
              {
                "name": "VIDEO",
                "type": "VIDEO",
                "links": [
                  3
                ]
              }
            ],
            "properties": {
              "Node name for S&R": "MinimaxHailuo03MaxLipSyncNode"
            },
            "widgets_values": [
              "MiniMax H3 Max",
              "768P",
              true,
              42,
              "randomize"
            ],
            "widgets_values_named": {
              "model": "MiniMax H3 Max",
              "model.resolution": "768P",
              "model.transcription": true,
              "model.seed": 42,
              "control_after_generate": "randomize"
            }
          },
          {
            "id": 4,
            "type": "SaveVideo",
            "pos": [
              1000,
              130
            ],
            "size": [
              453.8,
              300
            ],
            "flags": {},
            "order": 3,
            "mode": 0,
            "inputs": [
              {
                "name": "video",
                "type": "VIDEO",
                "link": 3
              }
            ],
            "outputs": [
              {
                "name": "video",
                "type": "VIDEO",
                "links": null
              }
            ],
            "properties": {},
            "widgets_values": [
              "api_minimax_h3_max_lipsync",
              "auto",
              "auto",
              "auto"
            ],
            "widgets_values_named": {
              "filename_prefix": "api_minimax_h3_max_lipsync",
              "format": "auto",
              "format.codec": "auto",
              "codec": "auto"
            }
          },
          {
            "id": 5,
            "type": "MarkdownNote",
            "pos": [
              -300,
              620
            ],
            "size": [
              1120,
              860
            ],
            "flags": {},
            "order": 4,
            "mode": 0,
            "inputs": [],
            "outputs": [],
            "properties": {},
            "widgets_values": [
              "## Lip Sync: MiniMax H3 Max\n\n**Make a still portrait talk.** Give the node a face and a voice track and it animates the mouth to the audio, keeping the rest of the frame still. The clip comes back exactly as long as the audio.\n\n---\n\n### What this graph does\n\n1. **Load Image**: the portrait to animate, at least 256 x 256, aspect ratio between 0.4 and 2.5.\n2. **Load Audio**: the voice track, 5 to 899 seconds.\n3. **MiniMax H3 Max Lip Sync**: animates the mouth to the audio.\n4. **Save Video**: writes the MP4.\n\n**Input Assets:** [api_minimax_h3_max_lipsync_input.png](https://raw.githubusercontent.com/Comfy-Org/workflow_templates/refs/heads/main/input/api_minimax_h3_max_lipsync_input.png) — 1344 x 896 · [api_minimax_h3_max_lipsync_input.png](https://raw.githubusercontent.com/Comfy-Org/workflow_templates/refs/heads/main/input/api_minimax_h3_max_lipsync_input.png) — 5.62 seconds, mono 44.1 kHz\n\n---\n\n### Controls\n\n| Control | What it does |\n|---|---|\n| `model` | `MiniMax H3 Max` is the only option on this node |\n| `resolution` | `480P`, `768P`, `1080P` or `2K`, default `768P`. The output aspect ratio is the supported one nearest to the image |\n| `transcription` | Transcribes the audio first to guide the lip sync. Off by default; on in this graph |\n| `seed` | Same audio and seed give similar, not identical, results |\n\n---\n\n### Gotchas\n\n- The audio must be at least 5 seconds. A 4.4 second line is rejected before generation, so pad the tail or use a longer take.\n- Output length equals audio length, and there is no duration widget. Trim the audio to the length you want the clip to be.\n- The output is a talking portrait, not a full performance: hands, camera moves and background action are not driven by the audio.\n- Pick a portrait that is already lit the way you want it. The node animates the mouth, it does not relight the shot.\n"
            ],
            "widgets_values_named": {
              "text": "## Lip Sync: MiniMax H3 Max\n\n**Make a still portrait talk.** Give the node a face and a voice track and it animates the mouth to the audio, keeping the rest of the frame still. The clip comes back exactly as long as the audio.\n\n---\n\n### What this graph does\n\n1. **Load Image**: the portrait to animate, at least 256 x 256, aspect ratio between 0.4 and 2.5.\n2. **Load Audio**: the voice track, 5 to 899 seconds.\n3. **MiniMax H3 Max Lip Sync**: animates the mouth to the audio.\n4. **Save Video**: writes the MP4.\n\n**Input Assets:** [api_minimax_h3_max_lipsync_input.png](https://raw.githubusercontent.com/Comfy-Org/workflow_templates/refs/heads/main/input/api_minimax_h3_max_lipsync_input.png) — 1344 x 896 · [api_minimax_h3_max_lipsync_audio.mp3](https://raw.githubusercontent.com/Comfy-Org/workflow_templates/refs/heads/main/input/api_minimax_h3_max_lipsync_audio.mp3) — 5.62 seconds, mono 44.1 kHz\n\n---\n\n### Controls\n\n| Control | What it does |\n|---|---|\n| `model` | `MiniMax H3 Max` is the only option on this node |\n| `resolution` | `480P`, `768P`, `1080P` or `2K`, default `768P`. The output aspect ratio is the supported one nearest to the image |\n| `transcription` | Transcribes the audio first to guide the lip sync. Off by default; on in this graph |\n| `seed` | Same audio and seed give similar, not identical, results |\n\n---\n\n### Gotchas\n\n- The audio must be at least 5 seconds. A 4.4 second line is rejected before generation, so pad the tail or use a longer take.\n- Output length equals audio length, and there is no duration widget. Trim the audio to the length you want the clip to be.\n- The output is a talking portrait, not a full performance: hands, camera moves and background action are not driven by the audio.\n- Pick a portrait that is already lit the way you want it. The node animates the mouth, it does not relight the shot.\n"
            }
          }
        ],
        "links": [
          [
            1,
            1,
            0,
            3,
            0,
            "IMAGE"
          ],
          [
            2,
            2,
            0,
            3,
            1,
            "AUDIO"
          ],
          [
            3,
            3,
            0,
            4,
            0,
            "VIDEO"
          ]
        ],
        "groups": [],
        "config": {},
        "extra": {
          "ds": {
            "scale": 0.5,
            "offset": [
              120,
              -50
            ]
          },
          "frontendVersion": "1.57.6"
        },
        "version": 0.4
      }
    }
  },
  "version": 0.4
}