veilvoice-meta

veilvoice-meta

Strip or spoof identifying metadata: audio tags, and image EXIF/GPS.

reference · the same page on GitHub

Strip or spoof the identifying metadata that rides along with media files.

Why this exists

De-identifying a voice accomplishes nothing if the file still says who recorded it. A phone recording routinely carries the device model, the recording software, a precise timestamp and, for images, GPS coordinates accurate to a few metres. That is often a far easier way to identify someone than analysing their voice, and it survives every DSP transform because it is not in the audio at all.

Strip versus spoof

Removing every tag is not always the least conspicuous choice. A file with no metadata whatsoever is itself a signal: it says the sender was trying to hide something, and it stands out in a set of otherwise ordinary files. Policy therefore offers two approaches:

  • Policy::Strip removes everything. Best when the file is expected to be sanitised anyway, or when any false statement would be worse than an obvious absence.
  • Policy::Realistic replaces the tags with plausible, non-identifying values so the file looks unremarkable rather than scrubbed.

What this crate cannot do

It removes container metadata. It cannot remove information encoded in the media itself: a photograph still shows the room it was taken in, and audio still carries its room acoustics and background noise. Nor does it touch filesystem timestamps or the filename, both of which are outside the file, callers that care must handle those separately.

In plain words

This strips the hidden labels off a file.

Photographs and recordings carry information you never typed: where the picture was taken, which phone or microphone made it, what the file was called before, sometimes a name. Removing the sound of a voice and leaving that behind would be pointless, so this takes it out -- not by blanking the fields, but by removing the parts of the file that hold them.

HOW THE CRATE FITS TOGETHER

lib.rs 121 lines audio.rs 278 lines image.rs 210 lines wav.rs 425 lines Every arrow is a crate:: or super:: path one module actually uses, read out of the source rather than drawn by hand.

Every arrow is a crate:: or super:: path one module actually uses, read out of the source rather than drawn by hand.

The same graph as Mermaid source
%%{init: {"theme":"base","themeVariables":{"background":"#1a1b26","primaryColor":"#1f2335","primaryTextColor":"#c0caf5","primaryBorderColor":"#7aa2f7","secondaryColor":"#16161e","tertiaryColor":"#16161e","lineColor":"#737aa2","textColor":"#c0caf5","mainBkg":"#1f2335","nodeBorder":"#7aa2f7","clusterBkg":"#16161e","clusterBorder":"#2f3549","fontFamily":"ui-monospace, SFMono-Regular, Consolas, monospace","fontSize":"14px"}}}%%
flowchart TD
    n_lib(["lib.rs<br/>121 lines"])
    n_audio["audio.rs<br/>278 lines"]
    n_image["image.rs<br/>210 lines"]
    n_wav["wav.rs<br/>425 lines"]
    n_audio --> n_wav
    click n_lib href "https://github.com/tilas01/veilvoice/blob/main/crates/veilvoice-meta/src/lib.rs" "open the source"
    click n_audio href "https://github.com/tilas01/veilvoice/blob/main/crates/veilvoice-meta/src/audio.rs" "open the source"
    click n_image href "https://github.com/tilas01/veilvoice/blob/main/crates/veilvoice-meta/src/image.rs" "open the source"
    click n_wav href "https://github.com/tilas01/veilvoice/blob/main/crates/veilvoice-meta/src/wav.rs" "open the source"

This site loads no third-party script, so it cannot run Mermaid; the diagram above is the same nodes and edges drawn by the generator instead. GitHub renders the source below directly.

THE FILES

FileLinesWhat it is
audio.rs278Audio tag removal and replacement.
image.rs210Image EXIF/GPS removal.
lib.rs121Strip or spoof the identifying metadata that rides along with media files.
wav.rs425Chunk-level RIFF/WAVE metadata removal.
wav_fuzz.rs299Randomised robustness testing for the RIFF chunk walker.