From a storyboard,
Make an animation.
Ollama + Qwen3 · ComfyUI + Qwen-Image-2.1 · Native H3. Windows RTX 4090 and Apple Silicon Mac dual routes. Text, pictures, and videos are all local, including model parameters, 8 workflows, automatic subtitles, dubbing mixing, and 30-second automatic editing.
STEP 01 / 15
Select the machine first: all three items are local and run in order of stages.
For 3D animated shorts: use Ollama for scripts and storyboards, Qwen-Image-2.1 for character reference images and each shot’s first frame, and MiniMax H3 for short clips with sound. Edit locally, starting with six shots totaling about 30 seconds.
| stage | Accurate model and parameters | Usage in this article |
|---|---|---|
| text | Qwen3-30B-A3B-Instruct-2507:Total 30.5B, activated about 3.3B | Ollama Tags qwen3:30b-a3b-instruct-2507-q4_K_M; Approximately 19GB download. |
| pictures | Qwen-Image-2.1:7B generator + independent 8B encoder | Use INT8 ConvRot on Windows and BF16 on Mac. Disable the additional prompt enhancer; no additional 9B model is needed. |
| video | MiniMax H3:33B dense generator + independent 32B encoder | Windows uses the pruned, quantized version. After approximately 13B AdaLN parameters are precomputed or pruned, around 20B generator parameters remain for inference. 33B is the original generator's parameter count. |
Windows 11, RTX 4090 24GB, 64GB system memory, NVMe free about 200GB. The 24GB video memory uses text, images, and videos to be loaded in stages, and the encoder and generator are dynamically managed by ComfyUI.
Apple Silicon, macOS 15 or newer. The complete H3 production route is planned based on Max-class chips, 128GB unified memory and high-performance SSD, with about 350GB free; first use the verification file to check the loading, and then use the native 768p quality file.
- Confirm the machine, disk space and usage range, and choose the Windows or Mac route.
STEP 02 / 15
Create a project directory and save characters, first frames and shots separately
Use the folder structure below. Keep a master copy of the approved character reference, and save each shot’s prompt, seed, workflow and output. Regenerate only the shots that need revision.
My3DShort/
00_story/ 剧本、分镜、角色设定
01_character/ 阿木定妆主图
02_first_frames/ shot01.png ... shot06.png
03_video/ shot01.mp4 ... shot06.mp4
04_edit/ 剪辑工程、字幕、最终成片
workflows/ 当前使用的JSONWorkflow is downloaded directly from this site
Save the JSON and drag it into the ComfyUI canvas, or use "Open" in the menu. These files are UI workflows,Not an API request JSON. The image node needs to re-upload its own file; it cannot keep the sample file name and click run directly.
30-second production sheet: "Late Package"
There are six shots in the entire film, and each shot is delivered for 5 seconds. First let the audience understand "can't catch up", then reveal "someone has been waiting", and finally reverse it with a gift. Fixed the setting sun shining in from the left side of the picture, the bench on the right side, and the red ribbon and the character's clothing wrapped around it. The line of sight and prop position are maintained when the camera switches.
| Mirror number / time | First frame and main action | Mirror and sound |
|---|---|---|
| 01 · 00–05 seconds | Medium long shot: Amu is on the left, holding the package with both hands, looking at the empty platform on the right, shoulders slowly falling. | Use a locked-off camera or a gentle push-in, with the sound of a departing train. Keep the parcel held against the character's chest. |
| 02 · 05–10 seconds | Close shot of the parcel: the pose of the hands is connected to the camera; a small piece of red ribbon is gently lifted by the wind. | Light from the same side, the red band points to the right of the screen; there is a gentle sound of wind and paper. |
| 03 · 10–15 seconds | Close shot of Amuzhong: Keeping his hands and the package in place, he only raises his eyes to look to the right side of the screen. | Eyes directed to the bench; nudge. You can use the short phrase "Are you still waiting for me?" |
| 04 · 15–20 seconds | Reverse mid shot: The gray-haired grandma is sitting on a bench wearing a beige cardigan, waving gently to the left side of the screen. | Grandma looked at Amu. The short sentence "It's you I'm waiting for." The voices are unified later. |
| 05 · 20–25 seconds | Mid-shot of two people: In the first frame, the handover pose has been taken. Amu hands the package forward, and grandma reaches out to catch it steadily. | The package is still between the two; with a simple handing motion, there is a sound of paper scraping. |
| 06 · 25–30 seconds | Medium close shot: Grandma has taken out a small scarf in her hand, Amu looks at the scarf and smiles. | Eliminate the unpacking process by borrowing clips. Grandma said, "To the person who delivers the package." She left an emoticon at the last second. |
Create a fixed character reference for the grandmother too: short gray hair, a beige knitted cardigan, a dark-green long skirt and soft, rounded 3D materials. For two-character first frames, connect her reference in the editing workflow to image_3, and specified in the prompt word <image3> Only restrain grandma. Shot 6 directly creates the first frame of "scarf taken out" to complete the unpacking process.
Extended to shot-by-shot production files using local Qwen3
The production prompt below defines the story, characters, first-frame reference relationships and H3 audiovisual fields. Save each of the six shot prompts separately, then check the camera axis and parcel position against the table above.
You are directing a 3D animated short using local tools. Produce an actionable production plan for an original 30-second short, The Late Parcel.
Fixed assets: Amu, short chestnut hair, brown eyes, an orange raincoat with the hood down, a navy crossbody bag and dark boots; a kraft-paper parcel with a red ribbon; a small-town railway platform at warm sunset, with light entering from frame left and a bench on frame right.
Six shots, 5 seconds each: Amu looks dejected on the platform → wind lifts the parcel's red ribbon → Amu follows the ribbon with his gaze toward the bench on the right → an elderly woman is waiting there → Amu hands her the parcel → she takes out a small scarf for Amu, revealing the twist.
First provide character and scene asset tables. Then provide a six-shot table with shot number, 5-second duration, shot size, first-frame composition, one main action, camera position and subtle movement, prop and eyeline continuity, ambient sound, optional brief dialogue and approval criteria.
For each shot, provide an English layout-image prompt, a Qwen first-frame-editing prompt and an H3 video prompt. Reference image 1 is that shot's 1344×768 layout; reference image 2 is the character reference. For multiple-character shots, also include the same elderly woman's character reference.
Use single-first-frame I2VA for H3. The first line must read verbatim: “For the target video, at 0.00 seconds into the target video, <Picture 1> (from [Shot 1]) is fully referenced."; after a blank line, only use the three fields integrated_multimodal_description, overall_soundscape, and non_diegetic_music. Each independent file starts from [Shot 1], anchoring the first frame and then writing actions, camera movements and results; only one subject action is arranged for each shot. The music field defaults to N/A.
The dialogue uses (S1) Amu and (S2) Grandma, the timbre description is outside the label, and the lines are inside<d>[Chinese]台词。</d>with no more than 12 Chinese characters per line. Omit dialogue for the ambient-sound-only version.
Keep characters, clothing, lighting positions, eyelines and the parcel handover position consistent. Output production content only.- The project directory has been created and the workflow files for the corresponding platforms have been saved.
STEP 03 / 15
Windows: Install Ollama and unzip the NVIDIA version of ComfyUI
Use uniformly below D:\AI. If there is no D drive, copy all of this article D:\AI Change it to a directory with enough space. Update the NVIDIA driver first, and then execute it one by one in PowerShell; when the installer pops up, follow the interface to complete the installation.
New-Item -ItemType Directory -Path 'D:\AI' -Force | Out-Null
Set-Location 'D:\AI'
curl.exe -L --fail --retry 3 -o OllamaSetup.exe https://ollama.com/download/OllamaSetup.exe
.\OllamaSetup.exe
curl.exe -L --fail --retry 3 -o ComfyUI_windows_portable_nvidia.7z https://github.com/Comfy-Org/ComfyUI/releases/download/v0.43.0/ComfyUI_windows_portable_nvidia.7zComplete decompression
Unzip it with 7-Zip and confirm it exists.
D:\AI\ComfyUI_windows_portable\ComfyUI\main.pyandpython_embeded\python.exe. Don't run it in a compressed package.first start
Double click
run_nvidia_gpu.bat. Terminal appearshttp://127.0.0.1:8188Finally, open this local address in the browser and keep the terminal open.Check operating equipment
The startup log should identify NVIDIA RTX 4090 / CUDA; if there is only CPU, solve the driver or package architecture issue first. Do not download AMD, ARM or old CUDA compatibility packages.
The standard Portable already contains Python and a matching runtime; there is no need to install the entire CUDA Toolkit for this article. First use the following command to turn off Ollama's cloud function, then exit from the tray and reopen Ollama:
[Environment]::SetEnvironmentVariable('OLLAMA_NO_CLOUD','1','User')- Ollama is installed; the ComfyUI native page can be opened and the startup log identifies NVIDIA GPUs.
STEP 04 / 15
Ollama: pull accurate tags, generate character settings and storyboards
Don't just type qwen3 or latest: They are not equal to the 30.5B model in this article. Open a new PowerShell and execute:
ollama pull qwen3:30b-a3b-instruct-2507-q4_K_M
ollama run qwen3:30b-a3b-instruct-2507-q4_K_MType first after entering the conversation /set parameter num_ctx 8192, and then copy the following production prompt words. This Instruct tag is in non-thinking mode.
You are directing a 3D animated short using local tools. Produce an actionable production plan for an original 30-second short, The Late Parcel.
Fixed assets: Amu, short chestnut hair, brown eyes, an orange raincoat with the hood down, a navy crossbody bag and dark boots; a kraft-paper parcel with a red ribbon; a small-town railway platform at warm sunset, with light entering from frame left and a bench on frame right.
Six shots, 5 seconds each: Amu looks dejected on the platform → wind lifts the parcel's red ribbon → Amu follows the ribbon with his gaze toward the bench on the right → an elderly woman is waiting there → Amu hands her the parcel → she takes out a small scarf for Amu, revealing the twist.
First provide character and scene asset tables. Then provide a six-shot table with shot number, 5-second duration, shot size, first-frame composition, one main action, camera position and subtle movement, prop and eyeline continuity, ambient sound, optional brief dialogue and approval criteria.
For each shot, provide an English layout-image prompt, a Qwen first-frame-editing prompt and an H3 video prompt. Reference image 1 is that shot's 1344×768 layout; reference image 2 is the character reference. For multiple-character shots, also include the same elderly woman's character reference.
Use single-first-frame I2VA for H3. The first line must read verbatim: “For the target video, at 0.00 seconds into the target video, <Picture 1> (from [Shot 1]) is fully referenced."; after a blank line, only use the three fields integrated_multimodal_description, overall_soundscape, and non_diegetic_music. Each independent file starts from [Shot 1], anchoring the first frame and then writing actions, camera movements and results; only one subject action is arranged for each shot. The music field defaults to N/A.
The dialogue uses (S1) Amu and (S2) Grandma, the timbre description is outside the label, and the lines are inside<d>[Chinese]台词。</d>with no more than 12 Chinese characters per line. Omit dialogue for the ambient-sound-only version.
Keep characters, clothing, lighting positions, eyelines and the parcel handover position consistent. Output production content only.Local API can be called directly
Keep Ollama running and the following requests are only sent to this machine 127.0.0.1:11434。keep_alive=0 Let the model be unloaded after this answer to make room for the picture stage.
$storyRequest = @{
model = 'qwen3:30b-a3b-instruct-2507-q4_K_M'
messages = @(@{role='user'; content='为原创3D动画短剧写6个镜头。角色是橙色雨衣、短栗色头发、深蓝斜挎包的阿木;每镜只安排一个主要动作,列出首帧、运镜和环境声。'})
stream = $false
keep_alive = 0
options = @{num_ctx=8192; temperature=0.7}
} | ConvertTo-Json -Depth 8
$storyResult = Invoke-RestMethod -Uri 'http://127.0.0.1:11434/api/chat' -Method Post -ContentType 'application/json; charset=utf-8' -Body ([Text.Encoding]::UTF8.GetBytes($storyRequest))
$storyResult.message.contentInteractive dialogue end input /bye. Before drawing, confirm that the text model no longer resides:
ollama stop qwen3:30b-a3b-instruct-2507-q4_K_M
ollama ps- Storyboards and character settings are saved; the native API answers, and Ollama releases the model before the image is generated.
STEP 05 / 15
Qwen-Image-2.1: Download Three Files and Create a Character Reference
Three files approx. 16.10GiB. Execute the entire paragraph below in PowerShell and save it to the correct model category directory in Portable. Repeated execution will re-download the file with the same name; if the download fails, the error will be processed first and the file extension will not be modified.
$comfyRoot = 'D:\AI\ComfyUI_windows_portable\ComfyUI'
$modelRepo = 'Comfy-Org/Qwen-Image-2.1'
$modelFiles = @(
'diffusion_models/qwen_image_2.1_int8_convrot.safetensors'
'text_encoders/qwen3vl_8b_int8_convrot.safetensors'
'vae/qwen_image_2.1_vae_bf16.safetensors'
)
foreach ($modelFile in $modelFiles) {
$destination = Join-Path (Join-Path $comfyRoot 'models') $modelFile
New-Item -ItemType Directory -Path (Split-Path $destination) -Force | Out-Null
curl.exe -L --fail --retry 3 --output $destination "https://huggingface.co/$modelRepo/resolve/main/$modelFile"
if ($LASTEXITCODE -ne 0) { throw "下载失败,请先处理:$modelFile" }
}After downloading, restart ComfyUI and import this site’s Windows character-reference workflow. Check that the generator, encoder and VAE selectors contain the files you just downloaded; refine_prompt Close, the prompt word enhancer PE is not a required model.
| settings | Final Character Reference |
|---|---|
| resolution/batch | 1024 × 1024 / 1 |
| steps / CFG | 40 / 1 (25 steps for quick composition preview) |
| sampler / scheduler | euler / simple |
| seed | Fix a number and save it to facilitate successive comparisons |
| output | Save Image Save PNG, copy one to 01_character/ |
The positive cue words are copied below. When CFG=1, negative cue words do not produce CFG guidance; priority is given to writing the identity, composition and material clearly.
Original stylized cinematic 3D animation character, Amu, a young courier boy with short chestnut hair, warm brown eyes, rounded expressive face, orange raincoat with hood down, navy crossbody satchel, dark boots. Full-body three-quarter character portrait, both hands visible, neutral warm-grey studio background, clear silhouette, soft cinematic key light, subtle subsurface skin, tactile woven fabric, physically plausible materials, restrained filmic color. One character, clean studio composition.- A master image of the character that has been inspected for face shape, hands, and clothing has been generated and saved.
STEP 06 / 15
Build the Layout, Then Use the Character Reference for Each First Frame
The first frame establishes character and composition. Edit with a layout image at the target aspect ratio plus a character reference image: set the shot first, then bring in the correct identity.
Generate the mirror layout
Open the text-to-image workflow used for the character reference, then change Resolution Selector to 16:9、0.98MP、multiple=32, confirm the output 1344×768. Replace with the layout prompt word below and save it as
shot01-layout.png. The layout is responsible for scenes, locations, gestures, and props.Access reference map
Import "First Frame Edit".
image_1Upload the newly generated 1344×768 layout;image_2Upload the acceptedamu-character.png. The latter specifically constrains faces, clothing and materials. Connect the corresponding interfaces from the two Load Image nodes on the canvas.Keep layout frame
keep
resolution=0、custom_size=false, 40 steps, CFG=1, euler / simple,refine_prompt=false, use the editing tip word below. 25 steps for composition preview. The output size follows the 1344×768 of image_1.Lens-by-lens acceptance and archiving
Save in sequence
shot01.pngtoshot06.png. Compare face shape, hair color, clothing, bag strap and boots against the character reference. Zoom in to check fingers, contact with props and shadows under the feet, then verify eyelines, parcel position and lighting. Keep the reference character’s identity constraints when revising this shot’s composition.
Stylized cinematic 3D animation opening frame, quiet small-town train platform at golden hour. A young courier boy with short chestnut hair, orange raincoat with hood down, navy crossbody satchel and dark boots stands on the left third, holding a small kraft-paper parcel with a red ribbon at chest height, looking toward the right. Medium-wide eye-level composition, warm sunlight from screen left, wooden bench in the background to the right, coherent tactile materials, clear hand and parcel silhouettes. Clean composition with open space on the right.Use <image1> as the exact composition, camera, canvas and station layout. Use <image2> as the identity and outfit reference for Amu. Replace only the boy in <image1> with this same Amu: exact face, short chestnut hair, orange raincoat with hood down, navy crossbody satchel and dark boots from <image2>. Keep the parcel with its red ribbon, hand positions, gaze direction, warm light from screen left and the bench on screen right. Match the stylized 3D materials from <image2>. Preserve the width and height of <image1>.Use a copy of the first frame at the matching dimensions for the video check. For the low-resolution check, scale proportionally and add centered padding to reach 864×480. The quality preset uses the 1344×768 master image directly. Save the PNG, prompt, seed and JSON for each approved shot. Restart ComfyUI before video generation to release the image model from memory.
- The first frames of the six shots have the same frame, the character reference is accurate, and the identity, hands, props, and shot continuity have all been checked.
STEP 07 / 15
H3: Download the Local Image-to-Video Model and Use Local Nodes
Windows five-piece package 39.14GiB. Both video VAE and audio VAE are required; 8-step LoRA is prepared together to facilitate template model inspection and subsequent comparison, but this article first Turn off Turbo。
$comfyRoot = 'D:\AI\ComfyUI_windows_portable\ComfyUI'
$modelRepo = 'Comfy-Org/MiniMax-H3'
$modelFiles = @(
'diffusion_models/minimax_h3_fl2va_pruned_int8_convrot.safetensors'
'text_encoders/qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors'
'vae/minimax_h3_video_vae_int8_convrot.safetensors'
'vae/minimax_h3_audio_vae_fp32.safetensors'
'loras/minimax_h3_fl2v_turbo_8step_v1.0_comfyui_bf16.safetensors'
)
foreach ($modelFile in $modelFiles) {
$destination = Join-Path (Join-Path $comfyRoot 'models') $modelFile
New-Item -ItemType Directory -Path (Split-Path $destination) -Force | Out-Null
curl.exe -L --fail --retry 3 --output $destination "https://huggingface.co/$modelRepo/resolve/main/$modelFile"
if ($LASTEXITCODE -ne 0) { throw "下载失败,请先处理:$modelFile" }
}Restart ComfyUI and import the Windows video-check workflow. Upload your own first frame in Load Image. Keep the image-to-video subgraph connected to Save Video. A request for a cloud API key indicates that you selected the wrong node.
- The five models are in the correct directory, the workflow can recognize them, and the input is their first frame.
STEP 08 / 15
Do a verification first, then upgrade to the native 768p quality file
Arrange one main action in one shot, and first control it to about 5 seconds. Outer layer Resolution Selector The connection line will cover the width and height of the sub-picture; changing only the sub-picture number will not take effect.
| parameters | Verification file | Formal quality file |
|---|---|---|
| outer aspect | 16:9 (Widescreen) | 16:9 (Widescreen) |
| megapixels / multiple | 0.4 / 32 | 0.98 / 32 |
| Actual width and height | 864 × 480 | 1344 × 768 |
| duration / batch | 5 / 1 | 5 / 1 |
| Turbo / steps | false / 20 | false / 20 |
| Bootstrap and Coding | Keep default BasicGuider, 24fps | Keep default BasicGuider, 24fps |
Keep the outer settings at 0.98MP / multiple=32 for 1344×768 output; 1.0MP selects a larger aligned canvas. With Turbo=false, the template runs the Base branch with 20 sampling steps. Static values inside the unused Turbo branch do not affect this run.
For the target video, at 0.00 seconds into the target video, <Picture 1> (from [Shot 1]) is fully referenced.
integrated_multimodal_description: [Shot 1] Stylized cinematic 3D animation, the opening medium-wide composition matches <Picture 1>. Amu keeps the same face, short chestnut hair, orange raincoat, navy satchel and dark boots. He holds the red-ribbon parcel steadily at chest height and looks toward the empty platform on screen right; his shoulders slowly settle in disappointment. The camera pushes in with small amplitude at slow speed. Warm sunlight stays on screen left and the wooden bench remains on screen right. The shot follows one continuous restrained movement.
overall_soundscape: A distant train fades into a soft station hum. A light breeze brushes the coat fabric.
non_diegetic_music: N/APrompt words are organized according to "first frame → action → sound"
The first row above is anchored to the first frame at 0 seconds.integrated_multimodal_description Write character movements, camera positions and dialogue;overall_soundscape Write environmental sounds and action sounds;non_diegetic_music When writing the soundtrack, this film will be filled in first. N/A. Each time a shot is generated, the shot number starts from [Shot 1] Start.
To do the dialogue in the third shot, first change to the first frame of the shot, and then use the example below. vocal description and (S1) Put it outside the label and put the Chinese lines in it <d>[Chinese]…</d>. A short dialogue in one shot, and a final expression.
For the target video, at 0.00 seconds into the target video, <Picture 1> (from [Shot 1]) is fully referenced.
integrated_multimodal_description: [Shot 1] Stylized cinematic 3D animation, the opening medium-wide composition matches <Picture 1>. Amu keeps the same face, short chestnut hair, orange raincoat, navy satchel and dark boots. He holds the red-ribbon parcel steadily at chest height and lifts his eyes toward the bench on screen right. Amu, a young boy with a clear warm mid-high voice and unhurried Mandarin delivery (S1), says: <d>[Chinese] 还在等我?</d> His expression shifts from disappointment to curiosity. The camera pushes in with small amplitude at slow speed. Warm sunlight stays on screen left and the wooden bench remains on screen right. The shot follows one continuous restrained movement.
overall_soundscape: A distant train fades into a soft station hum. A light breeze brushes the coat fabric.
non_diegetic_music: N/AWhen the timbre needs to be unified across shots, use the entire local dubbing track from step 15; the H3 dialogue within the shot can be used for lip sync and rhythm demos. The character ID is responsible for the speaker reference in the prompt words, and the continuous dubbing track is responsible for the final timbre.
Verify it first
Upload the first frame that matches the frame, fill in the prompt word above, click Run, and observe the progress of the terminal. The first run completes the loading of the encoder, generator and VAE in sequence. The terminal should continuously display the stage progress, and observe the execution status in combination with video memory and system memory.
Check the output
Save video to
ComfyUI/output/video/. Check whether there are black frames, character drift, hand deformation, background jumps in the entire section, and whether the ambient sound is normal.Improve quality again
After the verification file passes, import the quality file, reselect the first frame and check the drop-down model. If OOM occurs, return to 0.4MP, batch=1, and stop other GPU work; do not run for 15 seconds at the beginning.
- The verification file completes audio and video output, and the quality file passes character, hand, movement and background checks frame by frame.
STEP 09 / 15
Mac: Preparing for Apple Silicon, Standalone Python Environments, and Native Pages
Mac route usage Apple Silicon + macOS 15 or newer, uniformly installed to ~/AI. Full 768p production is planned with Max-class chips and 128GB unified memory. Text, pictures and videos are run sequentially, and the model is released at the end of each stage; the verification file first checks the engine and path.
Run the development tool installation in the terminal first, complete the system pop-up window and then continue:
xcode-select --installSkip the first step if you have Homebrew installed. Confirm the initial installation as prompted, and complete the PATH settings given by the installer; Apple Silicon can usually load the current terminal environment using the second line below:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
eval "$(/opt/homebrew/bin/brew shellenv)"
brew install python@3.12 ffmpeg ollama
mkdir -p ~/AI
cd ~/AI
git clone --branch v0.43.0 --depth 1 https://github.com/Comfy-Org/ComfyUI.git
cd ComfyUI
python3.12 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install torch torchvision torchaudio
python -m pip install -r requirements.txt
python -c "import torch; print('MPS:', torch.backends.mps.is_available()); print(torch.ones(1, device='mps'))"MPS should be True and the tensor should display device='mps:0'. If it fails, first deal with the system, Python architecture and dependencies, and do not use the CUDA installation command. Then start:
cd ~/AI/ComfyUI
source .venv/bin/activate
python main.py --cpu-vaeBrowser opens http://127.0.0.1:8188. The Mac images in this article use the CPU VAE compatible path, and the decoding will be slower; the generator can still use MPS. The terminal remains open.
- Mac's MPS check succeeds, ComfyUI native page opens, ffmpeg / ffprobe available.
STEP 10 / 15
Mac Ollama: Local services, same precise tags and APIs
If there is already an Ollama App or service running, set it up first launchctl setenv OLLAMA_NO_CLOUD 1, then exit completely and reopen the app; confirm using local tabs. Do not start a second service instance repeatedly. Run from a terminal the first time you use the CLI:
OLLAMA_NO_CLOUD=1 ollama serveKeep the service terminal open and open a new terminal to pull and run the model. Enter conversation input /set parameter num_ctx 8192, and then copy the complete storyboard prompt in step 4.
ollama pull qwen3:30b-a3b-instruct-2507-q4_K_M
ollama run qwen3:30b-a3b-instruct-2507-q4_K_MMac native API requests
curl --fail http://127.0.0.1:11434/api/chat -H 'Content-Type: application/json' -d '{"model":"qwen3:30b-a3b-instruct-2507-q4_K_M","messages":[{"role":"user","content":"为原创3D动画短剧写6镜分镜。主角阿木穿橙色雨衣、背深蓝斜挎包,每镜仅一个主要动作,保持同一角色。"}],"stream":false,"keep_alive":0,"options":{"num_ctx":8192,"temperature":0.7}}'Returns JSON message.content contains the generated content. Save it in the project directory and confirm that the model has been unloaded from memory before generating images or video:
ollama stop qwen3:30b-a3b-instruct-2507-q4_K_M
ollama ps- Text services and APIs on Mac use local addresses, storyboards have been saved, and models have been released.
STEP 11 / 15
Mac images use BF16 and do not reuse the Windows CUDA quantization package.
The image generator is about 14.23GB, the encoder is about 17.53GB, and the VAE is about 0.68GB. The total size is about 32.44GB Download; additional memory required to run. Use a separate download tool environment and do not mix download tools into ComfyUI.
python3.12 -m venv ~/AI/hf-tools
~/AI/hf-tools/bin/python -m pip install --upgrade huggingface_hub
~/AI/hf-tools/bin/hf download Comfy-Org/Qwen-Image-2.1 diffusion_models/qwen_image_2.1_bf16.safetensors text_encoders/qwen3vl_8b_bf16.safetensors vae/qwen_image_2.1_vae_bf16.safetensors --local-dir ~/AI/ComfyUI/modelsRestart ComfyUI and import this site’s Mac character-reference and first-frame-editing workflows. Select BF16 filenames and the dedicated VAE; disable refine_prompt. Do not use the Windows INT8 ConvRot or H3 NVFP4 packages for the MPS workflow.
Use the same character-reference prompts as steps 5 and 6, with 40 steps, CFG=1 and a fixed seed for the character and first frames. Use 25 steps for quick composition previews. After approving the images, stop Ollama and use Ctrl+C Close ComfyUI, configure the H3 engine and then start it again to avoid contention between the image model and the video process for unified memory.
- Mac has generated the character and first frame; the image model has been released before starting the video.
STEP 12 / 15
Mac Video: Compile native Metal engine, download only FL2VA
For Mac h3.c native C/Metal engine, and then receive the same ComfyUI in the next step. This is the community advanced route. FL2VA original weight approx. 144.05GB / 134.16GiB, unlike the Windows quantization package.
cd ~/AI
git clone https://github.com/antirez/h3.c.git
cd h3.c
git checkout 8974cc055ea9c02fcd14cc27dfda3e1027c05153
make -j8
./h3 --help
ffmpeg -version
ffprobe -versionKeep the complete h3.c directory, which needs to be in the same directory when running h3_shaders.metal. Continue to download hf-tools from the previous step:
~/AI/hf-tools/bin/hf download MiniMaxAI/MiniMax-H3 --revision 42ed227ee7df40d41602854ae760620d6eb651fe --include 'FL2VA/*' 'model_index.json' --local-dir ~/AI/h3.c/MiniMax-H3
cd ~/AI/h3.c
./h3 --info -d ./MiniMax-H3The correct structure should MiniMax-H3/FL2VA/transformer、text_encoder、tokenizer、processor、video_vae、audio_vae。--info Just checking the model directory and device does not mean that the video has been generated.
- h3 is compiled, ffmpeg is available, FL2VA weights are complete and --info is recognized.
STEP 13 / 15
Connect Local H3 to ComfyUI: Image-to-Video in Three Nodes
Install the fixed version of the Wild H3C bridge, which starts the h3 engine locally and does not call the MiniMax cloud API.
cd ~/AI/ComfyUI/custom_nodes
git clone https://github.com/skaiy/wild-h3c-comfyui.git
cd wild-h3c-comfyui
git checkout e08057decfe3083a9270b05cac255c0101a7208e
cat > config.json <<'JSON'
{
"h3_binary": "~/AI/h3.c/h3",
"model_dir": "~/AI/h3.c/MiniMax-H3"
}
JSON
cd ~/AI/ComfyUI
source .venv/bin/activate
python main.py --cpu-vae --offlinemodel_dir Points to the outer directory containing FL2VA. After modifying config.json, restart ComfyUI. Import the "Mac·Video Verification File" of this site, the connection is:
first_frame→Save Video
| settings | Device verification | Formal quality file |
|---|---|---|
| width × height | 512 × 512 | 1344 × 768 |
| seconds | 1.0 | 5.0 |
| steps / preset | 20 / precise | 50 / precise |
| seed | 42 / fixed | 42 / fixed |
| token_reduction | false | false |
| ssd_streaming | Default is false; insufficient capacity can be evaluated individually | Default false; evaluated based on machine conditions |
Upload the first frame that matches the proportion, and the video prompt word remains the same as step 8. After successful verification, switch the quality level: 1344×768, 5 seconds, 50 steps.precise=50 layers, reuse=1, with every denoising pass performed in full. Keep token_reduction=false and disable ssd_streaming initially. Use Save Video to save MP4 / H.264 output.
When the ComfyUI node reports an error, locate it separately first.
Use the following command in the terminal to do a local engine check. Replace the first frame path with your real PNG absolute path; the command cannot be run with a placeholder path as it is.
cd ~/AI/h3.c
mkdir -p outputs
cat > shot01-prompt.txt <<'PROMPT'
For the target video, at 0.00 seconds into the target video, <Picture 1> (from [Shot 1]) is fully referenced.
integrated_multimodal_description: [Shot 1] Stylized cinematic 3D animation, the opening medium-wide composition matches <Picture 1>. Amu keeps the same face, short chestnut hair, orange raincoat, navy satchel and dark boots. He holds the red-ribbon parcel steadily at chest height and looks toward the empty platform on screen right; his shoulders slowly settle in disappointment. The camera pushes in with small amplitude at slow speed. Warm sunlight stays on screen left and the wooden bench remains on screen right. The shot follows one continuous restrained movement.
overall_soundscape: A distant train fades into a soft station hum. A light breeze brushes the coat fabric.
non_diegetic_music: N/A
PROMPT
./h3 --profile -d ./MiniMax-H3 --first-frame /absolute/path/shot01.png -p "$(cat shot01-prompt.txt)" --width 1344 --height 768 --seconds 5 --steps 50 --layers 50 --reuse 1 --seed 42 -o outputs/shot01.mp4If the terminal engine can generate and bridge but fails, check config.json, first frame path, ffmpeg PATH and node version. When the bridge cannot find the command, launch ComfyUI from a terminal with the Homebrew environment loaded.
- The local engine and ComfyUI workflow each have playable video output, and the picture and sound are checked.
STEP 14 / 15
The three items must be disconnected and generated once respectively to complete the local acceptance.
First download all models, templates and dependencies, and then do the following checks.The native API can answer, and it can be done locally without separately proving pictures and videos.No cloud model tags or premium API nodes are used.
text
After disconnecting from the network, post a new question to 127.0.0.1:11434 with the exact label and confirm that a new answer is generated. Keep the OLLAMA_NO_CLOUD settings and do not use the -cloud tag.
pictures
Restart ComfyUI offline, load the character-reference workflow, generate and save a new image with a new seed. Confirm that you are viewing a fresh result rather than the previous cached preview.
video
Stop the text and image tasks, load the native H3 workflow, use the new seed to generate a short shot, save and play it, and confirm that there is real output and no remote request dependencies.
Offline startup command after download is completed
Windows runs in the Portable root directory:
Set-Location 'D:\AI\ComfyUI_windows_portable'
.\python_embeded\python.exe -s ComfyUI\main.py --windows-standalone-build --offlineMac running in terminal:
cd ~/AI/ComfyUI
source .venv/bin/activate
python main.py --cpu-vae --offline| phenomenon | Priority check |
|---|---|
| Model is not in the dropdown list | Whether it is placed in the correct category of models; whether the extension and complete download are correct; restart ComfyUI. |
| Missing node/Unknown node | Confirm ComfyUI v0.43.0; Windows uses local core workflow, Mac video requires Wild H3C, restart to see the import log. |
| 4090 CUDA OOM | Stop Ollama first, turn off other GPU tasks, restart ComfyUI and load only the video; batch=1, return to 0.4MP short shot, check the 64GB system memory and page file space. |
| The old parameters don’t seem to have changed | The baseline of this article defaults to dynamic video memory management, and --lowvram is not used as a general fix; confirm the outer resolution input and the current execution branch. |
| Mac memory pressure or large swap | First release the image model and zoom out; SSD streaming changes some of the weight retention and loading speed, and rearranges the capacity according to process peaks. |
| Mac can't find h3 or ffmpeg | Check the compilation results, config.json outer directory, and Homebrew PATH; first use the terminal diagnostic command to locate it. |
| Unsteady face, hands, or clothing | First correct the relationship between the first frame and the reference, simplify the single-shot action, and then change the seed for comparison; don't just pile more steps. |
- Text, pictures, and videos have been generated separately after disconnection, and the new results and corresponding logs have been saved.
STEP 15 / 15
Six 30-second shots: automatic composition, subtitles, mixing and delivery
Six qualified shots were selected according to the production list, and then unified into a 30-second film with 120 frames per shot and 720 frames for the entire film. Final delivery specs: 1344×768, 24fps, H.264, 48kHz stereo AAC.
Local automated editing chain: from footage to delivery
Use storyboards to organize the narrative, and use automation to complete repetitive tasks: sequential assembly of six shots, material duration check, unification of frame size and frame rate, dubbing and mixing, automatic suppression of background sounds when speaking, fading of the beginning and end of music, Chinese voice subtitle conversion, whole film loudness calibration and export specification check. All audio and video processing and speech recognition run natively.
Check the face shape, hands, and contact with props frame by frame; the clothing, bag straps, and light positions of adjacent mirrors are connected to the line of sight. After the verification file passes, the official footage is regenerated using the native 768p quality file.
Each shot completes an information point, and the actions before and after have cause and effect. The short dialogue is clear and has complete beginnings and endings; the human voice is higher than the ambient sound, the volume at the cut is smooth, and the expression is left at the end.
1. Preparing FFmpeg with six lenses
Mac was installed in step 9. Windows Reopen Terminal after PowerShell installation:
winget install --id Gyan.FFmpeg --exact --source wingetCopy the output of the quality file to the same folder and name it shot01.mp4 to shot06.mp4. Each segment must be at least 5 seconds long, with continuous images and complete audio tracks; select MP4 / H.264 in ComfyUI’s Save Video and save. Download the following script to this folder.
2. Unified voice: record a dubbing locally
The same actor recorded the entire line in a quiet room. Use Sound Recorder for Windows and QuickTime Player → File → New Audio Recording for Mac. After recording, align the six shots in time in the local editing software and export exactly 30 seconds of stereo sound narration.wav, retaining the silence when there are no lines. This version of the H3 shot is generated based on the ambient sound prompt words, and the final dialogue is borne by the entire dubbing; the opening dialogue mirror must align the mouth shape step by step, and the narration mirror keeps the lips closed.
When you need to convert recordings to 48kHz WAV:
ffmpeg -i voice-recording.m4a -ar 48000 -ac 2 narration.wavAutomatic Chinese subtitles: Whisper large-v3-turbo · 809M
Multilingual speech recognition model using 809M parameters, 30 seconds after alignment narration.wav Convert to SRT with timeline. The model is approximately 1.62GB and runs offline after the first download. Both Windows and Mac use a standalone Python 3.12 environment, CPU INT8; separate from ComfyUI's GPU environment.
Windows: Install Python 3.12 first, then reopen PowerShell, then create a dedicated environment and download the fixed version model:
winget install --id Python.Python.3.12 --exact --source winget
py -3.12 -m venv D:\AI\subtitle-tools
& 'D:\AI\subtitle-tools\Scripts\python.exe' -m pip install --upgrade pip
& 'D:\AI\subtitle-tools\Scripts\python.exe' -m pip install 'faster-whisper==1.2.1' 'ctranslate2==4.8.4'
& 'D:\AI\subtitle-tools\Scripts\python.exe' -c "from huggingface_hub import snapshot_download; snapshot_download(repo_id='dropbox-dash/faster-whisper-large-v3-turbo', revision='0a363e9161cbc7ed1431c9597a8ceaf0c4f78fcf', local_dir=r'D:\AI\models\whisper-turbo')"Mac: Using Python 3.12 installed earlier:
python3.12 -m venv ~/AI/subtitle-tools
~/AI/subtitle-tools/bin/python -m pip install --upgrade pip
~/AI/subtitle-tools/bin/python -m pip install 'faster-whisper==1.2.1' 'ctranslate2==4.8.4'
~/AI/subtitle-tools/bin/python -c "from huggingface_hub import snapshot_download; from pathlib import Path; snapshot_download(repo_id='dropbox-dash/faster-whisper-large-v3-turbo', revision='0a363e9161cbc7ed1431c9597a8ceaf0c4f78fcf', local_dir=str(Path.home()/'AI/models/whisper-turbo'))"Place the subtitle script in the shot directory and execute it from that directory. Windows:
& 'D:\AI\subtitle-tools\Scripts\python.exe' .\h3-subtitles-v2.py .\narration.wav .\captions.srt --model 'D:\AI\models\whisper-turbo'Mac:
~/AI/subtitle-tools/bin/python ./h3-subtitles-v2.py ./narration.wav ./captions.srt --model ~/AI/models/whisper-turboThe script strips by actual word-level timestamps, pauses and punctuation, and outputs UTF-8 captions.srt with captions.asr.json. Time to proofread names, sentence fragments, and first/last words. When using H3 native dialogue, first export it using the production script rough.mp4, identify the file, and then add the obtained subtitles to the final version. Subtitle times are based on the final 30-second timeline. When Windows encounters a CTranslate2 DLL loading error, reopen the terminal after installing the Microsoft Visual C++ 2015–2022 x64 runtime.
3. Automatic film composition, mixing, subtitles and export
Prepare a piece of your own or licensed local music music.wav, at least 30 seconds in length. Combine music, aligned dubbing, and proofreading captions.srt and six MP4s in the footage catalog. Open PowerShell in Windows and use Portable's built-in Python:
D:\AI\ComfyUI_windows_portable\python_embeded\python.exe .\h3-finish-v2.py . --narration .\narration.wav --music .\music.wav --srt .\captions.srt --output final.mp4Mac running in the same lens directory:
python3.12 ./h3-finish-v2.py . --narration ./narration.wav --music ./music.wav --srt ./captions.srt --output final.mp4Keep as needed --narration、--music、--srt; When an item is omitted, it is deleted together with the following path. The script first checks the input, then scales/fills frame by frame, converts to 24fps, takes the first 120 frames, and unifies the audio track to 48kHz. When dubbing, the ambient sound and music are automatically suppressed, and the beginning and end of the music are faded by 0.5 seconds. The entire film is processed twice for loudness, with a target of about -16 LUFS and a maximum peak target of -2 dBTP. Output MP4 with switchable Chinese subtitle track and generate final.report.json, record the actual number of frames, duration, number of audio tracks, subtitles and measured loudness. The original material is retained, and new names are used if there are existing output files.
4. Local timeline and subtitle refinement: Shotcut
Windows and Mac use the same native editing interface. Windows installation:
winget install --id Meltytech.Shotcut --exact --source wingetMac installation:
brew install --cask shotcutconstruction project
Open Shotcut and save the new project to
04_edit;Convert the masterfinal.mp4Drag to timeline. The video mode is set to custom 1344×768, 24fps, consistent with the master version.Alignment and inspection
Use the timeline playhead to check shot by shot, dragging the dubbing clip to align the start and end of the speech. The entire dubbing is exported as narration.wav in WAV and then handed over to the final script; the subtitles are refined on the master version. No more than two lines per screen, keeping faces and key props clear.
Add subtitles
open View / View → Subtitles / Subtitles, create a new subtitle track, add lines and set the start and end time; if there is an SRT, import it through the subtitle panel. Proofread names, typos, sentence fragmentation and mouth patterns, and export a separate SRT file first.
Burn and export
in timeline Output / output add Subtitle: Burn In Filter, select subtitle track and font. Preview to confirm subtitles are displayed before exporting to H.264 MP4, maintaining 1344×768, 24fps and 48kHz audio track. Save your Shotcut project so you can continue tweaking it.
Play the final version in full screen: examine faces and hands, every line of dialogue, first and last black frames, transitions and voiceover continuations. Archive raw footage, PNGs, prompts, workflows, recordings, SRTs and editing sessions together.
- The 30-second master has been exported, the 720 frames/24fps/48kHz audio track has passed inspection, and the screen, dialogue, subtitles and lens continuity acceptance have been completed.
Version baseline: 2026-10-28 · ComfyUI v0.43.0 · Windows CUDA/Mac Metal. Three local mysteries, complete a 30-second animated short based on a six-shot production sheet.
Frequently Asked Questions
Several questions before starting and after filming
How to make a 3D animated short drama with a film-like feel?
Work in this order: character references, scene layouts, first-frame editing, shot generation, take selection and consistent voice tracks. Lock face shape and materials first, then lighting, eyelines and props. Shape information and emotion in the edit. Use step 2’s six-shot production plan throughout.
How do the three work together locally?
Qwen3 provides local text API at 127.0.0.1:11434; Qwen-Image-2.1 generates characters and first frames in ComfyUI; H3 completes audio and video in the same ComfyUI. Windows uses the CUDA core node, and Mac uses the native Metal engine bridge. After downloading the model, follow step 14 for disconnection acceptance.
How to allocate the video memory of 4090?
Text, pictures, and videos run in stages. After the text is completed, ollama stop releases the model; after the first frame is completed, restart ComfyUI and then load only the video workflow. Equipped with 64GB system memory and NVMe, the default memory management is used to complete the segmented loading of encoders and generators.
What parameters are used for Mac quality files?
Plan for a Max-class Apple Silicon chip and 128GB unified memory. The H3 quality preset uses 1344×768, seconds=5, 50 steps, precise and token_reduction=false. The precise setting uses 50 layers and reuse=1. Start with the 512×512 check preset to verify the engine, paths, video and audio output.
What are 33B, 20B and 32B of H3?
33B is the original dense generator; ~13B of the AdaLN part can be precomputed and clipped, and ~20B of the generator inference part. 32B is an independent encoder. Download and run capacity require taking into account generator, encoder, VAE and working memory.
Why is 5 seconds of footage cut to 120 frames?
The model time grid is 17k+5 frames. This article uses seconds=5 to get 124 frames, about 5.17 seconds. In the later stage, each shot takes 120 frames. The six lenses are unified to 720 frames, which is 30 seconds at 24fps.
How do you keep characters and voices consistent across shots?
Edit all first frames from the same character reference, keeping clothing, materials and lighting fixed, then check each shot. Use one local voice track from the same performer for consistent dialogue and align it to the picture. A fixed seed helps compare takes; reference images and shot-by-shot checks control identity.