Save Song
Get your Siren track out of ComfyUI and into your library
- audio
- image
- tags
- audio
- path
ComfyUI's core Save Audio node gets the audio out, but a generated song deserves better: a real file format choice, a cover embedded in the file itself, lyrics that a phone can scroll along to, and tags. Save Song is the pack's end-of-the-line node for the Siren music suite, and it does all of it - which is why it's an output node that shows a native audio player and the cover preview right on the node.
What it saves
audio is required, and quality picks the format. The default is FLAC (lossless) - right for anything you're keeping or still A/B-ing. For sending something or keeping a library small, MP3 320k / V0 (VBR) / 128k and Opus 192k / 128k / 96k are there. Encoding runs through PyAV, the same library ComfyUI core uses for Save Audio, so there's nothing extra to install.
Everything is written under one counter-based base name in ComfyUI/output - songs/song_00001.flac, plus songs/song_00001.jpg (the cover) and songs/song_00001.txt (the lyrics) sharing that base name. Set filename_prefix to songs/albumName/song or whatever structure you like; the counter appends.
The three optional inputs worth wiring
image- cover art, saved as a JPEG (quality viaimage_quality, default 90) and embedded in the audio file itself, so the cover survives being copied off somewhere without the sidecar.lyrics- a text input socket (wire a STRING), not a widget. It's written as a.txtnext to the audio and embedded in the file: ID3USLTfor MP3, aLYRICScomment for FLAC/Opus. That's what makes the words show up in a phone's lock-screen player instead of vanishing.tags- wire aSong Tagsnode for artist, album, year, genre and the rest. Without one the file still gets its title (the file's own name) plus whatever cover and lyrics you wired, so tags are the "make it a real song" step.
Outputs
audio passes the track through unchanged, and path is the full saved path - useful for wiring into anything that needs to know where the file landed. Because it's an output node, ComfyUI also lists the saved files in Media Assets, exactly like the core Save Audio node.
Installing it
Part of Kinburg/Kinburg-Nodes - ComfyUI Manager search "Kinburg-Nodes", or cd ComfyUI/custom_nodes && git clone https://github.com/Kinburg/Kinburg-Nodes, then restart. No extra dependencies for this node (PyAV ships with ComfyUI). The only "gotcha" worth naming: the lyrics input is a socket, so if you type lyrics into the node and nothing appears in the saved file, you connected nothing - it has to come over a wire, e.g. out of Siren Score or a Show Text.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | The song to save (required). | |
| filename_prefix | STRING | songs/song | Save path prefix under ComfyUI/output. A counter is appended; the cover (.jpg) and lyrics (.txt) share the same base name. |
| quality | COMBO | MP3 V0 (VBR) | Audio format & quality. FLAC = lossless; MP3/Opus = compressed at the chosen bitrate. |
| imageopt | IMAGE | Optional cover art — saved as a JPEG next to the audio, shown on the node, and embedded IN the audio file so it survives being copied off somewhere. | |
| lyricsopt | STRING | Optional lyrics/text (input only) — saved as a .txt next to the audio and embedded in the file itself (ID3 'USLT' for MP3, a LYRICS comment for FLAC/Opus), which is the frame a phone scrolls along to. Wire a STRING here. | |
| image_qualityopt | INT | 901–100 | JPEG quality for the cover (higher = larger, better). The same JPEG is written next to the song and embedded in it, so this is also the cover's weight inside the file. |
| tagsopt | SONG_TAGS | Artist, album, year, genre and anything else — wire a 'Song Tags' node. Without one the file still gets its title (the file's own name), plus the cover and lyrics wired above. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| path | STRING | — |