Everything here is free and stays free — the format spec, the nodes, the workflows, the cartridges, the LoRAs. If it saved you a night of debugging (it contains several hundred of mine), tips keep the 5090 warm:
🔁 Liberapay (recurring)
⚡ Or right here: the Civitai tip button on this page sends Buzz directly.
🚨 v2.0 IS HERE — RIFTCAST: CHARACTERS ARE FILES NOW. Design a human from dropdowns, watch them audition, and get a portable character file anyone can reuse — zero training. Plus the 24fps accent discovery that fixes every "why is she suddenly British" bug. Full story in the v2.0 version notes. 🚨
JoyAI-Echo Multishot — the character video studio for LTX-2.3
One character. Any number of shots. Same face, same voice, every time — and as of 2.0, your characters are files you can share.
This is a complete local pipeline for character-driven video on LTX-2.3's joint audio-video model: it generates the picture AND the voice in one diffusion pass — no TTS chain, no lip-sync post, no per-word API costs. A cross-shot memory bank keeps identity and voice locked across an entire multi-shot production, and a set of hard-won fixes makes the base model behave in ways stock workflows can't.
RiftCast — characters are files now
Things come through the Rift. Now characters do too.
A .riftcast cartridge is one file carrying a character's voice (a 4-second anchor clip), face (reference stills), canonical description, and optionally their LoRAs and home environments. Drop it in input/riftcast/, restart, and mention the character in any script: they render with their face and their voice, in any scene, zero training. Cartridges extend the roleplay world's Character Card V3/CHARX lineage into photoreal video — a cartridge can carry a chat persona too, so the same character works in your roleplay client.
Three ways to get one:
Download —
WREN.riftcastships in this package; more on the HuggingFace repo.Cut one from any render you like — one command:
python riftcast.py cut <master.mp4> <NAME> <dna.txt>.Design one from scratch — the bundled RiftCast Studio workflow is a full character creator. A Character Designer node covers identity (gender, age, ethnicity, skin, height, build, voice timbre, accent) and a Style + Wardrobe node covers appearance: 71 styles across 10 families, plus hair colour, hair shape, makeup, accessories, demeanor and a freeform wardrobe override. Queue it and the character records an audition tape; the Packer cuts their anchor and reference stills from that render and installs the cartridge automatically. Don't like who showed up? Re-queue with a new seed. Like them? They're a file, forever. (Our test reviewer rated a Designer character's lip sync "Real — very high confidence.")
One workflow, one switch: RiftCast Studio routes between your prompt files (LPFF/JSON batch rendering, the classic path) and the Character Designer with a single dropdown.
The style dropdown never sends its own name
This is the part that makes it work rather than being a word list. "Goth" and "preppy" mean nothing to a video model, so no style label is ever written into a prompt. Each of the 71 entries expands into concrete renderable descriptors — garments named with material and condition, hair shape, makeup with placement, worn objects, and a demeanor that drives how the character physically carries themselves on camera. Picking one goth entry produces, in part:
"...hair backcombed high at the crown with a straight fringe cut level with the eyebrows, wearing a long-sleeved black velvet dress with a frayed hem over laddered fishnet tights, and buckled boots scuffed grey at the toe, matte pale foundation, black liner drawn thick and winged past the outer corner..."
Hair colour stays its own dropdown and styles specify only shape, so the two can never collide. Every style carries both a masculine and a feminine wardrobe reading, so it works across presentations instead of being gender-locked, and anything you set explicitly overrides the style's contribution.
The 24 fps law — why your accents broke
The single most important thing this package knows: LTX-2.3's joint audio-video prior is 24 fps-native, and render fps is a hidden accent dial. At 25 fps the same prompt and seed render non-rhotic southern British; at 30 fps, broad Australian — and off-24 fps overrides accent wording in your prompt entirely. Verified by A/B with blind phonetic review. Everything here defaults to 24 and warns when you stray. If you want a British or Australian character, render their scenes at 25/30 — it beats any wording. (Pairs with the American-accent audio LoRA, which makes accent wording enforceable in the young-voice registers the base model ignores.)
The rest of the studio
Cross-shot memory bank — identity and voice persist across shots; anchor+latest policy stops drift snowballs.
Voice casting — drop a clip in
joyecho_voices/<tag>/and that character speaks with that voice in every render. Script-pinned voices viavoice_refs.Finishing — AutoFinish builds your master automatically; deterministic upscale; optional
temporal_upscaledoubles motion to ~48 fps masters (24 fps render law preserved, audio untouched).Long takes — up to 1441 frames (60 s) single-shot; the old ~10 s lip-sync cliff is fixed at the RoPE-clock level (Bug fix #0).
Correctness — a full sampler-path audit (seeded hires, cache keyed on checkpoint, cloned banks), fp8/INT8/GGUF loading paths, and widget values that survive updates (saved by name, not position).
Hardware
Built and tested on RTX 5090/3090. GGUF DiT + the 9 GB VAE companion runs the whole stack in ~11 GB system RAM instead of ~60.
Everything is also on GitHub and HuggingFace — node pack, format spec, LoRAs (surface realism too), quants, and demo cartridges. LTX-2 Community License.
Description
**Nodes, workflow, releases and issue tracker:** https://github.com/jlucasmcrell/joyai-echo-multishot-patch
**All models on Hugging Face:**
https://huggingface.co/joeygambino
**v1.5 — the lip-sync release. The ~10-second drift is dead.**
**Lip-sync drift past ~10 seconds: FIXED.** Since the first release, every shot's lip sync would quietly drift "off by a hair" starting around the 10-second mark — mouths slightly ahead of the audio, in every shot, on every model, at 25fps. Root cause: the pipeline's video positional clock was hardcoded to 24fps while renders played at 25, a 4% timing skew that accumulated ~40ms per second until it crossed visibility right around 10s. The clock now follows your actual `video_fps`. Verified: 361-frame shots (15 seconds) with frame-perfect sync, end to end, at both 24 and 25fps. The old workarounds — short spoken lines, keeping shots at 241 frames — are obsolete. Write long shots. Let them talk.
**Hires refine v2 — window-coherent noise.** The hires pass previously drew independent noise per processing window, which caused a subtle texture "switch" about once a second. All windows of a shot now share one noise field per denoising event: texture identity holds across the whole shot. The `hires_denoise` dropdown is now four honest modes: `subtle` / `medium` / `strong` (real synthesized detail — pores, hair, weave — at increasing strength, with a small per-frame texture-shimmer tradeoff that grows with depth), and new **`spatial`** — the LTX latent upsampler applied to the shot's own latents: fully deterministic, zero temporal shimmer, fixed 1.5x. Spatial needs canvas heights whose /32 is even (768, not 736) or the model smears one edge — that rule is in the tooltip.
**One thing to understand before touching the hires widgets: `hires_factor` is a routing switch, not a quality slider.** At 1.0 (the default and the recommendation), your master is built from the base shots with the deterministic upscale — zero detail shimmer. Above 1.0, the selected `hires_denoise` pass runs in-render and the master is built from *its* output instead. Raise it only when you deliberately want the refine's synthesized detail (with its slight per-frame texture shimmer) or the `spatial` mode (even /32 canvas dims only — 768-height, not 736). And always judge results from the `*_MASTER.mp4` file, never the in-graph preview (now saved with a `PREVIEW` prefix) — that preview's re-encode shows artifacts your master doesn't have. The full routing table is in INSTRUCTIONS.md.
**AutoFinish, smarter and cleaner.** The background master-builder now detects hires runs and assembles the master from your `shot_hires` files directly (no more double-upscaling from base). For base-res runs the default upscale is now **bicubic + contrast-adaptive sharpening** — deterministic, seconds per shot, CPU-only, and it never reshuffles fine detail the way neural per-frame upscalers do (we tested them all, including diffusion restoration models; the boring answer won a fair fight). RTX upscaling remains one click away as `rtx (legacy)` on the AutoFinish node. The master's glitch pass also re-encodes with the same clean settings as the per-shot files now, so finished masters no longer pick up B-frame quality pumping.
**Loader fix.** Quantized loads (`fp8_scaled_mm` / `fp8_transformer`) now cast stray float32 tensors correctly — fixes the `mat1 and mat2 must have the same dtype` crash some checkpoints hit at load.
---
**Also included since 1.3.1** (the v1.4 changes, which never got their own Civitai version): multiple LoRAs via a chainable LoRA Stack node with per-slot strength dropdowns; a visible, documented Reference Image node; `INSTRUCTIONS.md` in the zip — a complete manual covering install, first render, prompt-writing rules, per-VRAM settings, and a troubleshooting table for every failure mode reported so far; audio memory defaults ON (cross-shot voice consistency) with the tradeoff documented in its tooltip; `head_trim_frames` defaults to 14 (trims the unstable first half-second of each shot, where identity morph concentrates).
As always: the zip is the complete pack — nodes, workflow, example prompts, manual. Copy over your existing install, restart ComfyUI, press R.FAQ
Comments (7)
Hello,
It seems that your code and instructions are mixed up—some nodes are actually included in your ZIP file but are listed as not being there, while others are different versions of the original nodes (RealRebelAI's ComfyUI_JoyAI_Echo_GGUF_Nodes). Additionally, regardless of the combinations with checkpoints or diffusion models, there are quantization errors. Your idea seems excellent, but it looks difficult for me to reproduce it for testing. Good luck with the rest of your work.
This pack is a patch add-on to RealRebelAI's node pack, so you must install his node pack first. This information is in the instructions.md file included with my pack.
You are also welcome to open discussions with more specific errors and requests at either my Github or HuggingFace repos:
jlucasmcrell/joyai-echo-multishot-patch: Multishot fixes + automation patch for the ComfyUI JoyAI-Echo GGUF node pack (LTX-2.3). Memory-bank trim fix, lip-sync fps fix, hires routing, AutoFinish masters.
joeygambino (Joey)
I am always happy to help, but I do need more information concerning what you're experiencing. Everyone's hardware and software versions are unique, so it's difficult to account for every minor difference.
@joeygambino Thanks for your reply.
However, I'm still getting the same errors whether I use gguf or safetensors with
I'm having trouble understanding the exceptions related to the model choice (should I choose gguf and rename it to safetensors?). Sorry... maybe I'm just too tired.
In any case, good luck with your project
@sdktertiaire2 You do not rename anything. I would have to see the specific errors you're receiving. It's all very much determined by your hardware limitations, ComfyUI version, etc.
If you can provide errors or screenshots in either of the repos mentioned by opening a discussion, I can be of much more help. There are already multiple discussions going on in those repos that may be of help as well.
@joeygambino ok i will try harder. I'll keep you posted. thanks
I was one of the people that really wanted this to work.Believe me. But unless i'm supposed to be doing something extravagant on top of a typical workflow, the facial consistency from the original picture for an image to video is not sustaining at all. The person's face morphs into the person fromYOUR videos and images. Not mine. I hope it gets better though!!
I'd honestly love to see how you accomplished that, as none of my images are embedded in the workflow. You can confirm that by doing a simple image search in the workflow folder. Feel free to open a discussion at HF or Github, I've talked several people through getting the workflow functioning properly.