🔊✂️AGSoft Audio Frame Cutter Link
Copy-paste this once per scene, it can't drift
- chain
- chain
- audio
- start_seconds
- end_seconds
- duration_seconds
- audio_stitched
- stitched_duration_seconds
🔊✂️AGSoft Audio Frame Cutter Link is the node you duplicate. If AGSoft Audio Frame Cutter Master is the head of the chain that holds every setting, this is the body: one instance per segment after the first, each one cutting its own window out of the source track and handing the bus to the next.
The reason it exists rather than "just use a Trim Audio node per scene" is arithmetic. Windowing a track by hand means deciding where each window starts, and the obvious way to do that - index times length - is how you get cumulative rounding drift across ten segments and a click at every seam. This node never computes an absolute start for itself; it reads the cursor the previous node left at the end of its own window and cuts from there. The pack's source comment puts it plainly: "a Link always starts from the end of the previous segment, drift is impossible."
That matters more than usual with video models that generate their own audio, because you're matching a stitched picture, not just assembling sound. MiniMax H3 hands you a few seconds of video with synced stereo per generation, and long-form work means chaining those generations and trimming the duplicated anchor frame at each join. The chaining pattern itself is old news - by mid-2026 the frame-count side of it had collapsed into single nodes - but the audio half of the join is exactly the part nobody automates. That's the hole this pair fills.
Two inputs. That's it.
chain - the bus from the previous Master or Link. It's a pack-specific type (AGS_FRAME_CUT_CHAIN), so it only connects to these two nodes. That's the usual cost of a context-bus design: one wire instead of loose sockets, and no interoperability with any other pack's bus. Worth paying here, because the alternative is wiring fps and trim into every single segment.
frames - this segment's length in frames. Wire total_frames from 🎬AGSoft MiniMax Base and every Link agrees with your video segments; type it in by hand and you've added one more place to be wrong.
Everything else - frame rate, anchor-frame trim, start offset - rides down the bus from the Master. Change the fps once, not twelve times. That's the whole argument for the split: settings in one head node, cut math in N dumb repeaters.
Mechanically, a Link cuts frames / fps − trim_seconds of audio starting at the cursor, appends the piece, advances the cursor by exactly that much and bumps the frames-done counter. The trim subtraction is the anchor-frame duplicate set on the Master (trim_first_frames), and it has to match what you trim off the video at the join, or the sound pulls ahead of the picture by a frame per seam.
The seven outputs, trimmed down to the two that matter
Wire chain into the next Link. On the final node you read audio_stitched - that's the assembly of every segment up to and including that node, so the tail of the chain holds the finished full track. Send it to AGSoft Video Save.audio (or a core save-audio node) and you're done. Its sibling stitched_duration_seconds is the runtime of everything stitched so far; on the last node it should equal your stitched video's duration, which makes it a decent check on whether the trims line up.
Every node also exposes audio (that segment's piece, if one scene needs its own sound elsewhere) and start_seconds / end_seconds / duration_seconds - absolute window boundaries in the source track, for external cutters like AGSoft Audio Split Plus, which cuts by start_time/end_time and can fade the joins. Use those against the source, never against an already-cut audio output, or you'll slice a slice.
Nothing here is an output node either, so if a run ends in silence it usually just means nothing is saving yet - plug the tail's audio_stitched into a saver or preview.
Install
Manager makes this easy: search comfyui-AGSoft, install, restart. Manual, if you prefer:
cd ComfyUI/custom_nodes
git clone https://github.com/Art-xmaster/comfyui-AGSoft.git
# restart ComfyUI
requirements.txt pulls numpy, opencv-python and translators; the cutter pair needs none of the heavier stuff in this pack (no ffmpeg, no model weights). The pack loads each node file independently and logs Import error in module … per file, so if only some AGSoft nodes appear after an update, the console line names the culprit.
Gotchas worth knowing before you build a 20-node chain
Don't pull audio_stitched off a middle node. Every Link has it, and a mid-chain one is a partial track that ends abruptly and sounds fine for three seconds - the worst kind of wrong.
A valid chain is required, and the type check is explicit: feed it something that isn't a bus and you get "Input chain is not a valid chain bus". In practice that only happens when you've recycled a node group and re-pointed the wiring.
Watch the console, not the graph. Each node prints its own window: seg3: frames=124 start=12.333s end=17.291s dur=4.958s. If a segment's audio ends in silence, that line tells you whether you asked for more than the source had - the same silence padding as the Master, same warning in the log.
Community support is a dead end. There's effectively no Reddit discussion of this pack - a phrase search for "AGSoft" over the 2026 corpus comes back empty - and the author's docs are on a Russian-language Telegram channel. The printed window line is your diagnostic, and the code for this pair is one short, readable file: AGSoft_Audio_Frame_Cutter.py.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| chain | AGS_FRAME_CUT_CHAIN | Chain bus from the previous Master/Link node. --- Шина chain от предыдущей ноды Master/Link. | |
| frames | INT | 1241–100000 | This segment's length in frames. Link total_frames from 🎬AGSoft MiniMax Base. --- Длительность этого отрезка в кадрах. Подключите total_frames из 🎬AGSoft MiniMax Base. |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| chain | AGS_FRAME_CUT_CHAIN | — |
| audio | AUDIO | — |
| start_seconds | FLOAT | — |
| end_seconds | FLOAT | — |
| duration_seconds | FLOAT | — |
| audio_stitched | AUDIO | — |
| stitched_duration_seconds | FLOAT | — |