Save Audio (MP3 w/ Tags)
Your generated track deserves better than 'Unknown Artist'
- audio
- cover_image
You know the feeling: you generate a track you actually like, drag it into your player, and there it sits as "Unknown Artist - Unknown Title" next to everything real. Save Audio (MP3 w/ Tags) is the fix. It's the terminal node of the ComfyUI Audio Expo pack (by Matt Powell, the same person behind the well-liked LM Studio image-to-text node), and its whole job is to take an audio tensor and hand you back a proper MP3 - artist, title, album, genre, even cover art and lyrics baked into the ID3 tags.
Why you'd reach for it: ComfyUI was built image-first, and audio is still the bolt-on layer. Music generation nodes like ACE-Step (the local answer to Suno, native in ComfyUI) hand you an AUDIO tensor, but nothing in the core stack knows how to turn that into a tagged, playable file. This node is that missing "save it properly" step. The pack's own pitch is the infinite generative radio: chain a music node in here with play_in_player on, and each finished track gets queued in VLC while ComfyUI keeps generating the next one.
How it works
The mechanism is simpler than you'd expect, and mostly not AI at all. It writes the waveform to a temp WAV using Python's standard wave module (no codec dependencies, no torchaudio gymnastics), then converts to MP3 with the ffmpeg binary that imageio-ffmpeg bundles - libmp3lame at a sensible VBR quality, so no system FFmpeg install needed. Then it stamps the ID3 frames with mutagen: title, artist, album, year, genre, an optional BPM, your lyrics in the USLT frame, and - if you feed it an image - that image embedded as JPEG front-cover art. Everything ComfyUI's default save nodes refuse to care about.
The inputs that matter
Only a handful are worth touching on your first run:
audio- theAUDIOtensor from ACE-Step, MMAudio, a TTS pack, anywhere. First item in a batch is used; anything on GPU gets moved to CPU automatically.filename_prefix- where it lands. Defaultaudio/ComfyUIbecomesoutput/audio/ComfyUI_00001_.mp3in your ComfyUI output folder.artist,title,album,year,genre- the tags. Defaults are "Unknown Artist"/"Unknown Title"/"Unknown Album", 2024, "Experimental"; change them or leave them, your call.bpm- optional, leave blank to skip the frame entirely.cover_image- optional; first image in the batch becomes the front cover.lyrics- optional multiline; embedded as synchronized-capable USLT text.play_in_player/player- optional, off by default. Turn it on to open the MP3 in VLC/mpv right after saving, non-blocking.
It has no outputs - it's an output node. The MP3 is the output.
Installing it
Same pack as the other Audio Expo nodes, one install:
cd ComfyUI/custom_nodes
git clone https://github.com/mattjohnpowell/comfyui-audio-expo
cd comfyui-audio-expo
pip install -r requirements.txt
Use the Python environment ComfyUI actually runs (portable installs: python_embeded). The non-standard deps are moviepy, mutagen, imageio_ffmpeg, and proglog. Or use ComfyUI Manager → "Install via Git URL" and paste the repo URL, then restart.
When it bites
The one real trap: if mutagen isn't installed, you get an MP3 without tags and a console warning - it doesn't fail, it just silently gives you the thing you were trying to avoid. So install the requirements, don't skip them. If the player never opens, check the console for [AudioExpo] WARNING: ... not found - that means VLC/mpv isn't on PATH; install VLC and the queuing behavior kicks in. And remember playback happens on the machine running ComfyUI, not in your browser - a cloud box plays server-side where you can't hear it. Minor, and worth it for finally having playlists that don't say "Unknown".
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | — | |
| filename_prefix | STRING | audio/ComfyUI | — |
| artist | STRING | Unknown Artist | — |
| title | STRING | Unknown Title | — |
| album | STRING | Unknown Album | — |
| year | STRING | 2024 | — |
| genre | STRING | Experimental | — |
| bpm | STRING | — | |
| cover_imageopt | IMAGE | — | |
| lyricsopt | STRING | — | |
| play_in_playeropt | BOOLEAN | false | — |
| playeropt | COMBO | Auto | 4 options: Auto, VLC, mpv, System Default |
Outputs (0)
No outputs