Apply Misheard Check
It Only Takes the Fix If It Sounds Like What Was Sung
- report
- brief
- lyrics
- report
Ask a language model to "fix" a lyric sheet and it will fix things that were never broken - smooth a repetition, tidy an ad-lib, replace a name it doesn't recognise. Apply Misheard Check exists because of that, and its real job isn't applying corrections. It's refusing them.
This is the second half of the cover path's Fix Misheard Words, sitting right after Compose Misheard Check. Compose asks the writer model which words the ASR misheard; Apply decides which of the writer's corrections are allowed to touch your lyrics.
The three gates
A correction only lands if it clears all of this. The source is candid about the numbers, which makes the node far easier to reason about:
It has to be sure. 80% confidence for a word the ASR itself flagged as unsure, 90% for a word it heard clearly - a clearly heard word is misheard less often, so the bar is higher.
It has to sound like what was heard. The letters - consonants especially - are compared against the draft, and below 60% similarity it's a rewrite wearing a correction's clothes. Tuned on 20 songs with Gemma 4 E4B: at 0.5 the writer slipped through it → this and not → and. At 0.6 what passed looked like Zingway → Sing way, in'cause → because, willing down → feeling down - the shape of a real mishearing.
It has to have the same syllable count. The melody's notes don't move, so a correction that adds a syllable would garble the line.
One correction also replaces at most a few words in a row, so no single fix can rewrite half a line. Clear all of it and the corrected draft goes out; fail any of it and the draft stays exactly as the ASR heard it.
The inputs that matter
- lyrics - required. The draft from
Transcribe Lyrics, the same text you sent to Compose. Not your own lyrics: this node only repairs a hearing. - answer - optional and lazy. The writer model's reply - lazy matters, because if the lyrics aren't a cover's original lyrics this input is never requested, so the writer never runs.
- report - optional.
Transcribe Lyrics' report; it knows which words were heard with low confidence, and those are compared against the looser 80% bar. - brief - optional, but it's the gate: only a Cover Brief asking for original lyrics gets checked at all. Its title names the song for the writer.
- language - optional; the language
Transcribe Lyricsheard.
Outputs: lyrics - the draft with the corrections applied, which goes to Song Sheet · Text and on to the render - and report, a PLENIO_REPORT listing what was corrected and why not the rest.
What you actually see
The report isn't a log you scroll; it lands where you're working. Song Sheet · Text shows each correction beside the word heard - Corrected as misheard: ~~doun~~ → down - and each undoes like any other edit, because your text beats both the ASR and the writer.
Release note: the older Check Sung Words node is retired as of 1.2.1 - what a take sings stays as heard, and this pair works before the render instead.
Install
Part of the pack, nothing node-specific:
cd ComfyUI/custom_nodes
git clone https://github.com/jplenio/Plenio-Music-Production-System
ComfyUI Manager → Plenio Music Production System works too. Restart (0.37.0+, tested on 0.41.0); no Python packages. The weight is elsewhere: a writer model (Gemma 4 via native text generation, or any GGUF through the pack's Local LLM node) and Qwen3-ASR 1.7B plus Qwen3-ForcedAligner 0.6B, roughly 6 GB into models/plenio/asr on first transcription.
Where it goes quiet
Chinese and Japanese drafts are never checked. A misheard character can't be identified by sound, and in the author's measurement the writer swapped characters freely - tears became bitter cold. The node refuses rather than guesses. Covering a Mandarin song? This pair won't help, and won't pretend to.
Lyrics you made manual bypass everything. Nothing is asked, nothing is corrected. Same for new lyrics, instrumentals and ordinary generated songs - the draft passes through untouched.
A prose answer means zero corrections. If your writer ignores the JSON instruction, Apply reports "the writer's answer had no fixes list" and hands the lyrics on unchanged. Writer-side problem: drop the temperature, check Compose's schema output is wired to the Local LLM node, and avoid models that open with "Sure! Here are the corrections:".
Expect corrections to be occasional, not thorough. A rough vocal, heavy reverb, or a language the ASR handles badly means more damage than three gates can responsibly repair. At that point, type the lyrics into Song Sheet · Text yourself - two minutes for a chorus you care about, and it beats debugging a hearing. This is a safety net, not a lyric sheet generator.
Before you go hunting for help: this pack has no community footprint in our reddit corpus - zero mentions as of writing, no thread to find. The repo's docs/user/paths/yue2-cover.md has a Misheard words section with the thresholds and the workflow order, and that's your documentation.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| lyrics | STRING | The lyrics draft Transcribe Lyrics made from the source's singing (its 'lyrics' output). | |
| answeropt | STRING | The writer model's answer (asked only for a cover's original lyrics). | |
| reportopt | PLENIO_REPORT | Transcribe Lyrics' report: which words it heard unsure (they are marked for the writer). | |
| briefopt | PLENIO_BRIEF | The Cover Brief: only original lyrics are checked; its title names the song for the writer. | |
| languageopt | STRING | The language Transcribe Lyrics heard (its 'language' output). |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| lyrics | STRING | The draft, with the misheard words corrected. |
| report | PLENIO_REPORT | What was corrected, and why not the rest. |