Skip to content

SoulX-FlashHead replaces EchoMimicV3 as the talking head generator - #82

Merged
ConalMullan merged 2 commits into
mainfrom
feat/soulx-talking-head
Aug 31, 2026
Merged

SoulX-FlashHead replaces EchoMimicV3 as the talking head generator#82
ConalMullan merged 2 commits into
mainfrom
feat/soulx-talking-head

Conversation

@ConalMullan

Copy link
Copy Markdown
Collaborator

Replaces EchoMimicV3 with SoulX-FlashHead (Soul AI Lab, Apache 2.0, 1.3B) as the toolkit's talking head generator.

Demo: 80 seconds from a single still — one photo plus audio, rendered at 640x640 in one pass.

Why

EchoMimicV3 drifts. Segment-chained talking heads re-anchor each segment on the previous segment's output, so the failure is absorbing rather than gradual — one bad segment poisons everything after it, and colour correction recovers none of it because the damage is structural.

Controlled A/B, same photo, same 80s audio, same 544x736 output, as a share of frame-zero sharpness:

t SoulX-FlashHead EchoMimicV3
30s 97% 87%
50s 97% 75%
70s 97% 50%

At 70s EchoMimicV3 is a featureless smear with no eyes; SoulX is still a sharp, correctly framed, unmistakably identical face. Repeated on a second subject at 640x640 — different colouring, no glasses, busy background — which held 97-100% across the full 80s, so it is a property of the model rather than of one photograph.

SoulX is also 3.7x cheaper ($0.0024 vs ~$0.009 per second of output) and ~3-6x faster. Both figures are a floor: flash-attn and sageattention are optional and neither is installed, while upstream's quoted FPS assumes one of them.

EchoMimicV3 never reached a tagged release — it was added earlier in this same unreleased cycle — so this removes it rather than deprecating it. No public API changes.

The only capability it had that SoulX lacks is text-prompt/CFG steering, and docs/echomimic3.md already recorded from our own testing that the prompt is "close to inert". The genuine loss is gesture and upper-body motion, which nothing in the toolkit currently uses.

Notes for review

  • No resolution argument exists upstream. height/width live in a module-global loaded at import from a relative path, so the app chdirs into the repo root and mutates it. Nothing validates the value either — an off-grid size floors silently and renders wrong rather than raising — so _check_size guards both sides. Pro uses the Wan2.1 VAE (grid 16); Lite uses LTX-Video (grid 64), so 768x432 is legal for one and illegal for the other.
  • torch.compile is on upstream, costs ~600s per container and recompiles per resolution. scaledown_window is 600s so a batch at one size amortises it; SOULX_COMPILE=0 disables it.
  • modal run cancels the call when its client dies — a sleeping laptop counts, and --detach does not save the in-flight call. Renders are written to the soulx-out volume before being returned.
  • Weights in a Modal Volume, not baked: redeploy after a code change is ~2.3s. Repo ref and both model revisions pinned by SHA.
  • cloud_gpu.py gains a GPU tier for the tool, which echomimic3 never had — its jobs silently reported no cost estimate.
  • The Unreleased Kiro changelog entry is dropped; it shipped in v0.19.0 and was flagged in-file for removal when the section was cut.

Closes #81
Closes #80

🤖 Generated with Claude Code

ConalMullan and others added 2 commits August 31, 2026 11:41
SoulX-FlashHead (Soul AI Lab, Apache 2.0, 1.3B) becomes the toolkit's default
talking head generator. It preserves the input aspect ratio, so 16:9 presenter
images come back 16:9 with no --preprocess workaround, and --size snaps to the
model's latent grid while keeping the aspect.

It is the default because identity holds over a long take. Segment-chained
talking heads re-anchor each segment on the previous segment's output, which
makes the failure absorbing rather than gradual. SoulX is trained with
Oracle-Guided Bidirectional Distillation against exactly that, and it measures
out: 97% of frame-zero sharpness at 70s, flat across all 72 segments, verified
on two subjects at three resolutions. There is no short-render ceiling to
design around, so per-scene generation is a choice rather than a workaround.

~$0.0024 per second of output against SadTalker's ~$0.0014, and ~6.4-7.9x
realtime on A10G. Both figures are a floor: flash-attn and sageattention are
optional here and neither is installed, while upstream's quoted FPS assumes one.

Notes for whoever touches this next:
- There is no resolution argument anywhere upstream. height/width live in a
  module-global loaded at import from a relative path, so the app chdirs into
  the repo root and mutates that global. Nothing validates the value either --
  an off-grid size floors silently and renders wrong rather than raising, so
  _check_size guards it on both sides.
- torch.compile is on upstream, costs ~600s per container and recompiles on
  every resolution change. scaledown_window is 600s so a batch at one size
  amortises it; SOULX_COMPILE=0 disables it for odd one-offs.
- Weights live in a Modal Volume, not baked: redeploy after a code change is
  ~2.3s. Repo ref and both model revisions pinned by SHA, since volume weights
  are not tied to the image.
- modal run cancels the call when its client dies (a sleeping laptop counts,
  and --detach does not save it). Renders are written to the soulx-out volume
  before being returned.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
EchoMimicV3 was added earlier in this same unreleased cycle and never reached a
tagged release, so this removes it rather than deprecating it — no public API
changes.

Identity drift is why. On a controlled A/B (same photo, same 80s audio, same
544x736) it fell to 50% of frame-zero sharpness by 70s, glasses dissolving
around 55s and no recognisable face by 67s, where SoulX-FlashHead held 97%. The
failure is absorbing rather than gradual — each segment re-anchors on the
previous segment's output, so one bad segment poisons everything after it — and
colour correction recovers none of it because the damage is structural. That
implied a ~30s render ceiling which shaped the surrounding design.

The one capability SoulX lacks is text-prompt and CFG steering, and our own
docs already recorded from testing that the prompt is close to inert. Everything
else EchoMimicV3 offered, SoulX matches or beats: aspect preservation, motion
quality, ~3.7x cheaper, ~3-6x faster. The genuine loss is gesture and
upper-body motion, which nothing in the toolkit currently uses.

Also in this commit:
- Talking head docs, registry entries (tools and modal endpoints), cloud_gpu
  dispatch, modal-setup, NarratorPiP's comment and both env files repointed to
  soulx. cloud_gpu also gains a GPU tier for it, which echomimic3 never had --
  its jobs silently reported no cost estimate.
- The Unreleased Kiro changelog entry is dropped; it shipped in v0.19.0 and was
  flagged in-file for removal when this section was cut.

Findings worth keeping outlived the tool and moved into docs/soulx.md: the
warning against scoring talking heads with similarity metrics (two have now
misled — one ranked highest a variant with a visible eye defect, the other
plateaued straight through a total collapse), the volume-weights rationale, and
the image guidelines.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@ConalMullan
ConalMullan merged commit a567698 into main Aug 31, 2026
1 check passed
@ConalMullan
ConalMullan deleted the feat/soulx-talking-head branch August 31, 2026 10:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant