Nodes/MKRShift_Nodes/Invisible Audio Watermark
ComfyUI Node

Invisible Audio Watermark

Hide a text signature inside audio as near-inaudible tones — and save the result

By criskb·Created 7 months ago·Updated 5 months ago· 0
Invisible Audio Watermark
  • audio
  • audio
  • output_path
  • duration_sec
  • summary
payload_textMKRSHIFT
strength_db-42.0
carrier_hz15000
chunk_ms80
seed1337
output_formatauto
filename_prefixMKR_invisible_audio_wm
subfolder
overwritefalse
filename_label

You've watermarked your renders; now somebody's going to rip the audio track off your AI video and claim it. MKRInvisibleAudioWatermark hides a text payload inside audio as a set of tones so quiet and so high-pitched that they're effectively inaudible, then saves the watermarked file. It's the audio half of the pack's invisible-watermark pair, and it's the kind of provenance marker you bake into masters before they leave your machine.

How it works

The payload text is converted to a bitstream, and each bit is encoded as a short tone burst (chunk_ms, default 80) at a frequency near the carrier_hz (default 15000). A 1 bit sits at the carrier frequency; a 0 bit sits slightly below it (about 8% lower); each chunk gets a per-chunk phase offset so the bursts don't stack coherently into an audible buzz. The whole watermark track is scaled to strength_db (default −42 dB) and added to the input waveform. At −42 dB relative to full scale, that's around 0.8% amplitude - you will not hear it on music, and most people can't perceive 15 kHz at all.

The seed (default 1337) seeds the phase offsets, and together with payload_text it determines the exact pattern - same key, same watermark, so you can regenerate and correlate later.

Inputs that matter

  • audio - the input, any type the graph gives you; the node pulls a waveform out of it.
  • payload_text - what you're hiding (default MKRSHIFT).
  • strength_db - the honesty dial. −42 is subtle; push toward −20 and it becomes an audible high hiss on quiet passages and headphones. Don't, unless you're testing.
  • carrier_hz - default 15000, way up where hearing falls off. Lower it and it gets easier to detect but more audible.
  • output_format - auto, wav, mp3, flac, ogg. auto matches the input.
  • filename_prefix, subfolder, overwrite, filename_label - where the result lands.

Outputs

  • audio (MKR_AUDIO) - the watermarked audio payload for further graph use.
  • output_path - where the file was saved.
  • duration_sec - the duration, as a float.
  • summary - the signature, payload length, strength, carrier, chunk size, and warnings.

Installing it

Part of the pack:

# ComfyUI Manager: search "MKRShift Nodes", install, restart.
# or:
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
# restart ComfyUI

One real dependency: ffmpeg. The README calls it out - install ffmpeg for the audio and video export/muxing nodes. WAV output is pure Python, but mp3/flac/ogg encoding goes through ffmpeg, and without it the node warns and can't produce those formats.

The honest limitations

Same story as the image version, tuned for audio. This is a provenance marker, not DRM:

  • Lossy encoding will eat it. Default carrier 15 kHz is right where mp3 and Ogg encoding heavily attenuate. If you watermark a WAV and it later becomes a 128 kbps mp3, don't expect to recover much. Watermark the final distribution format, or keep the watermarked WAV as the master.
  • Playback hardware won't reproduce it reliably. Many phone speakers and cheap earbuds simply don't output 15 kHz. The watermark is for copies you control and can examine spectrally, not for attribution after the fact.
  • No decoder ships in the pack - like the image twin, you'd reproduce the reference pattern externally to detect it.

Where it's genuinely good: watermarking finished audio masters or AI-video soundtracks before delivery, so you can tell your copy from a leaked one if you still hold the source. Keep the strength down, keep the carrier high, and treat it as a fingerprint rather than a lock.

CategoryMKRShift Nodes/Media/Watermark

Inputs (11)

NameTypeDefaultDescription
audio*
payload_textSTRINGMKRSHIFT
strength_dbFLOAT-42.0-80–-20
carrier_hzFLOAT150002000–20000
chunk_msINT8020–1000
seedINT13370–2147483647
output_formatCOMBOauto5 options: auto, wav, mp3, flac, ogg
filename_prefixSTRINGMKR_invisible_audio_wm
subfolderSTRING
overwriteBOOLEANfalse
filename_labeloptSTRING

Outputs (4)

NameTypeDescription
audioMKR_AUDIO
output_pathSTRING
duration_secFLOAT
summarySTRING