Invisible Audio Watermark
Hide a text signature inside audio as near-inaudible tones — and save the result
- audio
- audio
- output_path
- duration_sec
- summary
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 (defaultMKRSHIFT).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.automatches 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.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | * | — | |
| payload_text | STRING | MKRSHIFT | — |
| strength_db | FLOAT | -42.0-80–-20 | — |
| carrier_hz | FLOAT | 150002000–20000 | — |
| chunk_ms | INT | 8020–1000 | — |
| seed | INT | 13370–2147483647 | — |
| output_format | COMBO | auto | 5 options: auto, wav, mp3, flac, ogg |
| filename_prefix | STRING | MKR_invisible_audio_wm | — |
| subfolder | STRING | — | |
| overwrite | BOOLEAN | false | — |
| filename_labelopt | STRING | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| audio | MKR_AUDIO | — |
| output_path | STRING | — |
| duration_sec | FLOAT | — |
| summary | STRING | — |