π€ Voice Effects
The one-node voice chain that makes AI narration stop sounding like a Zoom call
- audio
- audio
VoiceEffects is the audio node hiding inside a video-effect pack, and honestly it's one of the better reasons to have DJZ-Nodes installed. Where most ComfyUI audio tooling makes you chain three or four nodes to get a usable result, this one takes an AUDIO input, runs it through a six-stage effects chain, and hands you back a finished AUDIO output. Reverb, filter, vibrato, formant shift, echo, distortion - it's a mini voice chain in a single box.
The use case that made this node make sense for me: you generate a voiceover with a TTS node (or record one, then load it via VideoHelperSuite), and it comes out dry and dead-flat. You want it to feel like it was recorded in a room, with a little movement. VoiceEffects is the "make it sound like a broadcast instead of a text-to-speech demo" button.
The effects run in a fixed order, which is worth knowing because the order is the sound. Reverb first (controlled by room_size, which scales the decay time to the sample rate, and damping, how fast it dies), then a frequency filter - filter_type lets you pick lowpass, highpass, or bandpass, with cutoff_freq between 300 and 5000 Hz. Telephony voice = highpass plus a tight lowpass. After that comes vibrato (vibrato_freq and vibrato_depth, a pitch wobble), then formant shifting via shift_factor (0.5β2.0), which is the one that actually changes timbre - drop it below 1 for a deeper, "bigger" voice, push it up for chipmunk territory. Echo (delay_time in seconds, decay for how many repeats survive) and finally distortion (gain up to 5x, threshold for the clip point) round it out.
Here's the practical bit: it's not a parametric EQ, it's a chain. Everything applies, always. There's no bypass per stage, so if you want a clean echo without the formant shift, you set shift_factor to 1.0 (no change) rather than turning it off. The defaults are gentle enough that feeding an unmodified voice through with all-defaults barely changes it, which is the right way to start: turn things up one at a time.
The node logs every run to voice_effects.log in the pack folder, which sounds like noise until your audio comes out silent and you need to see exactly where the chain broke. Audio runs on CPU, so no VRAM pressure - this is one of the few DJZ nodes that won't fight your video gen for GPU memory.
Install is the whole-pack story: ComfyUI Manager β search "DJZ-Nodes", or cd ComfyUI/custom_nodes && git clone https://github.com/MushroomFleet/DJZ-Nodes && cd DJZ-Nodes && pip install -r requirements.txt. That requirements file is heavy (librosa, scipy, numba, soundfile...), because this one pack covers audio, video, and 3D. You're installing ~75 nodes to get one; that's the DJZ trade-off.
Two gotchas. First, the node expects a real AUDIO tensor - a standard ComfyUI audio dict with a "waveform" key and a sample rate - so it needs a proper audio-producing node upstream, not an image. Second, there's no silence/gate or compressor here. If your source is quiet, normalize it before it hits this node; the distortion stage will happily amplify the noise floor too.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | β | |
| room_size | FLOAT | 0.10β1 | β |
| damping | FLOAT | 0.10β1 | β |
| cutoff_freq | FLOAT | 300300β5000 | β |
| filter_type | COMBO | 3 options: lowpass, highpass, bandpass | |
| vibrato_freq | FLOAT | 1.01β10 | β |
| vibrato_depth | FLOAT | 0.10β1 | β |
| shift_factor | FLOAT | 0.50.5β2 | β |
| delay_time | FLOAT | 0.10.1β1 | β |
| decay | FLOAT | 0.30.1β1 | β |
| gain | FLOAT | 1.01β5 | β |
| threshold | FLOAT | 0.10.1β1 | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | β |