VoxLock Loader
Two dropdowns, and only one will change your audio
- model
Most model loaders in ComfyUI are the boring end of the graph - park it on the left, wire the model out, never touch it again. VoxLock Loader is mostly that. It picks which VoxLock ONNX files to load and how many CPU threads ONNX Runtime gets. But two things about it are worth knowing, and one of them saves you from a silently broken model.
If you're landing here without context: VoxLock is a target-speaker isolation model - you hand it a recording of people talking over each other and it keeps one voice, deleting the rest. This is the loader feeding VoxLock Isolate Voice, the node that does the actual stripping. It's the audio-cleanup half of a talking-head or dubbing pipeline, the part that runs before a lip-sync model rather than generating anything. ComfyUI's audio layer is otherwise a pile of conflicting transformers/torch dependencies; this one is cheap - ONNX, CPU-only, one Python package.
Why a loader and not just widgets on the processing node
Because of a specific trap. The upstream voxlock package, given a model folder, will quietly fall back to the fp32 files if the chunk file for the precision you asked for is missing. You ask for int8, it doesn't find chunk_int8.onnx, and it runs fp32 - slower, different output, no error. The pack's author went out of the way to prevent that: the loader resolves the exact file pair for your precision in models/voxlock/onnx/ and raises FileNotFoundError right there in the loader if one is missing. Failing at the loader instead of 40 seconds later inside the processing node is the whole reason this node exists as a separate thing.
The second reason is caching: loaded models stay for the session, keyed on folder, precision and thread count, so flipping precision loads the other file pair once and five queued runs load nothing twice.
The inputs that matter
precision is the one you'll actually think about. Four options, each mapping to two files:
int8(default) -enroll.onnx+chunk_int8.onnx, 79 MB. The package's own default.int8-full-enroll.onnx+chunk_int8_full.onnx, 70 MB, the smallest and, per the author's measurements, the fastest.fp16-enroll_fp16.onnx+chunk_fp16.onnx, 51 MB.fp32-enroll.onnx+chunk.onnx, 100 MB, the model the upstream author benchmarks.
On 10 minutes of 16 kHz speech with 24 threads the README measures 49.1 s for int8, 45.9 s for int8-full, and about 73 s for both fp16 and fp32. Note the shape of that: the int8 variants are roughly 50% faster than fp16, which is backwards from what GPU habits tell you, and it isn't a typo. If you want speed, use int8-full - just know it isn't one of the configurations upstream's word-error numbers (5.11% int8, 4.95% fp32) were measured on.
threads is an INT from 0 to 256, default 0, which is the official default: let ONNX Runtime decide. Setting it explicitly is a reproducibility lever, not a speed lever. int8 quantization makes the thread count shift the output slightly - on the demo clip, 1, 4 or 8 threads instead of automatic moved samples by up to about -52 dBFS, inaudible, while fp32 barely moved at all. Same machine, same settings, same output, every time; different core counts with threads: 0 can differ. If you're diffing runs or matching somebody else's result, pin the thread count and use fp32.
The single output is model - a VOXLOCK_MODEL socket that only VoxLock Isolate Voice accepts, so there's nothing to mis-wire.
Install
Through ComfyUI Manager, search VoxLock; or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/hiroki-abe-58/ComfyUI-VoxLock
python -m pip install -r ComfyUI-VoxLock/requirements.txt
python ComfyUI-VoxLock/tools/download_model.py --models-dir ../models/voxlock
That requirements file is one line - voxlock==1.1.1 - which drags in onnxruntime, soundfile and soxr. Models aren't automatic and nothing downloads at run time, so skip step three and the loader is what tells you. All four precisions are ~275 MB; --precisions int8 int8-full gets the fast pair for ~149 MB.
The layout is models/voxlock/onnx/enroll.onnx, chunk_int8.onnx, and friends; a folder elsewhere works through extra_model_paths.yaml under the key voxlock.
Where people get burned
The nodes don't show up at all. This pack is written against ComfyUI's V3 node API (from comfy_api.latest import io) with no classic NODE_CLASS_MAPPINGS fallback. On a pre-0.38 ComfyUI the import fails and the pack registers nothing, logging [VoxLock] not loaded: …. Update ComfyUI rather than debugging the install.
FileNotFoundError naming a file under models/voxlock/onnx/. You downloaded one precision and selected another, or pointed --models-dir at models/ instead of models/voxlock - the downloader creates the onnx level itself, so models/ gets you models/onnx/, which nothing looks at. Re-run it with the precision you want, or with no --precisions for all four; it verifies hashes and skips what's good.
Queuing it next to heavy CPU work. threads: 0 lets ONNX Runtime take what it likes - right for a standalone run, mildly rude in a graph that's also encoding video. Drop it to 4–8 if the rest of the pipeline is CPU-bound.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| precision | COMBO | int8 | Model files: int8 (the package default), int8-full (fastest), fp16, or fp32 (the benchmarked model) |
| threads | INT | 00–256 | CPU threads for ONNX Runtime; 0 lets ONNX Runtime choose (the official default). The thread count changes the int8 output slightly |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model | VOXLOCK_MODEL | — |