ARC Save Audio (sign on arrival)
Signing a WAV proves when, not who
- audio
Let's get the honest headline out of the way, because it's the whole story: ARC Save Audio signs a WAV to attest the creation event - when it was made, by whom, against which workflow - and it does not certify that the voice in it is a real person's voice. It is not a "this is not a deepfake" sticker. If you were hoping to sign a voice clone and have that mean something reassuring to a skeptical viewer, read the alpha framing in the pack's README before you build any trust on it. The signature proves the file came out of a specific ComfyUI workflow on a specific date. That's genuinely useful. It's just not voice-authenticity.
What it is
This is the audio sibling of ARC Save in the same pack, added in v1.1.0, and it's labeled alpha. It's a save node for ComfyUI's AUDIO type: wire up a TTS or music-gen node's output, and it encodes the clip to a lossless 16-bit PCM WAV, POSTs it to ArcVelvet's arcIngest API, and writes back the C2PA-signed WAV plus a sidecar receipt. Audio is the newest, thinnest layer in ComfyUI - most of it arrives through bespoke node packs with their own dependency stacks, so it's nice that this one rides on the same simple wire contract as the image node.
How it works
The node takes an AUDIO dict - {'waveform': tensor of shape (B, C, T), 'sample_rate': int} - slices the batch per clip, and encodes each one to WAV with a hand-rolled RIFF header. That's a deliberate move: no torchaudio dependency, one less thing to fight. The audio bytes go to the same signing endpoint as images (the multipart part is even still named image; the server routes by content type, not part name), come back credentialed, and land in your output directory as <prefix>_<vaultItemId>.wav with a <prefix>_<vaultItemId>.arc.json receipt carrying vaultItemId, verifyUrl, contentHash, and traceId. Same fail-loud posture as the image node: a single two-second retry on transient errors, everything else raises with the server's code.
The inputs
Four, same shape as the image node:
audio- theAUDIOdict from a TTS or music-gen node.filename_prefix- defaultArcVelvetAudio.title- optional, baked into the signed assertion.include_prompt_text- same toggle as the image node, with a caveat worth italicizing: it controls text-prompt redaction only. OFF (default) hashes prompt text in the manifest to[REDACTED:sha256:<hex>]envelopes; ON rides verbatim. Either way, the audio bytes themselves are always signed verbatim.
Alpha honesty
The text prompt that drove the generation is moderated server-side through the same gate as the image node - a sexual/minors hit returns HTTP 451 and refuses signing. What's not moderated is the audio content itself: no transcript scanning, no lyrics check, no voice-clone detection. The README is blunt that the audio node is for personal experimentation and is not cleared for a public audio launch. Heed that. Don't distribute signed audio files claiming they're "verified" in a way that implies more than the manifest attests.
Installing it
Same pack, same steps as the image node - there's no ComfyUI Manager entry yet, so it's manual:
cd ComfyUI/custom_nodes
git clone https://github.com/arcvelvetOS/comfyui-arc-save
Restart ComfyUI and the node appears under audio/save. Dependencies are just numpy, Pillow, and requests. You need an API key from arcvelvet.com (Credentials tab, shown exactly once) in arc_config.json or as ARC_API_KEY - and note the image node and this node share the same key and the same rate budget: five signings per minute per key, twenty per account, so long batches will trip ERR_RATE_LIMITED.
One audio-specific failure to know: if you get an HTTP 415 back, the server-side audio support probably hasn't been deployed yet - the node's own error message tells you to contact support rather than guessing. That's the alpha tax.
Reach for ARC Save Audio when you want an auditable creation record for TTS experiments - what workflow produced a clip, when, and what text drove it. That's a real, narrow, defensible thing to sign. Just don't expect the signature to vouch for the voice.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | Audio dict from upstream node (typically a TTS or music-gen node). Expected shape: {'waveform': torch.Tensor of (B, C, T), 'sample_rate': int}. | |
| filename_prefix | STRING | ArcVelvetAudio | — |
| title | STRING | Optional creator-supplied title baked into the signed assertion. | |
| include_prompt_text | BOOLEAN | false | OFF (default): text-prompt fields in the generation graph are SHA-256-hashed before signing. Workflow structure is preserved. ON: prompt rides verbatim in the signed manifest. Same semantics as the image node. NOTE: this controls TEXT-PROMPT redaction only — it does not gate the audio bytes, which are always signed verbatim. |
Outputs (0)
No outputs