Nodes/ComfyUI-SongLRC/Lyrics to LRC (legacy)
ComfyUI Node

Lyrics to LRC (legacy)

Same timestamps, old class name, hidden from the menu

By TheAwaken1·Created 22 days ago·Updated 17 days ago· 6
Lyrics to LRC (legacy)
  • audio
  • lrc
◄lyrics►
◄seconds120.0►
◄structure►
◄titleGenerated Song►
◄artist►
◄languageen►
◄offset_seconds0.0►
◄timing_scale1.00►
◄prefer_alignmenttrue►
◄word_timingtrue►

MiniMaxLyricsToLRC is the deprecated alias for Lyrics to LRC. It resolves when an older workflow asks for it, it's flagged DEPRECATED so it stays out of the node search menu, and functionally it's the modern node - the alias is a subclass, so it inherits the current timing code, not a frozen copy of the old one. Fix the pack and your old graphs get the newest alignment logic for free.

What it does

Lyrics plus a duration go in, a complete .lrc file comes out as a string on the lrc output.

Required: lyrics and seconds. seconds is the duration used for even timing and is ignored as soon as audio is connected, because the real length is read off the waveform.

Optional, and this is where the quality lives: audio (the finished song), structure (a SheetSage2 start<TAB>end<TAB>section string or a YuE2 ABC score with % intro/% verse/% chorus markers), title, artist, language, offset_seconds, timing_scale, prefer_alignment and word_timing.

Three timing strategies, picked automatically and best-first:

  1. WhisperX forced alignment when audio is connected and prefer_alignment is on. Real per-line timestamps, with word-level tags when word_timing is left on.
  2. Score timing when you supply structure. Lines are matched to score sections and placed by tempo and bar counts.
  3. Padded even timing. Lines spread across the song with an intro/outro allowance. The fallback, and it sounds like one.

The output is a proper file with a [ti:] header, an [length:] tag, [mm:ss.xx] lines and a [by:] line that records which method actually timed it - genuinely useful when you're trying to work out why one render feels off.

The one naming change that matters

Nothing in this node moved between the two pack names, but the title default did: the old pack's nodes wrote [ti:Generated Song] the same way, and the artist field used to be pre-filled as if every song came from MiniMax Music 3. It's now blank, and left out of the file when empty. If your old LRCs all claim a MiniMax byline, that's where it came from - the modern node just stops lying in the metadata.

Why it exists at all

ComfyUI workflows reference nodes by class key, so the rename from ComfyUI-MiniMaxLRC to ComfyUI-SongLRC would have turned every old song graph into a red missing-node box. The pack registers the four old keys as hidden aliases to prevent that. It's the same defensive move the wider node ecosystem needs and mostly doesn't do - the reason "why does no workflow I download work?" is such a persistent complaint is that packs rename, delete and break class keys without a second thought.

Install

Manager → search ComfyUI-SongLRC, or:

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

Then delete ComfyUI-MiniMaxLRC - both packs register the same class names and will fight over them.

For real timestamps you also want WhisperX, installed the careful way so it doesn't swap your CUDA PyTorch for a CPU build:

pip install whisperx --no-deps
pip install faster-whisper ctranslate2 nltk pandas pyannote.audio omegaconf
python -c "import torch; print(torch.cuda.is_available())"

If that prints False, you've just overwritten your torch - reinstall the CUDA build before you run anything else.

Converting it

Right-click the node → Fix node (recreate) and it comes back as Lyrics to LRC with the same single lrc output, so the wire to your saver stays put. Legacy nodes can't be added from the search menu by design, so if you delete one without recreating it you'll be hunting for "Lyrics to LRC" instead - which is the same node, so just add that.

Categoryaudio/SongLRC

Inputs (11)

NameTypeDefaultDescription
lyricsSTRING—
secondsFLOAT120.00–600Ignored when AUDIO is connected; duration is read from the audio.
audiooptAUDIO—
structureoptSTRINGSheetSage2 structure (start<TAB>end<TAB>section) OR a YuE2 ABC score with % intro/% verse/% chorus. Times lyrics to the score instead of spreading them from t=0.
titleoptSTRINGGenerated Song—
artistoptSTRINGOptional. Written as the LRC ar: tag.
languageoptSTRINGen—
offset_secondsoptFLOAT0.0-30–30—
timing_scaleoptFLOAT1.000.7–1.4Stretch timestamps if lyrics feel early/fast (>1) or late/slow (<1).
prefer_alignmentoptBOOLEANtrue—
word_timingoptBOOLEANtrueWith WhisperX alignment, also write a <mm:ss.xx> tag before every word (enhanced LRC) so the player fills each line word by word, karaoke style. Turn off for players that show the tags as text.

Outputs (1)

NameTypeDescription
lrcSTRING—