Nodes/Comfyui_URN_AudioTools/URN Audio Lyrics
ComfyUI Node

URN Audio Lyrics

Fetch them online, transcribe them as a last resort

By Clivey1234·Created 2 days ago·Updated a day ago· 4
URN Audio Lyrics
  • audio_input
  • Transcript_Out
  • Duration_Seconds
  • Music_Description
  • Audio_out
  • Artist
  • Title
  • Album
◄songtrue►
◄include_timestampsfalse►
◄get_lyrics_ovhtrue►
◄source_filename_hint►
◄gender_vocal_determinationtrue►
◄embedded_lyrics►
◄artist_in►
◄title_in►
◄album_in►

You have an audio file. You want its lyrics as text - to feed a style prompt, to keep beside the track, to check against a cover version. Doing it by hand is a copy-paste chore, and doing it purely with speech recognition is how you end up with beautifully timed nonsense, because Whisper on sung vocals is genuinely mediocre.

URN Audio Lyrics attacks it in the right order. It looks for lyrics the file already has, then for lyrics someone else has already transcribed properly, and only transcribes them itself when both fail. It also outputs the artist, title, album and a MusicBrainz-derived music description, which is the string a downstream style selector or music model actually wants.

How it works

The provider chain is the whole design, and it goes exactly like this:

  1. Embedded lyrics, if you connected embedded_lyrics (from URN Load Audio). You get a scrollable preview and choose Use Embedded Lyrics, Ignore/Search Online, or Stop Workflow.
  2. LRCLIB - free, no key, matched on the confirmed artist/title plus duration and album.
  3. Lyrics.ovh - a plain-lyrics fallback after LRCLIB. No timing data at all.
  4. Whisper, locally, only once the online and manual paths have failed or been rejected.

Before any of that, with get_lyrics_ovh left on, the node guesses the song from the current upstream filename - so Artist - Title.mp3 is what you want to call your files - and shows you the match to accept or reject. Reject and you get a manual artist search rather than an immediate drop to Whisper, which is a lot less frustrating than it sounds. Stop Workflow cancels the run cleanly.

Two optional analysis stages sit beside the lyrics work. Song analysis adds measured BPM (librosa) and conservative [Verse N] / [Chorus] labels - heuristic, not metadata. Gender vocal determination temporarily isolates the vocal with Mel-RoFormer and does a conservative pitch read, which is how you get female lead vocal or male lead vocal. Both are toggles, and the second is independent of the first.

Include timestamps only helps where timing data exists: LRCLIB synced lyrics get converted to SRT-style text, and Whisper output is timestamped anyway. A Lyrics.ovh result stays plain text no matter what you toggle.

Inputs and outputs

The inputs worth wiring: audio_input (required), embedded_lyrics / artist_in / title_in / album_in from URN Load Audio, and the three toggles - song (labelled Song Analysis), get_lyrics_ovh (labelled Get Online Lyrics), gender_vocal_determination.

Outputs: Transcript_Out, Duration_Seconds, Music_Description, Audio_out, Artist, Title, Album. Audio_out is a pure passthrough - same samples, same rate, nothing applied - so you can splice this node into the middle of a chain without damaging the audio. Artist/Title/Album return the identity you actually accepted, which is the clean thing to feed into a save node.

Install

cd ComfyUI/custom_nodes
git clone https://github.com/Clivey1234/Comfyui_URN_AudioTools

Run install.bat, or install the pack's requirements.txt into ComfyUI's Python. This node leans on faster-whisper for the fallback and audio-separator for vocal isolation; librosa/scipy cover the BPM and pitch work. Whisper models download and cache on first use, so the first transcription is slow and needs internet.

ComfyUI Manager: search Comfyui_URN_AudioTools. New versions of the pack have historically fixed widget-order bugs here, so update rather than patching around them.

Common issues

The node pauses and nothing happens. That's the interactive flow - accept the song match, or search manually. V9.72 changed rejection so it opens manual artist search instead of dumping you into Whisper, and Stop Workflow exists for the cases where you'd rather just abort.

No internet, no lyrics. LRCLIB, Lyrics.ovh and MusicBrainz are all network calls. Set Get Online Lyrics off and you get embedded lyrics if they exist, then straight to local Whisper. MusicBrainz is rate-limited to about one request per second and the node enforces that, so lookups can feel unhurried.

Whisper output is wrong. Expected on sung material - it's the last resort for a reason, and it's worse with heavy instrumentation, harmonies and non-English vocals. If the online services didn't have your song, this is the honest ceiling.

The album came back empty even though the song was matched. The MusicBrainz selection is deliberately strict: it prefers official album release groups, then EP, then single, and hard-rejects compilation, various-artists, live and remix releases. No acceptable match means a blank rather than a wrong one.

Get Online Lyrics reset itself after a restart. That was a saved-workflow ordering bug; keep the pack updated if you're on an older copy.

CategoryURN Audio Tools

Inputs (10)

NameTypeDefaultDescription
audio_inputAUDIO—
songBOOLEANtrue—
include_timestampsBOOLEANfalse—
get_lyrics_ovhBOOLEANtrue—
source_filename_hintSTRING—
gender_vocal_determinationBOOLEANtrue—
embedded_lyricsoptSTRINGOptional embedded lyrics, normally connected from URN Load Audio.
artist_inoptSTRINGOptional artist metadata, normally connected from URN Load Audio.
title_inoptSTRINGOptional title metadata, normally connected from URN Load Audio.
album_inoptSTRINGOptional album metadata, normally connected from URN Load Audio. If blank, a confirmed Artist/Title is used for automatic MusicBrainz album lookup.

Outputs (7)

NameTypeDescription
Transcript_OutSTRING—
Duration_SecondsFLOAT—
Music_DescriptionSTRING—
Audio_outAUDIO—
ArtistSTRING—
TitleSTRING—
AlbumSTRING—