MUZHILI
15 guides onlineStart Reading
AI local deployment · Windows / Mac

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.

By Xiao Foye · Agent Vanguard member15 step8 workflowsFully local inference
FIG 14 · LOCAL.FRAMESGUIDE
TEXT · IMAGE · MOTIONWindows / Mac
01

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.

Windows / RTX 4090Apple Silicon Mac
stageAccurate model and parametersUsage in this article
textQwen3-30B-A3B-Instruct-2507:Total 30.5B, activated about 3.3BOllama Tags qwen3:30b-a3b-instruct-2507-q4_K_M; Approximately 19GB download.
picturesQwen-Image-2.1:7B generator + independent 8B encoderUse INT8 ConvRot on Windows and BF16 on Mac. Disable the additional prompt enhancer; no additional 9B model is needed.
videoMiniMax H3:33B dense generator + independent 32B encoderWindows 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.
Recommended configuration for Windows

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.

Mac planning configuration

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.

Figure 1: Lock the character first, then generate it shot by shot
Figure 1: Lock the character first, then generate it shot by shotSchematic diagram of the workflow of this site. Model download and dependency installation require an Internet connection; after the download is complete, text, image and video reasoning are all completed locally.
Completion Check
  • Confirm the machine, disk space and usage range, and choose the Windows or Mac route.
02

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/        当前使用的JSON

Workflow 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.

Windows · Character ReferenceWindows · First Frame EditingWindows · Video verification fileWindows · Video Quality Profile
Mac · Character ReferenceMac · First Frame EditingMac · Video verification fileMac · Video Quality Profile

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 / timeFirst frame and main actionMirror and sound
01 · 00–05 secondsMedium 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 secondsClose 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 secondsClose 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 secondsReverse 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 secondsMid-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 secondsMedium 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.
Completion Check
  • The project directory has been created and the workflow files for the corresponding platforms have been saved.
03

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.7z
  1. Complete decompression

    Unzip it with 7-Zip and confirm it exists. D:\AI\ComfyUI_windows_portable\ComfyUI\main.py and python_embeded\python.exe. Don't run it in a compressed package.

  2. first start

    Double click run_nvidia_gpu.bat. Terminal appears http://127.0.0.1:8188 Finally, open this local address in the browser and keep the terminal open.

  3. 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')
Completion Check
  • Ollama is installed; the ComfyUI native page can be opened and the startup log identifies NVIDIA GPUs.
04

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_M

Type 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.content

Interactive 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
Completion Check
  • Storyboards and character settings are saved; the native API answers, and Ollama releases the model before the image is generated.
05

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.

settingsFinal Character Reference
resolution/batch1024 × 1024 / 1
steps / CFG40 / 1 (25 steps for quick composition preview)
sampler / schedulereuler / simple
seedFix a number and save it to facilitate successive comparisons
outputSave 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.
Completion Check
  • A master image of the character that has been inspected for face shape, hands, and clothing has been generated and saved.
06

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.

  1. 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.

  2. Access reference map

    Import "First Frame Edit".image_1 Upload the newly generated 1344×768 layout;image_2 Upload the accepted amu-character.png. The latter specifically constrains faces, clothing and materials. Connect the corresponding interfaces from the two Load Image nodes on the canvas.

  3. 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.

  4. Lens-by-lens acceptance and archiving

    Save in sequence shot01.png to shot06.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.

Completion Check
  • 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.
07

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" }
}
Figure 2: The first frame enters local H3, and then the video is saved
Figure 2: The first frame enters local H3, and then the video is savedSchematic representation of workflow structure. H3 here is the local core node and the sounds are also generated by the native model.

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.

Completion Check
  • The five models are in the correct directory, the workflow can recognize them, and the input is their first frame.
08

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.

parametersVerification fileFormal quality file
outer aspect16:9 (Widescreen)16:9 (Widescreen)
megapixels / multiple0.4 / 320.98 / 32
Actual width and height864 × 4801344 × 768
duration / batch5 / 15 / 1
Turbo / stepsfalse / 20false / 20
Bootstrap and CodingKeep default BasicGuider, 24fpsKeep default BasicGuider, 24fps
Download verification fileDownload quality file

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/A

Prompt 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/A

When 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.

  1. 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.

  2. 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.

  3. 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.

Completion Check
  • The verification file completes audio and video output, and the quality file passes character, hand, movement and background checks frame by frame.
09

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 --install

Skip 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-vae

Browser 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.

Completion Check
  • Mac's MPS check succeeds, ComfyUI native page opens, ffmpeg / ffprobe available.
10

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 serve

Keep 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_M

Mac 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
Completion Check
  • Text services and APIs on Mac use local addresses, storyboards have been saved, and models have been released.
11

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/models

Restart 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.

Mac · Character Reference WorkflowMac · Editing 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.

Completion Check
  • Mac has generated the character and first frame; the image model has been released before starting the video.
12

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 -version

Keep 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-H3

The 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.

Completion Check
  • h3 is compiled, ffmpeg is available, FL2VA weights are complete and --info is recognized.
13

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 --offline

model_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:

Load Image→Wild H3 Text to Video
first_frame
→Save Video
settingsDevice verificationFormal quality file
width × height512 × 5121344 × 768
seconds1.05.0
steps / preset20 / precise50 / precise
seed42 / fixed42 / fixed
token_reductionfalsefalse
ssd_streamingDefault is false; insufficient capacity can be evaluated individuallyDefault false; evaluated based on machine conditions
Mac · Video verification fileMac · Video Quality Profile

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.mp4

If 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.

Completion Check
  • The local engine and ComfyUI workflow each have playable video output, and the picture and sound are checked.
14

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.

  1. 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.

  2. 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.

  3. 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 --offline

Mac running in terminal:

cd ~/AI/ComfyUI
source .venv/bin/activate
python main.py --cpu-vae --offline
phenomenonPriority check
Model is not in the dropdown listWhether it is placed in the correct category of models; whether the extension and complete download are correct; restart ComfyUI.
Missing node/Unknown nodeConfirm ComfyUI v0.43.0; Windows uses local core workflow, Mac video requires Wild H3C, restart to see the import log.
4090 CUDA OOMStop 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 changedThe 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 swapFirst 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 ffmpegCheck the compilation results, config.json outer directory, and Homebrew PATH; first use the terminal diagnostic command to locate it.
Unsteady face, hands, or clothingFirst 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.
Completion Check
  • Text, pictures, and videos have been generated separately after disconnection, and the new results and corresponding logs have been saved.
15

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.

Picture

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.

narrative and sound

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 winget

Copy 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.

Download local production script

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.wav

Automatic 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.

Download local automatic subtitle script

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-turbo

The 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.mp4

Mac running in the same lens directory:

python3.12 ./h3-finish-v2.py . --narration ./narration.wav --music ./music.wav --srt ./captions.srt --output final.mp4

Keep 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 winget

Mac installation:

brew install --cask shotcut
  1. construction project

    Open Shotcut and save the new project to 04_edit;Convert the master final.mp4 Drag to timeline. The video mode is set to custom 1344×768, 24fps, consistent with the master version.

  2. 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.

  3. 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.

  4. 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.

Completion Check
  • 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.