arkennemasis Video Dub (narration over a clip)
H3 won't do silence — so this node replaces its soundtrack with your narration
- video
- narration
- video
- report
MiniMax H3 is omni-modal: picture and audio come out of one pass, and it cannot be asked for silence. So a narrated film made with H3 arrives with the wrong soundtrack on every clip, and the narration arrives separately, and something has to put them together before the clips are concatenated - because once the clips are joined, the scene boundaries are gone and per-scene lining-up is impossible. ArkVideoDub is that something: it swaps a clip's audio for a narration track, per clip, and it stretches or trims the video to the narration, never the other way round. Speech cut off mid-word reads as broken; a shot that holds a moment longer does not.
How it works
Required inputs: video (the clip), narration (AUDIO - wire a TTS node's output), and fit, the policy for when narration and shot differ in length:
hold last frame(default) - freezes the final frame so the picture never runs out before the voice. Never truncates speech.cut video to narration- trims the shot down to the line.keep video length- the shot is a fixed slot, so the rest must be real silence. This one is subtle: an audio stream that ends early shifts timestamps when the clips are later concatenated, and narration starts landing under the wrong scene. The node pads with actual silence (apad) and cuts at the end of the picture, so audio and video are exactly equal and the concat has nothing to drift.
Two optional inputs matter in practice. video_path is the clip's file on disk - wire the producing node's path output here, because reading the file directly avoids a re-encode through TorchCodec, which is not installed (the fallback save_to() is a last resort that fails if TorchCodec is missing). And keep_original_at (0–1, default 0) mixes the clip's own audio back in underneath instead of dropping it - set it low to keep a little room tone.
The mechanics are worth knowing because two different "it's broken" symptoms trace back to this node's libraries. It writes the narration with soundfile, not torchaudio - torchaudio 2.11 routes save through save_with_torchcodec, and the "TorchCodec is required" error that surfaces reads like a video problem when it's really the narration being written out. And it needs ffmpeg, found on PATH or via imageio-ffmpeg.
Outputs: video (the dubbed clip, ready for the assembler) and report (a string like "dubbed 11.10s of narration onto the clip (hold last frame)").
Install
ArkVideoDub is one of the 61 nodes in the comfyui-arkennemasis pack, in arkennemasis/Video:
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
pip install -r comfyui-arkennemasis/requirements.txt # then restart ComfyUI
Or ComfyUI Manager → Install via Git URL with the repo URL. Make sure ffmpeg is on your PATH (or that imageio-ffmpeg is available), and remember the node's own lesson: always wire the clip's path in, so a long render doesn't end in a re-encode that can't happen.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| video | VIDEO | — | |
| narration | AUDIO | — | |
| fit | COMBO | What to do when the narration and the shot differ in length. 'hold last frame' never truncates speech. | |
| video_pathopt | STRING | The clip's file on disk. Wire the producing node's `path` output here — reading the file directly avoids a re-encode through TorchCodec, which is not installed. | |
| keep_original_atopt | FLOAT | 0.000–1 | Mix the clip's own audio back in underneath, 0 = drop it entirely. Useful for keeping a little room tone. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| report | STRING | — |