Nodes/fxai-toolkit/凤希AI - 人声分离模型加载
ComfyUI Node

凤希AI - 人声分离模型加载

Your Vocal-Separation Checkpoint Goes in diffusion_models. Yes, Really.

By fxai666·Created 6 months ago·Updated about 14 hours ago· 44
凤希AI - 人声分离模型加载
    • 模型
    ◄模型文件▾►

    Data point that saves you ten minutes: 凤希AI - 人声分离模型加载 (FxAiMelRoformerLoader) reads its dropdown from diffusion_models. Not an audio folder, not checkpoints. You drop a Mel-Band Roformer .ckpt into ComfyUI/models/diffusion_models and it shows up in a list otherwise full of Wan and LTX weights, shoulder to shoulder with your video models. Odd, but that's the folder it asks ComfyUI for, so that's where the file has to live.

    What it is and where it fits

    This is the loading half of the pack's vocal separation pair. It builds a Mel-Band Roformer, fills it with your checkpoint, and hands out a MELROFORMERMODEL - a custom type that only its sibling, FxAiMelRoformerSampler, accepts. There is no second consumer. Don't wire it anywhere else and expect something to happen.

    Why you'd want stem separation inside ComfyUI at all: because the interesting audio work in 2026 is downstream of video. The audio layer in this ecosystem got bolted on once clips needed soundtracks - dubbing, lip-sync, voice cloning - and the standard move is to pull the vocal off a track, run it through your TTS or voice-conversion step, and lay the result back over the instrumental. That's the job this loader/sampler pair exists for. It is genuinely a two-node answer to "can I do this without a trip through UVR", and the honest scope is the basic vocals-versus-everything-else split; four-stem separation is still better served by dedicated audio tools.

    How it works

    The mechanism is exactly what it looks like in the source. The node constructs the architecture in fxai_melroformer_arch.py with a hardcoded config - dim 384, depth 6, 8 heads at 64 dims, 60 mel bands, stereo, one stem, STFT n_fft 2048 with hop 441 at 44.1 kHz - then loads your file with load_torch_file and calls load_state_dict(..., strict=True).

    That strict=True is the important word. This is not a flexible loader that sniffs the checkpoint; it's a shape match, or it's an error. The arch file credits its origin in the first line - KimberleyJensen's Mel-Band-Roformer-Vocal-Model - so what you're after is a Mel-Band Roformer vocal checkpoint that matches that configuration. If yours doesn't, you'll get a wall of Missing key(s) / Unexpected key(s) / size-mismatch text.

    Two things that are not problems, so you can skip the busywork:

    • You do not need flash-attn. The config passes flash_attn=True, but the attention class calls F.scaled_dot_product_attention and the flag is never consulted. No compile, no wheel hunting.
    • Nothing lands on the GPU here. The model is built and stays on CPU. The sampler (or the offload device, after it's done) handles the moves, so loading is cheap and safe to leave sitting in a graph.

    You do need einops and rotary_embedding_torch - both are imported at the top of the arch module. The pack's __init__.py auto-installs only soundfile and psutil, so these are on you.

    Inputs and outputs

    One input: 模型文件, an enum populated from folder_paths.get_filename_list("diffusion_models"). One output: 模型 of type MELROFORMERMODEL, which goes into FxAiMelRoformerSampler.

    Install

    cd ComfyUI/custom_nodes
    git clone https://github.com/fxai666/fxai-toolkit
    

    ...then restart, or install from ComfyUI Manager by searching fxai / 凤希全能节点 (the pack ships Comfy Registry metadata, publisher fxai). If the two separation nodes don't appear at all, install the arch dependencies and restart:

    python -m pip install einops rotary-embedding-torch
    

    The pack's README doesn't publish a download link for separation checkpoints - it's written around the long-video pipeline, and this pair is the audio-side utility. Grab a Mel-Band Roformer vocal model from wherever you normally get them, verify the config matches, and drop it in models/diffusion_models.

    Where people get burned

    • The node isn't in the menu, or it vanished after an update. Node modules are imported inside a try/except, so a missing einops or rotary_embedding_torch doesn't crash ComfyUI - it prints ❌[凤希AI] 节点加载失败: 凤希AI - 人声分离模型加载 → ... and registers nothing. Because both nodes share one module, the loader and the sampler disappear together. That console line is the whole diagnosis.
    • The dropdown is empty. models/diffusion_models doesn't exist yet, or the file is in checkpoints. Create the folder and move it.
    • It loads, then the sampler explodes. That's the strict state-dict mismatch. Ninety percent of the time you've grabbed a checkpoint trained on a different band count or depth than the hardcoded config.
    • A fine-tune or conversion in the dropdown shows as one long, unreadable filename. Cosmetic, but rename the file before it goes in the folder - the dropdown is your only view of it.
    Category凤希AI/音频

    Inputs (1)

    NameTypeDefaultDescription
    模型文件COMBO0 options:

    Outputs (1)

    NameTypeDescription
    模型MELROFORMERMODEL—