Cover song · source lyrics / phrasing (Whisper)
What it hears, and what it makes up
- cover_lyrics
- lyrics_report_json
Covering an existing track means dealing with its words, and SheetSage2 - the model that reads a musical score out of your audio - doesn't transcribe lyrics. It extracts music. So if you want the original words in your cover, or you want new words that fit the original phrasing, something has to listen to the vocal and write down what it heard.
That's this node, and it's the toolkit's longest-running piece of machinery: Whisper, run over your source song, producing timed phrases that either guide the LLM's new lyrics or become the authoritative text of the old ones.
It's gated, and that matters
This node is only active for a YuE2 Cover run with the cover lyrics mode set to new lyrics or original lyrics. Anything else - an instrumental cover, a plain YuE2 song, MiniMax Music 3 - returns an empty result and its report says inactive or not_requested rather than loading a checkpoint of any kind.
That's deliberate, not laziness. Whisper on a clean instrumental buys you nothing but a hallucinated word list, and the toolkit refuses to spend the time or the VRAM. So don't read an empty output as a broken node; read lyrics_report_json first.
The inputs you'll actually touch
Three of the required inputs are wiring, not settings: the song-model profile, the cover source (which carries the lyrics mode and the audio file), and the model check report - that last one exists so configured downloads finish before Whisper tries to load anything.
Then the engine:
whisper_model- a CTranslate2 checkpoint from the pack's catalog. Default and currently only bundled choice iswhisper-large-v3; add a catalog entry to offer another.language-autoor one of 29 codes. Auto detection is usually right, and pinning the language actually being sung is the documented fix for wrong-language or repeated output. This is the source recording's language, not the language you want the new lyrics in.device/compute_type-autoprefers CUDA and drops to CPU with int8.float16on CUDA is the recommended default on a 16 GB card.vad_filter- off by default, and it should stay off for songs. Speech detection misses singing.beam_size- 5 by default. Higher hears slightly more, slower.condition_on_previous_text- off, because carrying text across chunks is how you get a line repeated into the next section.
Outputs are cover_lyrics (plain text, useful if you're building a custom graph) and lyrics_report_json, which carries the text plus segment and word timestamps and the engine settings that actually ran. The bundled workflow feeds the report to the Structured Song Prompt and the parser so the timing evidence survives into the production record; connect that one, not just the text.
Why it's built like a small infrastructure project
Transcription on a long song is the slowest thing in the run, so the engine runs in a separate, cancellable process with progress every 15 seconds. A stalled GPU worker times out after 180 seconds without progress, CPU after 600, and the total budget is the larger of 20 minutes or 20 times the source duration. A CUDA runtime failure or timeout retries once on CPU/int8; later auto runs stay on CPU for that ComfyUI session until you restart. Cancelling discards partial text - no half transcript ever silently becomes your lyrics.
Install
The pack first:
cd ComfyUI/custom_nodes
git clone https://github.com/jplenio/ComfyUI-MiniMax-Music-Production-Toolkit.git
cd ComfyUI-MiniMax-Music-Production-Toolkit
python -m pip install -r requirements.txt
faster-whisper is in that file (on an older install: python -m pip install -r requirements-whisper.txt), pulling CTranslate2, PyAV, ONNX Runtime and Tokenizers without touching your PyTorch. The checkpoint is separate: keep whisper_models and auto_download on in the model check node, and a text-bearing cover run downloads the pinned large-v3 files - about 2.9 GB - into models/audio_encoders/whisper-large-v3. The folder name and the whisper_model value have to match.
Where it goes wrong
VAD ate the song. Older workflows shipped with voice detection on, and on singing it can retain 7 seconds of a 207-second track. Current defaults are off; if a report shows retention under half the audio, the node retries the whole file without VAD and records both attempts.
Empty or fragmentary text. The node has a heuristic guard: on audio of 60 seconds or more, fewer than 12 words ending before 20% of the song stops the run with guidance, because that's a hallucinated opening rather than lyrics. It's a heuristic, not a certificate.
Words that aren't there. Music makes ASR invent things. Pin the language, keep condition_on_previous_text off, and read the transcript before you build a whole cover on top of it. Auto speech recognition on sung material is a good first draft, never verified ground truth - and if the transcription is wrong, the fix is to hand reviewed text to the prompt and parser's cover_lyrics inputs in a custom graph.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| model_profile_json | STRING | Connect 00 - Song model / Production choices. Whisper runs for YuE2 Cover with new or original lyrics; instrumental and other models skip it. | |
| cover_source_json | STRING | Connect Cover song / source audio; it carries the lyrics mode and the audio file. | |
| model_check_report | STRING | Connect the model check node so configured downloads finish before Whisper loads. | |
| whisper_model | COMBO | whisper-large-v3 | CTranslate2 Whisper checkpoint from models_config.json. The bundled default is whisper-large-v3; no singing-specific quality optimum is claimed. Extend the catalog for another checkpoint. |
| language | COMBO | auto | Auto detects the language; forcing it improves accuracy and is the documented remedy for wrong-language or repeated output. Use the language actually sung. |
| device | COMBO | auto | Auto prefers CUDA and falls back to CPU with int8 precision when the GPU cannot run the checkpoint. |
| compute_type | COMBO | auto | Precision for the checkpoint. Auto uses float16 on CUDA and int8 on CPU, which is the recommended default on a 16 GB card. |
| vad_filter | BOOLEAN | false | Off by default for songs. Speech detection may miss singing. If enabled and it retains less than half the audio or no segments, retry the full audio without VAD and record both attempts. Review recognition errors/hallucinations either way. |
| beam_size | INT | 51–10 | Beam width for decoding; 5 is the accuracy/speed default. Higher values are slower and hear slightly more. |
| condition_on_previous_text | BOOLEAN | false | Off is the documented default for music: carrying text between chunks can repeat a line into the next section. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| cover_lyrics | STRING | — |
| lyrics_report_json | STRING | — |