Skip to content
AzielEliabPublic

About

Resonance-based audio authenticity verification. Forks welcome.

Topics

Resources

Contributing

Stars

2 stars

Watchers

0 watching

Forks

Repository files navigation

VibeLock

VibeLock checks whether a recording, a photo, or a short clip looks physically consistent with a real voice or camera.

Author: Aziel Eliab License: Apache-2.0

Start

  1. python -m venv .venv && . .venv/bin/activate && pip install -e .
  2. vibelock ui
  3. Open http://127.0.0.1:8760 and choose Add file.

Optional: vibelock doctor

The same three steps are in RUN.txt.

One-click install

curl -fsSL https://vibelock-download-tracker.vibelock.workers.dev/install.sh | bash

The script curls the counted tarball from this project's Worker (/download, User-Agent Mozilla/5.0), extracts, makes a venv, and pip install -e .. Then run vibelock ui.

Or open the Worker product UI (analyze in the browser, then Download / One-click install): https://vibelock-download-tracker.vibelock.workers.dev/

Counted download (Cloudflare Worker)

This is the counted download. GitHub releases exist as a mirror. The Worker serves the gzip itself (HTTP 200, no 302 to GitHub).

That homepage is a complete product UI (title VibeLock — Aziel Eliab): in-browser risk analysis against POST /v1/analyze, score/verdict/metrics, counted Download, one-click install, GitHub, rose-star brand mark, SEO/cite. Risk assessment, not a lie detector and not courtroom proof. Author Aziel Eliab.

Direct tarball (also counted): vibelock-0.3.0.tar.gz

Isolated counter: Worker vibelock-download-tracker, KV VIBELOCK_DOWNLOADS. Not mixed with any other product. /v1 does not increment downloads.

Quick start

Follow Start at the top of this file. After vibelock ui, choose Add file. WAV, PNG, PPM, and .vlvd always work. MP3, MP4, M4A, MOV, WebM, MKV, OGG, and AVI work when ffmpeg is on PATH. Uncompressed PCM inside MP4 (sowt / twos) works without ffmpeg. FLAC also decodes when this build can read it. The result cites physics, linguistics, vibration, and related. A channel without evidence stays insufficient. The score is a risk index, not an accuracy rate and not courtroom proof. Hashes and Export JSON report are under Advanced.

Optional check: vibelock doctor --verify.

Loopback only (127.0.0.1). The file stays on this computer.

Counted download: https://vibelock-download-tracker.vibelock.workers.dev/

Optional mic gate (YOUR default input only; extra [tether]):

pip install -e ".[tether]"
vibelock listen --gate

VibeLock asks whether media is physically consistent with a real vocal tract, a real camera exposure, and — when both are present — a mouth that produced the waveform. It is local DSP (numpy + scipy): vibration– audio coherence, spatial/temporal image-video artifacts, and unnatural pitch/phase shifts. Not a cloud model and not a speech-to-text pipeline.

See the spec: docs/whitepaper.md. How to contribute: CONTRIBUTING.md.

M.I.A.Lock is a separate product. Home: AzielEliab/mialock · counted Worker mialock-download-tracker. In-tree docs/mia-lock/ is a pointer only.

Forks are welcome and always allowed.


Download

Worker product UI + counted download (this project only, ticks automatically):

The homepage is the VibeLock app plus download. Analyze runs in the browser (notes, feature fields, or a WAV/still). The Download button is still the counted gzip. The numbers are vibelock only — its own Worker and KV. Forks that use the same link are counted too.

Direct tarball (also counted): vibelock-0.3.0.tar.gz


iPhone & Android

A local-first Flutter client lives in mobile/. Open that folder in Android Studio or Xcode through Flutter (flutter create . first if android/ / ios/ still hold the skeleton READMEs). Record from the mic; energy / ZCR heuristics labeled as a risk assessment, not a liveness proof.

Counted desktop download: https://vibelock-download-tracker.vibelock.workers.dev/

Forks are welcome and always allowed.


Signals

  1. Dual-channel physics — air microphone plus body-coupled vibration (jaw accelerometer, contact mic, or IMU). Sync, drift-correct, then test coherence, the vibration-to-air transfer function, latency, and resonance decay. This is the strong physical test.
  2. Audio-only forensic + pitch/phase — spectral smoothness, Hilbert phase, formant stability, decay, splices, vocoder buzz, F0 jumps, robotic flat pitch, phase-vocoder stretch. A risk assessment, not a proof of liveness.
  3. Spatial image artifacts — generator upsampling lattice (2-D FFT), PRNU-like noise mismatch, 8×8 block energy, local illuminant drift, blend seams, shading roughness.
  4. Temporal video artifacts — flicker, block-matching flow, identity histogram jumps on still pairs, frame-interpolation ghosts, lighting drift.
  5. Talking-head A/V sync — audio RMS envelope vs center-crop motion energy and envelope GCC-PHAT delay.
  6. Linguistic proxies (experimental) — syllable-rate regularity, pause-spacing variation, and frame-to-frame spectral motion. Not speech-to-text and not a language ID. A clip that is too short, or that has no syllable pulses, does not get a linguistics score.

Every result cites four channels: physics (heuristic), linguistics (experimental), vibration (measurement, or insufficient when no body-coupled track was submitted), and related (spatial / temporal / A/V, heuristic). The 0–1 score is a risk index. It is not an accuracy percentage.

Output: a score in [0, 1], a verdict (consistent / deepfake / inconclusive / inconsistent), and machine-readable reason codes (COHERENCE_LOW, FREQ_FINGERPRINT, PITCH_JUMP, AV_SYNC_FAIL, TEMPORAL_FLICKER, BLEND_BOUNDARY, …).

The transfer-function baseline is learned from synthetic physically-plausible pairs, not from a published human dataset. Visual fixtures are also synthetic cartoons (vibelock/synth_media.py). This README does not invent evaluation numbers.

Privacy: no STT, no identity, no face recognition. Raw media is not retained by default. Processing is local.

Install

Python 3.10+. numpy and scipy only (no ML stack).

pip install -e ".[dev]"

From a release artifact:

python -m pip install vibelock-0.3.0.tar.gz

CLI

# Audio-only forensic (risk assessment)
vibelock analyze path/to/air.wav
vibelock detect path/to/clip.mp4
vibelock detect path/to/voice.mp3

# Dual-channel: air + body-coupled vibration
vibelock analyze path/to/air.wav --vibration path/to/jaw.wav

# Image / video / talking-head (detect is an alias)
vibelock detect path/to/face.png
vibelock detect path/to/frames/ --fps 25
vibelock detect path/to/air.wav --video path/to/frames/

# JSON (score + verdict + reason codes + per-check metrics)
vibelock analyze path/to/air.wav --vibration path/to/jaw.wav --json

# Resample both channels first
vibelock analyze path/to/air.wav --vibration path/to/jaw.wav --sr 16000

vibelock version
vibelock doctor --verify   # local health + WAV/PNG + vision direction
vibelock ui                # localhost UI on 127.0.0.1:8760

--verify on analyze re-reads the file and confirms the score and SHA-256 match. --export PATH writes a JSON report (hashes, scores, limitation).

Local UI

vibelock ui prints Open http://127.0.0.1:8760/.

Binds to 127.0.0.1 only. Self-contained HTML (no CDN, no telemetry). The page follows the system light or dark setting. One primary action: Add file (WAV / PNG / PPM / .vlvd; MP3/MP4/WebM/MOV and other containers this build can decode; FLAC when a decoder is present; uncompressed PCM MP4 without ffmpeg). Advanced (collapsed) holds the vibration file, Sample tone, Sample photo, Sample deepfake, hashes, checks, and Export JSON report. The simple result is one sentence, a score, and which signal channels had evidence (consistent / inconsistent). A channel without evidence stays insufficient. The score is a risk index, not an accuracy rate. Hard max size; truncated or foreign files are rejected in plain language, with a next step, and the process keeps running. Compressed containers without ffmpeg fail closed.

The About panel states the courtroom limitation.

vibelock ui --host 127.0.0.1 --port 8760

analyze exits 0 when the run completes, including low scores. A nonzero exit means the file could not be read or the arguments were wrong.

Library entry point:

from vibelock import analyze
from vibelock.io import load_audio
from vibelock.media import load_image, load_video

audio, sr = load_audio("air.wav")
vib, _ = load_audio("jaw.wav", target_sr=sr)
print(analyze(audio, sr, vibration=vib).score)

img, _ = load_image("face.png")
print(analyze(image=img).verdict, analyze(image=img).reason_codes)

frames, fps, _ = load_video("frames/")
print(analyze(audio, sr, frames=frames, fps=fps).verdict)

Synthetic example

No hardware required:

python examples/analyze_synthetic.py

That script generates a physically-plausible dual-channel pair with vibelock.synth.make_pair, writes WAVs, runs analyze, and prints the score and reason codes.

A/V cartoons (no hardware):

python examples/analyze_deepfake.py

Tests

pip install -e ".[dev]"
python -m pytest -q

Fixtures in tests/conftest.py are synthetic. They prove each physical check moves the score the right way (authentic higher than attacked).

Layout

vibelock/           library (dsp, forensic, vision, temporal, pitch, avsync, media)
tests/              pytest, synthetic audio + A/V attacks
docs/whitepaper.md  July 2026 spec + September 2026 A/V engine
examples/           generate a pair / deepfake cartoon and analyze it
workers/download-tracker/   Cloudflare Worker product UI + wrangler.toml
mobile/             Flutter iPhone & Android client
CONTRIBUTING.md     forks are first-class

Use with AI assistants

Live HTTPS runtime on the download-tracker Worker (does not increment the download counter):

POST /v1/analyze or /v1/detect with features:{rms,zcr,...}, limited pcm_b64+rate, and/or visual / pitch / av / linguistics / vibration feature objects. The response channels array cites physics, linguistics, vibration, and related. Risk assessment, not a liveness proof, and not an accuracy rate. Hosted is not a live mic and does not decode MP4/MP3 bytes; desktop vibelock detect file.mp4 stays local. The Worker ports the same heuristics in JS.

The same OpenAPI spec and MCP catalog work with any MCP- or OpenAPI-capable assistant, including:

  • ChatGPT (GPT Actions / OpenAI)
  • Grok (xAI)
  • Venice
  • Claude (Anthropic)
  • Cursor (MCP)
  • Glama (MCP)
  • Perplexity
  • Microsoft Copilot / Bing
  • Google Gemini / Vertex
  • Mistral
  • Meta AI
  • Apple Intelligence surfaces
  • Amazon Q tooling
  • DuckAssist
  • You.com
  • Cohere
  • and other MCP/OpenAPI-capable assistants

Import the OpenAPI spec or connect the MCP catalog. There are no per-crawler install packages.

ChatGPT Actions: GPT Editor → Actions → Import from URL → https://vibelock-download-tracker.vibelock.workers.dev/openapi.json (no auth).

Grok / xAI tools: add an HTTP/OpenAPI tool pointing at https://vibelock-download-tracker.vibelock.workers.dev/openapi.json.

Venice HTTP tools: add an HTTP tool with method, URL, and JSON body from that spec. Start with GET https://vibelock-download-tracker.vibelock.workers.dev/v1/health.

MCP (Cursor, Glama, and other MCP clients): POST https://aziel-runtime.vibelock.workers.dev/mcp. Catalog MCP mesh_* + FragGate slug=mesh. This Worker GET /mcp is a pointer, not a second MCP. Suite mesh GET /v1/mesh PROXY (default OFF). QNS-CD-1.0 (photon QNS1 packet transfer) is a hub cite / Worker mesh cross-map on that payload — local qnsd stays in qnm-node; runtime cites live in aziel-runtime. Not a Softwares-tab product. No public qnsd proxy.

curl -sS -A 'Mozilla/5.0' -X POST https://vibelock-download-tracker.vibelock.workers.dev/v1/detect \
  -H 'content-type: application/json' \
  -d '{"features":{"rms":0.08,"zcr":0.07},"visual":{"blockiness":1.8,"noise_cv":0.7},"pitch":{"f0_jump":8.5}}'

GET /download still serves the gzip tarball and is counted.

License

Apache-2.0. See LICENSE.

Forks are welcome and always allowed.

About

Resonance-based audio authenticity verification. Forks welcome.

Topics

Resources

Contributing

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages