π€ Voice Effects 2
Preset-driven voice processing, monster to ethereal
- audio
- audio
Voice Effects 2 is the pack's answer to "what if I want my AI character's voice to sound like it's coming from a cave, a demon, or a robot?" It takes an AUDIO input and runs it through a chain of DSP effects - reverb, filtering, vibrato, formant shifting, echo, distortion - controlled by a preset file you pick from a dropdown. Turn a plain narration into something that sounds like it's being broadcast from a dying spaceship without leaving the graph.
The name says "2" because it's the sequel to an earlier Voice Effects node, and this one gets the preset system right: instead of a wall of sliders, the preset file decides which effects run and how.
How it works
The preset is the whole mechanism, and it's refreshingly transparent. In the pack's voice-effects/ folder live three Python files - ethereal.py, monster.py, robot.py - and the dropdown (effect_presets) is literally built by listing the .py files in that folder. When you pick one, the node executes that file against an internal EffectsExecutor that exposes the available effects (reverb, filtering, vibrato, formant shifting, echo, distortion) as functions. The preset acts as a whitelist: it calls exactly the effects its author wrote, with the parameters they chose. Want a custom effect? Drop your own .py in that folder and it appears in the dropdown on refresh - no code changes to the node.
Processing runs per audio channel and per batch item, then the result is normalized and returned as a standard AUDIO tensor. It also writes a log (voice_effects2.log next to the node) recording every effect applied, which is surprisingly handy when you're debugging why a voice sounds wrong.
The inputs
audio- an AUDIO tensor, i.e. the output of any audio loader node (like a VHS audio load or whatever your pipeline uses). It needs awaveform; sample rate defaults to 44100 if not provided.effect_presets- the dropdown:ethereal.py,monster.py,robot.py. Ethereal is airy and spacious (heavy reverb), monster is the deep formant-shifted growl, robot is the clipped, filtered machine voice.
Output is one AUDIO tensor. Wire it to an audio save node or mux it with your video.
Installing it
It's part of DJZ-Nodes:
cd ComfyUI/custom_nodes
git clone https://github.com/MushroomFleet/DJZ-Nodes
cd DJZ-Nodes
pip install -r requirements.txt
Restart ComfyUI, or search "DJZ-Nodes" in ComfyUI Manager. This node needs the pack's audio dependencies (librosa, pydub, soundfile, numpy) which the requirements file handles - that's the heavier end of the install.
Troubleshooting
- Preset dropdown is empty. The node scans
custom_nodes/DJZ-Nodes/voice-effects/at startup. If that folder is missing or empty, there's nothing to choose - check the pack extracted fully. - Audio comes out silent / broken. The node normalizes against max amplitude at the end; if the input was already near-silence, normalize can't save it. Feed it real audio, and remember the effects apply per channel - stereo files get both channels processed.
- I want a different voice. Write your own preset: copy
robot.py, open it, and call a different combination ofEffectsExecutorfunctions. That's the intended extension path, and it's much friendlier than it sounds. - Effects are too heavy-handed. The presets are committed to their character. There's no global "less" dial here - either pick a subtler preset or edit the file's parameters.
It's a niche node - you'll only need it if your workflows involve voice or narration - but when you do, having demon-voice in one dropdown click is a lot of fun for the price of zero extra installs.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | β | |
| effect_presets | COMBO | 3 options: ethereal.py, monster.py, robot.py |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | β |