ComfyUI Node

T8 作词规划器 / Lyric Writer

Get the words right before you spend a music generation on them

By T8mars·Created 2 months ago·Updated 2 days ago· 347
T8 作词规划器 / Lyric Writer
  • provider_config
  • lyrics
  • lyric_plan_json
  • lyric_report_json
◄music_idea►
◄lyrics_mode新写 / New►
◄lyrics_language中文►
◄song_typeAUTO►
◄quality_mode标准 / Standard►
◄seed0►
◄api_mode贞贞平价小屋(推荐)►
◄ai_workshop_modelgemini-3.5-flash►
◄llm_max_tokens16384►
◄local_modelQwen3.8-27B-Q4_K_M.gguf►
◄local_context_size32768►
◄local_max_tokens16384►
◄local_think_mode关闭(推荐,速度优先)►
◄local_reasoning_effortmedium►
◄local_unload_policy执行后卸载(推荐)►
◄local_comfy_memory_policyAUTO(显存不足时释放)►
◄to_whom►
◄at_what_moment►
◄anchor_object►
◄existing_lyrics►
◄structure►
◄constraints►
◄custom_model►
◄openai_base_url►
◄api_key►

What it is

A text planner. It writes lyrics, and it emits a versioned contract - t8-lyric-plan/v1 - that the pack's music nodes can read off a socket. No audio, no ABC notation, no MIDI. It's a writer, not a singer.

The reason this exists as its own node: the open music models are good at instrumental and shaky at words. ACE-Step is the local answer to Suno and genuinely compelling for instrumental work, but the standing complaint about both it and Suno is the lyrics - "the lyrics are absolute garbage" is a comment you'll find verbatim in threads about ACE-Step 1.5. So you split the job: get the words right in a cheap, re-runnable text step, then hand finished text to Music 3 or YuE2 for style and structure. Rewriting your chorus costs one text call instead of another render.

How it works

It's an LLM node with a strict contract. The system instruction demands a single JSON object containing lyrics, asks for [Verse], [Chorus], [Bridge] and [Outro] tags, and insists the song makes one clear choice about its intent, its listener, its moment and one recurring anchor object - concrete images, a hook that sticks, varied line lengths, a deliberate ending. It bans quoting known songs and imitating a living artist, and tells the model your text is data, not instructions. The usual injection guard.

Everything after that is local. The node assembles the plan, computes a plan_id as a content hash of the plan body, records where the lyrics came from (explicit when you supplied them in preserve mode, inferred when the model wrote them), and writes a report. Creative text fields are length-checked and rejected outright if they look like they contain an API key, rather than being shipped to a provider.

Four channels, same as the rest of the pack: ZhenZhen Affordable AI Shop by default, AI Workshop, any OpenAI-compatible endpoint, or local GGUF with no key.

Inputs worth setting

music_idea is required and multiline. Then three that punch above their weight: to_whom, at_what_moment and anchor_object. A generic request gives you a generic song; naming the listener, the moment and the one object that keeps coming back is most of what makes a lyric feel specific.

lyrics_mode is 新写 / 严格保留 / 整首改写. Preserve is verbatim - the lyrics pass straight through, no lyric request is made, and the plan marks them locked. lyrics_language covers 中文, English, 日本語, 한국어 and 粤语 / Cantonese, and song_type is AUTO or one of 态度型 / 情境型 / 叙事型 / 说理型. existing_lyrics, structure and constraints are your levers for shape and for what to avoid.

quality_mode is 标准 / Standard or 仅文本审校 / Text review, which adds exactly one extra review request. Everything else - seed, llm_max_tokens, the local GGUF settings - is plumbing.

Outputs, and how they wire in

lyrics is the plain text and the one you'll use most: into Music 3's lyrics input, or YuE2's. lyric_plan_json is the contract - connect it to the lyric_plan socket on Music 3 or YuE2, where it's checked for schema version, size and credential-shaped content before anything goes upstream. lyric_report_json records the mode, provider, model, stages run, review text, the plan_id, and a blunt audio_verified: false.

The trap when you wire it downstream

If you connect a finished lyric plan, leave the receiving node's own lyric mode on AUTO or strict-preserve. YuE2 refuses to run generate mode on top of a connected plan, and it errors if the plan's lyrics disagree with a separate lyric input rather than silently picking a winner. Both are correct behavior that reads like a bug if you weren't expecting it.

Installation

Same pack, same two options - search MiniMax H3 / Seedance 2.0 / Music 3 Prompt Enhancer (T8) in ComfyUI-Manager, or:

cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/comfyui-minimax-h3-prompt-enhancer-T8.git

Then restart ComfyUI and hard-refresh with Ctrl+F5. There's nothing to download for the cloud route - no model files, no special dependencies. Local GGUF is the optional heavy path, and for these planners it's text-only: a GGUF in ComfyUI/models/LLM and a runtime. No mmproj, since nothing here looks at images.

Gotchas

Strict-preserve mode with an empty existing_lyrics errors before any request is made. That's intentional - there is nothing to preserve.

Don't read the review as a verdict on the song. 仅文本审校 is a text review, and the report says audio_verified: false in as many words. A clean review means the words hold up on the page, nothing more.

Language is requested, not enforced. There's no local checker in this node, so if you ask for 中文 and get English back, that's a re-run with another seed or a different model - not a setting you've got wrong.

And the usual one for this pack: if Manager says it installed successfully but the node is missing or stale, it probably rolled you back to an older "active" Registry version. Pull from GitHub instead, and keep exactly one copy of the pack in custom_nodes.

CategoryT8/Music

Inputs (26)

NameTypeDefaultDescription
music_ideaSTRING—
lyrics_modeCOMBO新写 / New3 options: 新写 / New, 严格保留 / Preserve, 整首改写 / Rewrite
lyrics_languageCOMBO中文5 options: 中文, English, 日本語, 한국어, 粤语 / Cantonese
song_typeCOMBOAUTO5 options: AUTO, 态度型 / Attitudinal, 情境型 / Situational, 叙事型 / Narrative, 说理型 / Expository
quality_modeCOMBO标准 / Standard2 options: 标准 / Standard, 仅文本审校 / Text review
seedINT00–18446744073709550000—
api_modeCOMBO贞贞平价小屋(推荐)4 options: 贞贞平价小屋(推荐), 贞贞的AI工坊(图片/视频), OpenAI兼容接口(备用), 本地 GGUF(llama.cpp / Qwen,离线)
ai_workshop_modelCOMBOgemini-3.5-flash2 options: gemini-3.5-flash, Custom(自定义)
llm_max_tokensINT16384256–61440—
local_modelCOMBOQwen3.8-27B-Q4_K_M.gguf1 options: Qwen3.8-27B-Q4_K_M.gguf
local_context_sizeINT327688192–65536—
local_max_tokensINT16384256–61440—
local_think_modeCOMBO关闭(推荐,速度优先)2 options: 关闭(推荐,速度优先), 开启(质量优先)
local_reasoning_effortCOMBOmedium3 options: low, medium, xhigh
local_unload_policyCOMBO执行后卸载(推荐)3 options: 执行后卸载(推荐), 保持驻留, 空闲10分钟后卸载
local_comfy_memory_policyCOMBOAUTO(显存不足时释放)2 options: AUTO(显存不足时释放), 不主动释放 ComfyUI 模型
to_whomoptSTRING—
at_what_momentoptSTRING—
anchor_objectoptSTRING—
existing_lyricsoptSTRING—
structureoptSTRING—
constraintsoptSTRING—
custom_modeloptSTRING—
openai_base_urloptSTRING—
api_keyoptSTRING接 STRING 或使用已保存凭据;不会写入计划。
provider_configoptT8_LLM_PROVIDER_CONFIG—

Outputs (3)

NameTypeDescription
lyricsSTRING—
lyric_plan_jsonSTRING—
lyric_report_jsonSTRING—