Instructions to use joeygambino/joyai-echo-ltx23-echoVid-ltxAud-surgical with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Diffusion Single File
How to use joeygambino/joyai-echo-ltx23-echoVid-ltxAud-surgical with Diffusion Single File:
# No code snippets available yet for this library. # To use this model, check the repository files and the library's documentation. # Want to help? PRs adding snippets are welcome at: # https://github.com/huggingface/huggingface.js
- Notebooks
- Google Colab
- Kaggle
The VIDEOONLY distill LoRAs now have their own repo: joeygambino/ltx23-videoonly-distill-loras. They still ship here for continuity, but the dedicated repo is where they are documented (measurements, strength guidance, the "small strip is the better strip" result) and where updates will land.
JoyAI-Echo x LTX-2.3 β echoVid + ltxAud surgical merge
Nodes, workflow, issues and releases: https://github.com/jlucasmcrell/joyai-echo-multishot-patch
All models: https://huggingface.co/joeygambino
A word on expectations: the multishot workflow this feeds is powerful but not one-click - first renders usually take some tuning to your VRAM, system RAM and model build. The workflow repo's
INSTRUCTIONS.mdcovers setup and known failure modes, and I am happy to troubleshoot: open a discussion and I will answer.
JoyAI-Echo's video/conditioning branch married to LTX-2.3-distilled-1.1's audio branch.
Speed: turn on fp8_scaled_mm
If your renders crawl in the JoyAI-Echo pack, this is almost always why. It is off by default.
fp8_scaled_mm stores the DiT linears as float8_e4m3fn and computes the
matmuls natively via torch._scaled_mm on RTX 40/50-series β unlike
fp8_transformer there is no per-layer upcast tax.
source file in model_file |
fp8_scaled_mm |
result |
|---|---|---|
| bf16 | ON | linears downcast at load, native fp8 compute β ~22 GB resident, sequential_offload can go OFF |
| INT8 ConvRot | ON | reconstructs to bf16, then downcasts β identical to the bf16 row, at ~60 % of the download |
| bf16 or INT8 | off | runs in bf16 β ~40 GB staged, streams over PCIe on a 32 GB card |
| fp8 | off | upcasts to bf16 at load β saves download size only, not memory or time |
| fp8 | ON | hard error. The toggle downcasts from bf16 itself; an fp8 file would load norms and tables as fp8 too and crash the denoise pipeline |
The short version: feed it bf16 or INT8 and turn the toggle on. The fp8 file is for running without the toggles.
(Under stock ComfyUI rather than the pack, the INT8 build instead runs on the native W8A8 loader β a different path with its own speed profile.)
Render at 24 fps β voices and accents (2026-07-30)
LTX-2.3's joint audio-video prior is 24 fps-native, and render fps turns out to be a hidden accent dial: at 25 fps the same prompt and seed render non-rhotic southern British, at 30 fps broad Australian β and any off-24 fps setting overrides accent wording in the prompt entirely (a few conditioning tokens cannot outvote a geometric signal present in every attention op at every step). Verified by A/B on identical configs: 24 fps = rhotic General American at 5/5 reviewer confidence, same text and seed.
Keep video_fps at 24 and state the accent in the positive prompt
("in a casual American accent"). Flip side: if you want an authentic
British or Australian voice, rendering that scene at 25/30 fps is more
consistent than any accent wording.
Demo
THE WITNESS - five shots, five locations, one woman, one voice; nothing carries her between shots except one repeated sentence and the cross-shot memory bank. Rendered with the bf16 checkpoint in this repo under the fp8 scaled-mm compute path. AI-generated video and audio.
Two strong models, each with one disqualifying weakness for multi-shot
character work:
| identity across shots | voice quality | |
|---|---|---|
| JoyAI-Echo | holds (paired memory bank) | B-grade, TTS-flat |
| LTX-2.3 distilled-1.1 | drifts β recasts between shots | A-grade, natural |
Neither is shippable alone for a talking-character piece: Echo keeps the same
person across ten shots but sounds synthetic; LTX sounds like a real performer
but casts "three different actresses" across three shots.
This merge takes the half that works from each.
What was merged
Embedded in the file's own __metadata__ as rift_built_from:
SURGICAL MERGE: video/conditioning+av_ca-modulation from JoyAI-Echo-release;
audio + both cross-attns from distilled-1.1
From JoyAI-Echo release β video branch, conditioning path, and the
audio-video cross-attention modulation. This is what carries the slot-paired
memory bank, so face/wardrobe identity survives across shots.
From LTX-2.3 distilled-1.1 β the audio branch and both cross-attention
stacks. This is what produces the natural voice and lip-sync.
Architecture is unchanged (AVTransformer3DModel, 48 layers); this is a
tensor-level graft, not a retrain or a weight-average.
Files
| file | size | notes |
|---|---|---|
ltx23_echoVid-ltxAud_surgical_bf16.safetensors |
43 GB | full precision |
ltx23_echoVid-ltxAud_surgical_fp8.safetensors |
23.4 GB | fits a 24 GB card |
ltx23_echoVid-ltxAud_surgical_e50_bf16.safetensors |
43 GB | two-dose rebuild β recommended for talking heads (below) |
ltx23_echoVid-ltxAud_surgical_e50_fp8.safetensors |
23.4 GB | e50, fits a 24 GB card |
ltx23_echoVid-ltxAud_surgical_talkinghead_bf16.safetensors |
43 GB | base merge + c72 LoRA baked at 0.5 |
ltx23_echoVid-ltxAud_surgical_talkinghead_fp8.safetensors |
23.4 GB | same, fits a 24 GB card |
ltx-2.3-22b-distilled-lora-c72_VIDEOONLY.safetensors |
390 MB | articulation LoRA β the recommended strip |
ltx-2.3-22b-distilled-lora-384-1.1_VIDEOONLY.safetensors |
3.8 GB | same fix, full rank |
Both are full checkpoints β DiT + video VAE + audio VAE + vocoder +
text connectors β so they drop into a JoyEcho/LTX-2.3 graph as a single
model_file with no companion checkpoint needed.
All 5,947 tensors are present, **including the four
text_embedding_projection.* tensors**, so each file loads as a single
self-contained artifact.
That last point is worth knowing if you also run GGUF quants of this family.
LTX-2.3 ships those four tensors as a separate ~2.2 GB component file
rather than inside the DiT, while JoyAI-Echo bundles them in β the two
projects package the same weights differently, and they are byte-identical
between the two. Some JoyAI-Echo GGUF conversions follow the LTX layout and
leave them out, which is a reasonable thing for a converter to do, but if
nothing in your graph then loads the companion file those tensors get built
random-initialised. The symptoms are subtle enough to be misdiagnosed as a bad
prompt β robotic voice, the model reading prompt text aloud, identity resetting
between shots β and load logs look clean either way, because they sit outside
the swept path. Verify any checkpoint with:
from safetensors import safe_open
with safe_open("model.safetensors", framework="pt") as f:
proj = [k for k in f.keys() if "text_embedding_projection" in k]
print(len(proj), "expected 4")
Observed behaviour
Used in production for multi-shot narrated video (10 shots Γ ~13 s, one
recurring character). Against the same script and seed:
Voice: independent blind review scored it **"unquestionably a real recorded
human"**, with no drift in timbre or accent across all ten shots. The
JoyAI-Echo parent's best result on the same harness was 6β7/10 ("performed"
emotion, metallic sibilance).
Lip sync: 9.5β10/10 per shot, phoneme-accurate, no progressive drift.
Identity: a single character held across ten completely different locations
with a byte-identical identity sentence per shot and
memory_max_size=7.Picture: read as a real camera recording rather than AI, with correctly
formed hands and realistic eye reflection.
Two-character single-frame shots also hold, given stable ID_A/ID_B labels
and contrast on several axes at once (age band, hair, build, clothing colour).
Talking heads in plain core-node workflows (measured 2026-07-25)
Scope note for the numbers above: they were earned under the JoyAI-Echo pack's production recipe β slow, deliberate lines (~1.1 words/sec), head trims, and memory-bank conditioning.
At conversational speech rates (~2.5β3 words/sec) in a stock-sampler
I2V talking-head path (LTXVAddGuide + LTXVReferenceAudio + the TalkVid
ID-LoRA, 25 fps), this merge articulates the mouth measurably less than stock
ltx-2.3-22b-distilled-1.1: mouth-region motion 4.8β5.2 vs 9.3 on the
same seed, prompt, and settings. Rewiring experiments (reverting the
cross-modal modulation to stock; moving the full cross-modal apparatus
Echo-ward) did not close the gap β the ceiling lives in the echoVid
video-attention weights themselves, and this merge is already the best
arrangement of its parts (every alternative tested scored equal or worse).
Recommendation: for reference-voice talking heads in plain core-node
workflows (e.g. the Multishot Lite workflow), use stock
ltx-2.3-22b-distilled-1.1 β it articulates roughly twice as hard. Use this
merge where it wins: identity-held, multi-shot narrative under the pack's
recipe, where the pacing above keeps sync scoring 9.5+.
Update (later 2026-07-25): the TALKINGHEAD variant β articulation fix, baked in
For reference-voice talking heads at conversational speech rates, use the TALKINGHEAD builds instead of the base merge β no extra nodes, no LoRA to wire:
ltx23_echoVid-ltxAud_surgical_talkinghead_bf16.safetensorsltx23_echoVid-ltxAud_surgical_talkinghead_fp8.safetensors
They are the base merge with the c72 video-only distilled LoRA (below) baked in at 0.5 β weight-equivalence verified per-module against fp32 compute. Measured across two independent seed draws at default settings: shot-start articulation 4.8 β 6.9β7.5 (stock distilled-1.1 = 9.3) with envelope timing preserved (0.23β0.27 vs the 0.25 no-LoRA baseline; the earlier full-rank bake traded timing down to ~0.09 for a little more raw motion β that is why this bake uses the truncated strip). Face untouched.
Which file do I want?
| use | file |
|---|---|
| reference-voice talking heads at conversational pace | e50 builds (newest; see below) |
| same, via the earlier baked-LoRA route | talkinghead builds |
| chained multi-shot, the JoyAI-Echo pack recipe | base merge (unchanged) |
| maximum articulation, no Echo look needed | stock ltx-2.3-22b-distilled-1.1 |
The base merge stays the pack's model: at the pack's pacing (~1.1 words/sec, head trims, memory bank) its sync already scores 9.5+, and the baked boost is measured to overdrive chained shots that open on a moving guide frame (second-shot envelope correlation ~0.40 β ~0.20). That tradeoff is why this is a separate file and not an update to the base merge.
Update (2026-07-25, latest): the e50 two-dose rebuild
ltx23_echoVid-ltxAud_surgical_e50_* attacks the same articulation deficit as
the TALKINGHEAD builds, but from the weights rather than by baking a LoRA on
top.
Scope: this is a fix for the reference-audio path, not a general lip-sync
repair. The deficit appears when a character is driven from a supplied voice
clip (LTXVAddGuide + LTXVReferenceAudio + the TalkVid ID-LoRA) at
conversational speech rates (~2.5β3 words/sec). Under the pack's own production
recipe β slower, deliberate delivery plus memory-bank conditioning β the base
merge already scores 9.5+ on sync and is not outclassed by e50. If you are not
driving from reference audio, you do not need this build.
The video side is reconstructed from two independent doses:
video = dev + 1.0 x (distilled-1.1 - dev) + 0.5 x (JoyAI-Echo - dev)
tables/adalns = dev + 0.3 x (distilled-1.1 - dev) + 0.5 x (JoyAI-Echo - dev)
audio + cross-modal = stock distilled-1.1 (unchanged, so TalkVid still works)
Why this shape. JoyAI-Echo is a dev-lineage finetune β its training
fingerprint matches ltx-2.3-22b-dev, not distilled-1.1 β so on the 8-step
distilled sigma ladder its video stack is effectively under-distilled. That
surfaces as under-articulated mouths and smeared fine motion when the mouth is
being driven hard by reference audio at speed; at slower delivery it is not the
limiting factor. Adding the full distillation direction
back restores articulation; holding Echo's own finetune at 0.5 recovers
stock's crisper viseme formation, which is most visible on rounded vowels (on
the test line, "cloned" forms a real /oΚ/ with visible tongue movement instead
of a flattened closure). The modulation tables take a lighter distill dose
because at full strength they produce specular, over-shiny skin.
Both doses were chosen by rendering and eye, not by theory: a full-strength distill correction reads rubbery/exaggerated, stock alone reads stiff, and 0.5 was picked over 0.6 and 0.7 on viseme shape.
Known trade. Echo's finetune is what suppresses the occasional robotic voice and drives the pack's audio memory bank. At 0.5 you keep half of it. For long multishot runs through the pack, the base merge remains the safe choice.
e50 vs TALKINGHEAD. Two different routes to the same problem; they have not been benchmarked head-to-head at equal settings. e50 is the newer and the one in current use here. If you already have a tuned TALKINGHEAD setup, there is no measured reason to switch.
Shot length: this is a nodes issue, not a weights issue. Through the JoyAI-Echo pack, lip sync decays and visibly breaks about 9.6 s into every shot β the wrapper's video RoPE clock is hardcoded to 24 fps while audio RoPE is in true seconds, so a 25 fps render drifts ~4 %/s. It reads as a model limitation and is not one: no LTX-2.3 or Echo checkpoint caps shot length (temporal RoPE range is 20 s, identical across Echo, dev and distilled-1.1), and no merge can fix it because the bug is in coordinate math. The multishot patch stamps the real render fps onto the generator (Bug fix #0); with it, 60β105 s multishot masters hold sync.
Quantised e50 builds (Q8_0 / Q5_0 / Q4_0) are in the GGUF repo.
The underlying fix, as a LoRA (for strength-tuners)
Two strips are available; the small one is the better one:
- Recommended:
ltx-2.3-22b-distilled-lora-c72_VIDEOONLY.safetensors(390MB, rank-72 truncation). At 0.5 under the TalkVid ID-LoRA it keeps the articulation boost AND times better at default identity guidance β shot-start envelope correlation 0.32 vs 0.10 for the full-rank strip, replicated across independent seeds. Rank truncation appears to drop motion-texture components that decorrelate from the audio envelope. ltx-2.3-22b-distilled-lora-384-1.1_VIDEOONLY.safetensors(3.76GB, full-rank). Slightly more raw motion; measurably worse envelope timing at default guidance. Kept for completeness and strength-sweepers.
The deficit above decomposes into two independent causes, and the amplitude
half is fixed by an adapter shipped in this repo:
ltx-2.3-22b-distilled-lora-384-1.1_VIDEOONLY.safetensors.
Why it works: this merge's video side is under-distilled β dev-flavoured attention driven by an 8-step distilled schedule undersamples, and mouth articulation is the first casualty. The LoRA is the devβdistilled delta (rank 384) with all audio and cross-modal keys stripped (1174 video keys kept), so it restores the missing distillation direction without touching the pathway the TalkVid ID-LoRA adapts.
Measured, same seed/prompt/settings (mouth-region motion / audio-envelope correlation): shot-start articulation goes from 4.8 β 7.6β8.0 (stock distilled-1.1 = 9.3) at strength 0.5, chained under the TalkVid ID-LoRA, with no face restyling.
Known costs, measured: in chained multi-shot use the boost overdrives shots that open on a moving guide frame (second-shot envelope correlation drops from ~0.40 to ~0.20) β for multi-shot work, sweep strength down (0.2β0.35) or apply it per-shot. Do NOT use the full (non-VIDEOONLY) rank-384 distilled LoRA under the TalkVid ID-LoRA: its audio/cross-modal keys fight the ID-LoRA and envelope timing collapses to zero.
Separate timing note: identity_guidance_scale amplifies adherence to the
voice reference. When the reference clip's words differ from the spoken
line (always true for the first shot), that amplification fights the script's
timing β measured 0.25 β 0.43β0.54 envelope correlation by setting the FIRST
shot's scale to 0β1.5. But in chained workflows the second shot references the
first shot's own audio, and an unguided first shot produces a worse chain
reference (second-shot timing drops). Single-shot talking heads: lower the
scale. Chained shots: keep 3.0 on the chain, tune only shot 1, and judge the
whole clip.
Usage notes
Requires the memory-multishot path to get the identity benefit β a
plain single-shot graph will not exercise the memory bank.
sequential_offloadis effectively mandatory: 43 GB of bf16 weights willnot fit a 32 GB card unquantised. The fp8 build at 23.4 GB is the practical
choice for 24 GB hardware.
Keep negative-steering gentle.
negative_scale_videoabove ~1.0 rotates theconditioning hard enough to scramble per-shot scene content β every shot
collapses onto shot 1's composition while the audio advances correctly.
0.5β0.8 is the working band.
Prompts should state the accent affirmatively ("in a casual American
accent"). The model's default drifts British.
Provenance and license
Derived from:
Lightricks/LTX-2.3 β Β© Lightricks Ltd.
jd-opensource/JoyAI-Echo β JD Joy Future Academy
Distributed under the LTX-2 Community License Agreement, a complete copy of
which is included in this repository and embedded in each file's
__metadata__.license. Per Β§3 of that license this derivative is distributed
exclusively under those terms, and the modification is disclosed above and in
rift_built_from.
Non-commercial. LTX-2 itself permits commercial use below $10M ARR, but the
JoyAI-Echo component is released for academic research and non-commercial use
only, so the stricter term governs this merge.
Use is subject to the LTX-2 Acceptable Use Policy (Attachment A of the
license), which among other things requires that generated content be
disclosed as machine-generated.
No affiliation with or endorsement by Lightricks or JD is claimed or implied.
One upstream metadata field, encrypted_wandb_properties (an encrypted
training-run blob inherited from the original weights), was removed from both
files. Nothing else in the header was altered and no tensor data was touched.
Support
Everything here is free and stays free. If it saved you time, you can sponsor me on GitHub, buy me a coffee, or support me on Liberapay.
- Downloads last month
- 3,766
# No code snippets available yet for this library. # To use this model, check the repository files and the library's documentation. # Want to help? PRs adding snippets are welcome at: # https://github.com/huggingface/huggingface.js