One command

Share the advice.
Hide the person.

Pull a recorded call from Fireflies, Zoom Cloud, or a local file. Hide the other participant's face in one of three ways. Drop their voice below recognition. Write a finished clip locally. The other person's words stay; their identity does not.

Fireflies Zoom Cloud Local file
# Fireflies call, full blur, 14s window python anonymize_call.py \ --fireflies "Wolf Pack Meeting" \ --start 600 --dur 14 \ --mode full \ -o wolfpack.mp4 # Face-only blur on a local file python anonymize_call.py \ --input call.mp4 \ --mode face \ -o out.mp4 # Latest Zoom Cloud recording python anonymize_call.py \ --zoom-latest \ --mode full \ -o zoom.mp4

Hide modes

Three ways to protect identity

Choose the right level of concealment for the call. Every mode also drops the other person's voice pitch so their voice cannot be matched.

--mode full
Full-frame blur

Heavy Gaussian blur across the entire frame. Face AND background are gone. Impossible to determine who or where. Best for camera-on calls where the surroundings would be identifiable.

--mode face
Face-region blur

YuNet DNN detects the face region only. Background stays. A cleaner visual for viewers; face is gone, the rest of the frame is intact. Good when you want context but not identity.

--mode card
Merlino card

Replaces the whole frame with the navy and copper branded card. On-brand, strong visual identity, zero ambiguity. Best for polished content going to public channels.


Voice anonymization

Their words. Not their voice.

No ML. Pure ffmpeg. Instant.

The pitch shift uses a three-filter ffmpeg chain: asetrate, aresample, atempo. Pitch drops while duration stays exactly the same, so lip-sync holds. Only the spans you specify get shifted; your voice is untouched.

asetrate=SR*P , aresample=SR , atempo=1/P
0.82
Typical pitch factor

Sources

Pulls from where you record

No manual download. Pass a flag and the tool fetches the recording directly.

📷
Fireflies.ai

Pass --fireflies "Meeting title" (exact or partial). Requires FIREFLIES_API_KEY in env.

API pull
📹
Zoom Cloud

Pass --zoom-latest for the most recent cloud recording. Requires Zoom Server-to-Server OAuth keys in env.

OAuth pull
💾
Local file

Pass --input call.mp4. Works with any MP4, and any recording source: Loom, Meet, Fathom, or raw screen capture.

Any mp4

What runs under the hood

  • 1
    Fetch the recording

    Pulls via Fireflies API, Zoom OAuth, or reads a local path. Output stays local and gitignored.

  • 2
    Detect and trim

    Optional window (--start, --dur) cuts to the segment you want. Skip for the full call.

  • 3
    Apply the hide mode

    Full blur, YuNet face blur, or the Merlino navy/copper card replaces each frame via OpenCV + ffmpeg.

  • 4
    Drop the voice

    ffmpeg pitch-shifts at P=0.82 by default on all speech spans, restoring duration with atempo.

  • 5
    Write locally

    Finished MP4 written to the path you pass with -o. Nothing leaves the machine; no footage in git.

# Install pip install -r requirements.txt # (ffmpeg must be on PATH) # Fireflies, full frame, 14s python anonymize_call.py \ --fireflies "Call title" \ --start 600 \ --dur 14 \ --mode full \ -o out.mp4 # Zoom latest, face blur python anonymize_call.py \ --zoom-latest \ --mode face \ -o zoom.mp4 # Local file, Merlino card python anonymize_call.py \ --input call.mp4 \ --mode card \ -o branded.mp4 # Custom pitch factor python anonymize_call.py \ --input call.mp4 \ --mode full \ --pitch 0.80 \ -o out.mp4