闲兔|数字人工作台
Slice one song into shots, then hand them to MiniMax H3
- clip
- vae
- audio_vae
- 条件
- LATENT
- 图像
- 音频
- 秒数
- 预览帧
The name says workbench and it means it - this node is where your digital-human source material lives, and the interesting part is that almost none of it is a graph input. You upload one full music track, cut it into segments on a waveform in the browser, give each segment its own reference images and prompt, and then the node ships the current segment to ComfyUI's native MiniMax H3 reference-to-video encoder. If you're making a singing-avatar or performance-video piece - a fixed audio track, a dozen short clips that each have to land on their beat - this is the piece that turns that from a spreadsheet problem into a queue.
Where it sits in the wider stack: audio-driven avatar work normally means a model that consumes your audio as a driving signal (InfiniteTalk, MultiTalk, Wan S2V - see the audio knowledge base, §3). This pack takes the other route. MiniMax H3 is a 33B omni-modal video model that generates picture and native stereo audio together, so here your uploaded music is passed in as a reference audio alongside your reference images, and H3 generates the performance against it.
How it actually works
studio_state is the whole node. It's a JSON string that the pack's frontend panel writes into the widget - music record, cut points, resolution, and a storyboard.shots array where each shot has images, prompt, optimized_prompt, audio_range and duration_override. On run, the Python side parses and validates it: at least one shot, no more than 500, unique IDs, max 9 images per shot.
Then it does four concrete things.
It loads the active shot's uploaded images off disk through ComfyUI's annotated-path helpers, so a file that's moved or deleted fails loudly instead of silently rendering nothing. It loads the whole music track via comfy_extras.nodes_audio.LoadAudio and slices it to that shot's audio_range - sample-accurate, no re-encode, no drift. It computes the canvas from the workbench resolution: an aspect ratio (9:16, 16:9, 1:1, 3:4, 4:3), a megapixel budget, and a rounding multiple of 8/16/32/64. And it converts your segment duration into frames at 24fps, rounded up to the next 17n+5 - that's H3's length grid, so valid lengths are 5, 22, 39, 56 and so on. Leave length at 0 and it does that arithmetic for you; a 7.3-second slice becomes 180 frames, i.e. a hair over 7.5 seconds of video.
Finally it calls MiniMaxH3ReferenceToVideo from ComfyUI's own H3 extras with your prompt, the reference images, and the sliced audio.
One thing that bites everyone: optimized_prompt is effectively mandatory. If neither it nor the shot's stored optimized prompt has text, the node raises 优化后提示词为空,请连接 Qwen H3 Prompt 的 h3_prompt 输出. The intended chain is the author's other node, ComfyUI_Qwen_H3_Prompt, feeding this input.
Inputs and outputs that matter
Wire clip, vae and audio_vae - H3's text encoder and its two VAEs. ref_image_size is match or max, i.e. crop-to-reference versus scale-to-fit; max is the safe default when your refs have different aspect ratios.
selection_mode (当前分镜 / 勾选分镜 / 从当前开始) is validated and fed into IS_CHANGED, but be clear-eyed: the V1 encode path always renders the active shot. Selecting 勾选分镜 doesn't fan this node out into three segments - the multi-shot queue is the workbench's job, and the node's job is one segment per queue item. Step the active shot, re-queue, or jump to V2 if you want that driven from the graph.
The outputs are 条件 and LATENT (straight into your H3 sampler), 图像 (the reference images, batched to the first image's size), 音频 (the sliced music - this is what you also hand H3 as reference audio, or save as a stem), 秒数 (the segment duration) and 预览帧 (the frame count it requested).
Install
Manager: search the pack title 闲兔 Qwen Image 2.1 工作台 / ComfyUI-Xiantu-QwenImage21-Workbench. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/xiantuhenlan/ComfyUI-Xiantu-QwenImage21-Workbench.git
pip install -r ComfyUI-Xiantu-QwenImage21-Workbench/requirements.txt
Restart ComfyUI and hard-refresh the browser - the frontend panel is served from a versioned directory, so a cached extension after an update is a real and confusing failure. The pack ships no models: the H3 weights (~42.5GB), text encoder and VAEs are yours to source, and H3's community licence excludes the US, EU, UK and Korea from its licensed territory. That's worth checking before you plan a commercial video around it.
Where people get burned
The state JSON is the asset library. Share the workflow without the uploaded files and the other machine gets 上传图片不存在:... or 音轨切断终点必须大于起点 when a cut marker was left inverted. Auto-optimize needs ComfyUI_Qwen_H3_Prompt plus its own llama-server and GGUF in ComfyUI/models/LLM/Qwen3.8; without it, nothing here runs at all, because there's no prompt to encode. And if the panel doesn't show up after updating, force-refresh before you start filing bugs.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| clip | CLIP | — | |
| vae | VAE | — | |
| audio_vae | VAE | — | |
| length | INT | 00–3600 | — |
| ref_image_size | COMBO | 2 options: match, max | |
| studio_state | STRING | {} | — |
| selection_mode | COMBO | 3 options: 当前分镜, 勾选分镜, 从当前开始 | |
| optimized_promptopt | STRING | — |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| 条件 | CONDITIONING | — |
| LATENT | LATENT | — |
| 图像 | IMAGE | — |
| 音频 | AUDIO | — |
| 秒数 | FLOAT | — |
| 预览帧 | INT | — |