Protoface Eleven Music · Generate Music
A prompt-to-song node for when ACE-Step won't cut it
- audio
- files
- run id
A song generator, inside the graph
For about two years the local answer to "I want music" was ACE-Step, and it's a genuinely good answer - a Sana-style deep-compression autoencoder that renders minutes of audio in seconds, with LoRAs and an XL variant grown around it. What it is not is ElevenLabs' music model: coherent arrangements, actual vocals, a mix that doesn't need rescuing.
This node puts that on your canvas. Part of Protoface, a beta pack that wraps hosted models as native ComfyUI nodes - paid per generation, running on their side, no weights and no VRAM.
The case that makes it worth the money: you have a 30-second vertical clip and need a score that lands with the cut. You can spend an evening prompting ACE-Step and still get a track that wanders, or a minute describing what you want. For anything you'll publish, the second path usually wins on time.
How it works
Under the hood it's the same adapter every Protoface node uses: your widgets become a request against the provider's public schema, the pack validates it, submits the job, polls, journals the intent in a local SQLite file so a crash can't double-charge you, and then materialises the result as a native AUDIO.
The control that trips people up isn't musical at all. generation_id is the paid-request identity, not a seed. Keep it where it is unless you deliberately want to buy another take.
The inputs that matter
Four of them, really.
prompt is the description - genre, instrumentation, mood, tempo, the usual. Multiline, so write it as a paragraph rather than keywords if you can; the model responds better to a scene than to a tag list.
force_instrumental defaults to true, which is worth noticing. If you prompted for a vocal track and got a karaoke bed, that's why. Flip it off when you want singing - and expect to iterate on the vocal, because this is the part of music generation least under your control.
music_length_ms is in milliseconds, from 5,000 to 300,000. The default is 10,000, i.e. ten seconds - a sting, not a track. Keep the math in your head: 1,000 ms per second, so 30 s is 30000, a minute is 60000, three minutes 180000. It's a target length, not a hard guarantee, and longer costs more.
output_format defaults to mp3_standard. Fine for a video soundtrack. If you're processing it further - ducking it under dialogue, limiting, passing it to another node - check whether a lossless option exists before you commit, because you don't want to transcode twice.
Outputs
audio is a list of native AUDIO. Wire it to Save Audio, or into whatever else wants audio. Because it's a list, "the model returned two takes" is normal, and any connected downstream node runs once per take.
files is a list of PROTOFACE_FILE - the original downloads, in whatever format the provider served. Useful when you want the API's file rather than ComfyUI's re-encode.
run id is a plain string. If the render finished after your browser dropped, that plus the Protoface Resume Run node gets you the result without paying again.
Install
In ComfyUI Manager, search Protoface and install protoface-nodes, then restart and reload the browser. Manual, from your ComfyUI directory:
git clone --branch v0.1.0 --depth 1 https://github.com/protoface-ai/protoface-comfyui.git custom_nodes/protoface
python -m pip install -r custom_nodes/protoface/requirements.txt
Then restart. ComfyUI 0.41.0+ and Python 3.10+ are required; the four dependencies (httpx, jsonschema, Pillow, av) install fast and don't touch your torch environment. Click Protoface in the lower-right corner and enter a key - separate from Comfy credits, billed to Protoface directly.
One structural note: this pack ships one implementation for all its nodes. If Add Node search shows nothing, the problem is pack discovery, not the music node - check that custom_nodes/protoface/__init__.py exists and that you haven't got a second copy under a different folder name.
Where people get burned
The 10-second default. Most first complaints about this node are really complaints about forgetting to set music_length_ms.
Expecting a fixed-length file. Length is a target. Ten-second requests have come back slightly over; if you're cutting to a timeline, trim rather than trusting the number.
Requeueing to "get a better take" while generation_id is fixed. You'll get the same recorded result back, because that's exactly what fixing it means. Increment it if you want a new render - and accept that it's a new charge.
Losing the key on restart. Interactive keys live in server memory only. On a headless box, set PROTOFACE_API_KEY_FILE to a private file before launch. And remember anyone who can queue workflows on that server can spend on your key.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Text description of the music you want to generate. | |
| force_instrumental | BOOLEAN | true | Generate instrumental music without vocals. |
| music_length_ms | INT | 100005000–300000 | Target duration in milliseconds (5,000-300,000ms, i.e., 5 seconds to 5 minutes). |
| output_format | COMBO | mp3_standard | Audio output format and quality. |
| generation_id | INT | 00–9007199254740991 | Keep fixed to reuse/resume this paid job. Increment for a fresh paid generation; independent of the model seed. |
| request_scope | STRING | Automatically assigned per node. Headless clients must supply a stable unique workflow/node ID. This is not a secret. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| files | PROTOFACE_FILE | — |
| run id | STRING | — |