HeartMuLa Lyrics Transcriber
Got Audio? This Node Turns It Into Text Inside ComfyUI
- transcriptor
- audio
- STRING
The "music generation" half of HeartMuLa is why most people install this pack. The other half - this node - is the sleeper. HeartMuLaLyricsTranscriber takes any AUDIO socket in your graph and returns the words being sung as a plain STRING. It's a Whisper-based speech-to-text, exposed as a ComfyUI node, and it's the cheapest thing in the pack to make useful.
The obvious trick, and the one the pack's transcription example workflow demonstrates: generate a song, decode it to audio, then feed that audio straight back into this node and read what the model actually sang. HeartMuLa's vocal output isn't Suno-quality, so what comes back is often gloriously wrong - and that's useful, because it's a fast feedback loop for iterating on lyrics before you commit to a full render. It also works on any audio you can get into the graph, not just HeartMuLa output.
How it works
Under the hood it does the boring-but-necessary prep itself: converts your audio to mono, resamples to 16 kHz (Whisper's native rate) if it isn't already, then runs the transcriptor with task="transcribe". The settings you see on the node are genuine Whisper generation parameters, not decoration:
- max_new_tokens (
INT, default 256, up to 445) - caps how long the transcription can get. Your first stop if text is getting cut off. - num_beams (
INT, default 2) - beam search width. Higher = better but slower; 1 is greedy and fast. - condition_on_prev_tokens (
BOOLEAN, default off) - lets later segments lean on earlier ones as context. Flip it on for long-form audio where words flow across segment boundaries. - logprob_threshold (
FLOAT, default -1.0) and no_speech_threshold (FLOAT, default 0.4) - Whisper's classic silence-and-confidence gates for skipping empty segments. If your output is full of[silence]stubs, raise the no-speech threshold. - temperature (
FLOAT, default 0.0) - and here's the detail that trips people up:0.0doesn't mean "greedy," it means the model runs its built-in multi-temperature fallback (0.0, then 0.1, 0.2, 0.4 as confidence drops). It's the robust default. Leave it alone until you have a reason.
Output is a single STRING socket. In the example workflow it feeds a text preview node; you can wire it into anything that consumes text.
Wiring and gotchas
You need the HeartMuLaTranscriptionLoader feeding the transcriptor input and any AUDIO source (from LoadAudio, the pack's own Audio Decoder, a TTS node - whatever). The loaders are installed with the same pack clone:
cd ComfyUI/custom_nodes
git clone https://github.com/BobRandomNumber/ComfyUI-HeartMuLa.git
pip install -r requirements.txt
The only model requirement is HeartTranscriptor-oss sitting in ComfyUI/models/HeartMuLa/, which loads in fp16 and doesn't need the big generator at all - so this whole workflow runs on modest hardware.
Where people get burned: feeding it a music mix and expecting clean lyrics (it's an ASR model, not a vocal-separator - you get the words it can pull out of the mix), and leaving temperature above 0 as a fixed value, which kills the multi-temperature fallback that's carrying you. Otherwise it just works, and for a pack that's mostly about making noise, that's a nice piece of quiet utility.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| transcriptor | HEARTMULA_TRANSCRIPTOR | — | |
| audio | AUDIO | — | |
| max_new_tokens | INT | 2561–445 | — |
| num_beams | INT | 21–5 | — |
| condition_on_prev_tokens | BOOLEAN | false | — |
| logprob_threshold | FLOAT | -1.0-20–0 | — |
| no_speech_threshold | FLOAT | 0.400–1 | — |
| temperature | FLOAT | 0.00–1 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| STRING | STRING | — |