Nodes/Lyrebird/Voice FX
ComfyUI Node

Voice FX

A voice changer that refuses to be a voice cloner

By agarzon·Created 27 days ago·Updated 27 days ago· 2
Voice FX
  • audio
  • AUDIO
◄params{}►

Ask "is there a voice changer node for ComfyUI?" and you'll get the same answer every time: use RVC. Which is true and a bit of a non-answer - RVC clones a target speaker, so you're training or hunting for a model of the voice you want. Voice FX doesn't imitate anyone. It takes your voice and moves it: monster, robot, child, 1940s radio broadcast, no model of anybody required.

That's the reason to reach for it and also the ceiling. Great for characters and narration; useless for "make me sound like a specific famous person," the one request that lands you in the likeness-policy mess most creative platforms are busy banning.

The trick: pitch and formant are separate

Most cheap voice changers just resample: speed the audio up for chipmunk, slow it down for mud. The reason chipmunk sounds wrong is that it moves pitch and vocal-tract size together, and ears read those as two separate facts about a person.

Voice FX runs the input through the WORLD vocoder (pyworld): fundamental frequency, spectral envelope and aperiodicity are estimated per frame, modified, then re-synthesized. Pitch multiplies the fundamental - semitones in, vibrato if you ask. Formant resamples the spectral envelope, which is what makes a voice sound like it comes from a bigger or smaller head. Because they're separate, pitch down 9 semitones with formant at 0.72 sounds like a bigger creature rather than a slowed-down tape; add a little drive and a ring-modulated layer and you're at the pack's own Dragon preset.

Then eight stages of ordinary DSP run in order - Voice, Time, Tone, Grit, Modulation, Dynamics, Space, Output - pedalboard filters, chorus, delay, reverb and compressor. Every stage except Output has a bypass toggle, plus a mix and output gain. The chain refuses to hand back broken audio: NaN or infinite samples raise an error rather than saving silence.

The two inputs

audio is core AUDIO in, AUDIO out, so it drops between Voice Cleanup and SaveAudio or PreviewAudio with no adapter. The interesting one is params - a plain JSON string whose own tooltip says it's "edited by the panel." The custom JS panel writes settings into that text field as you drag sliders, so the whole effect state travels with the workflow. Headless work is on you: an API run with params left at its "{}" default renders a pass-through, and a string that isn't a JSON object fails with params must be a JSON object.

Presets, blending, and the live loop

There are 37 built-in presets in seven categories - Creatures, Characters, Sci-fi, Spooky, Devices, Places, Fun - from Dragon and Goblin to Gramophone and Walkie-talkie. They're read-only; tweaking one just marks it modified, and ★ Mine is where your saves land, in <ComfyUI user dir>/lyrebird/presets/ rather than inside the node folder, so updates never touch them.

Blending is the neat bit: mix a second preset under the current one and slide. Because the engine still renders once, a reverb from one preset and a pitch shift from another don't stack into mud.

The live loop is what changes how you work. Run once, hit Loop, and a cached region repeats while you move knobs - every change hits your ears through the same engine that renders the final output, no re-queuing. Drag the waveform to move the region (up to 30 seconds); A/B flips original against processed at the same playhead.

Install

Same pack, so same steps - ComfyUI Manager → search Lyrebird → Install → restart, or:

cd ComfyUI/custom_nodes
git clone https://github.com/agarzon/ComfyUI-Lyrebird.git
pip install -r ComfyUI-Lyrebird/requirements.txt

Needs ComfyUI ≥ 0.4.0 and Python 3.10+. The dependency to watch is pyworld-prebuilt, which installs the pyworld module from prebuilt wheels - the author flags it because a second pack requiring upstream pyworld means two packages providing the same module, with no isolation between them. If no wheel fits your Python or platform, pip falls back to a source build that wants a compiler.

Known gotchas, from the author's own list

The live-loop cache is keyed by workflow id and node id, so two tabs of the same workflow file share one cached input - run the tab you're tweaking once to refresh it. The cache only holds the last four Voice FX nodes that ran, so if it says "Run the workflow once to enable live preview", change one of that node's inputs and re-run.

Two more honest ones. Presets are starting points - the author says the library "isn't yet tuned by ear on real recordings," so treat Dragon and friends as a vibe and fix them for your mic. And WORLD analysis is pure CPU numpy, no CUDA anywhere, so a two-minute clip takes real seconds to render. If a creature voice comes out slurred, back the parameters off rather than filing a bug - heavy aperiodicity plus distortion plus pitch shifting can outrun what the vocoder can reconstruct.

Categoryaudio/Lyrebird

Inputs (2)

NameTypeDefaultDescription
audioAUDIO—
paramsSTRING{}Effect settings as JSON. Edited by the panel.

Outputs (1)

NameTypeDescription
AUDIOAUDIO—