Nodes/SpicyAPI/HeartMuLa Transcribe · Transcribe Lyrics
ComfyUI Node

HeartMuLa Transcribe · Transcribe Lyrics

Get the lyrics back out of a song you generated

By spicyapi-ai·Created 21 days ago·Updated 2 days ago· 2
HeartMuLa Transcribe · Transcribe Lyrics
  • audio_url
  • text
  • task id
◄seed0►

Whisper is fine at speech and terrible at singing. That's the gap this node fills: HeartMuLa Transcribe is a speech-to-text endpoint tuned for sung vocals, so you can feed it a track and get the lyrics back as a plain string instead of a wall of confident nonsense. HeartMuLa itself is the open music-foundation-model family that landed in January 2026 and got a quick relicence to Apache 2.0 after the community noticed the original CC-BY-NC terms barred monetised videos. Its subtitle work - transcribing vocals, scoring lyrics - is the part people don't expect from a music model, and it's the reason this node exists at all.

One input, one output, one price: $0.05 per run.

What you'd actually use it for

The obvious loop is song generation → transcription → re-prompt. You make an instrumental-ish track or a vocal take, transcribe what the model actually sang, then feed those words back into Suno or MiniMax Music as a fixed lyric sheet so the next version is coherent instead of phonetically plausible mush. Vocals and lyrics are still the weak spot of every open music model, and "the lyrics are absolute nonsense" is the standing complaint about the whole category - so a node that reads them back to you is a genuinely useful instrument for iterating rather than a novelty.

Second use: captions and on-screen lyrics for a video pipeline, where you want the text as a STRING to hand to a text-rendering node rather than as an .srt file. Third: you have a demo you recorded yourself and want the words out.

The node itself

One required input, and it's a socket, not a text box:

  • audio_url - an AUDIO input. Despite the name (the API genuinely takes a URL to a file that must resolve directly to audio, not to a webpage), in ComfyUI you wire an AUDIO output into it - Load Audio, or the audio output of a music/TTS node upstream - and the pack encodes it as 16-bit PCM WAV and uploads it for you. There are no options: no language selector, no timings, no speaker labels, no confidence score. Whatever you get back is the whole transcription.

Outputs:

  • text - a STRING. Wire it to a Show Text to eyeball it, or straight into another node's prompt.
  • task id - a STRING handle for the run in the SpicyAPI console.

If what you actually wanted was line-by-line timings for a karaoke overlay, this isn't the node - the model doesn't return them, and the author says so plainly in the node description. You'd transcribe here and then align elsewhere.

Install

Pack-level install, zero dependencies beyond ComfyUI:

cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi

Restart, then Settings > SpicyAPI → paste a key from spicyapi.ai/console/keys → restart once more. Manager search is "SpicyAPI". Headless: SPICY_API_KEY in the environment. This node needs no GPU, no model weights and no audio toolchain - the WAV encoding is done with Python's standard library, which is why an audio node in an API pack doesn't drag in ffmpeg.

Things that will actually go wrong

Upload size. Media uploads are capped at 90 MiB. A long lossless WAV blows past that; export an MP3 or a shorter excerpt. The 3–5 minute MP3 you'd normally hand a transcriber is well inside the limit.

Garbage in, garbage out, loudly. Vocals buried in a dense mix, heavy reverb, or a completely instrumental passage will produce confident-looking output that happens to be wrong. Transcription models don't shrug. If the result looks like invented words, that's usually the mix, not the node.

No diarisation and no timings. One output string, no structure. If you need to know who sang what and when, budget for a second tool.

$0.05 a run adds up in loops. Transcribing fifty candidate takes is $2.50, which is fine, but put it behind a decision rather than in an automatic per-image loop.

Fixed seed semantics. The seed starts on fixed so a re-queue gives you the first result instead of a fresh charge. Same result, same money - but if you switch control after generate to randomize on an audio node with a temperature-ish setting, you're paying per roll.

CategorySpicyAPI/Audio/HeartMuLa

Inputs (2)

NameTypeDefaultDescription
audio_urlAUDIOURL of the audio file to transcribe. Must resolve directly to audio, not to a web page.
seedINT00–2147483647This model takes no seed, so the number is never sent. Changing it makes ComfyUI run the node again: set 'control after generate' to randomize for a new result on every run; every run is billed.

Outputs (2)

NameTypeDescription
textSTRING—
task idSTRINGThe SpicyAPI task id, for the console logs or support.