Audio Watermark
Stamp your name into the audio itself — audibly, not invisibly
- audio
- audio
- output_path
- duration_sec
- summary
Watermarking a video is easy - text on a corner. Watermarking audio is harder, and there are two entirely different jobs hiding in the word. One is the invisible, forensic kind that survives re-encoding and identifies a leak. The other is the audible kind: an obvious repeating tone or chirp that makes a preview unstealable, the way a radio station sweeps a tone through an unreleased track. MKRAudioWatermark is the second kind - it's a preview-protection and branding tool, not a hidden tracker. Don't come here expecting imperceptible steganography.
It sits in the MKRShift_Nodes Watermark branch (the same family that includes the video and image watermark nodes), and its natural use is in a demo/review pipeline: watermark the pre-master audio before you send it to a client, then swap in the clean version for delivery.
How it works
The node synthesizes a short watermark sound and mixes it into your audio on a repeating schedule. Three modes:
tone_pulse(default) - a steady sine atfrequency_hz(default 1800 Hz), pulsed atinterval_secintervals forpulse_duration_mseach. The classic "this is a preview" beep.chirp_pulse- the same, but the tone sweeps upward by 35% across each pulse, so it's harder to notch out with a narrow EQ.text_pattern- encodes yoursignature_textas an on/off pattern atpattern_unit_msper bit, rendered as tone bursts. It's Morse-like: someone who knows the convention can read the text back off a spectrogram.
level_db (default −28 dB) sets how loud the watermark sits under the audio - quiet enough not to ruin listening, loud enough that EQing it out would hurt the music. Each pulse gets a tiny fade-in/out to avoid clicks, and start_offset_sec delays the first pulse so the intro isn't instantly sullied.
Inputs that matter
audio-MKR_AUDIOpayload, waveform tensor, or file path.mode- the three above.frequency_hz,level_db,interval_sec,pulse_duration_ms- the tone's character and schedule.signature_text- defaultMKRSHIFT; used bytext_pattern.pattern_unit_ms- timing unit fortext_pattern.start_offset_sec- delay before the first pulse.- Standard save block:
output_format,filename_prefix,subfolder,overwrite, optionalfilename_label.
Outputs: audio (MKR_AUDIO), output_path, duration_sec, summary.
Install
ComfyUI Manager (search "MKRShift Nodes"), or:
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
Restart. Pure numpy synthesis - no ffmpeg needed for the watermark itself, only for compressed output. No models.
Common issues
Set expectations up front: this is an audible watermark. If your file gets re-encoded, compressed, or clipped, the tone will degrade - it's protection by annoyance, not by cryptography, and there's a separate MKRInvisibleAudioWatermark in this pack if you want the forensic version. Second, watch the low end: at 40 Hz a watermark is basically sub-bass thump nobody perceives as a "tone," so keep frequency_hz in the mid band (1–3 kHz) where it reads as intentional. And if your clip is short relative to interval_sec - say a 2-second clip at a 4-second interval - you may get zero pulses; the summary warns you, and you should lower the interval.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | * | — | |
| mode | COMBO | tone_pulse | 3 options: tone_pulse, chirp_pulse, text_pattern |
| frequency_hz | FLOAT | 180040–20000 | — |
| level_db | FLOAT | -28.0-60–-3 | — |
| interval_sec | FLOAT | 4.000.05–120 | — |
| pulse_duration_ms | INT | 12010–5000 | — |
| start_offset_sec | FLOAT | 0.000–120 | — |
| signature_text | STRING | MKRSHIFT | — |
| pattern_unit_ms | INT | 8010–2000 | — |
| output_format | COMBO | auto | 5 options: auto, wav, mp3, flac, ogg |
| filename_prefix | STRING | MKR_audio_watermark | — |
| subfolder | STRING | — | |
| overwrite | BOOLEAN | false | — |
| filename_labelopt | STRING | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| audio | MKR_AUDIO | — |
| output_path | STRING | — |
| duration_sec | FLOAT | — |
| summary | STRING | — |