Skip to main content

Open-source voice signing - cryptographically sign voice recordings with inaudible watermarks tied to your identity. Ed25519 crypto, sync markers, codec-resilient. By Oravys Inc.

Project description

VoiceSign

The first open-source voice signature tool for individuals.

Powered by Oravys Inc. License Python

VoiceSign lets you embed an inaudible cryptographic watermark into any voice recording, binding it to your identity. Later, anyone can verify that a recording was signed by you. The watermark survives common audio transformations and is imperceptible to the human ear (target SNR: 42-46 dB).

Created by Eliot Cohen Bacrie, Founder and CEO of Oravys Inc.

Web version available at voicesign.eu


Why VoiceSign?

In a world of voice cloning and audio deepfakes, proving that a voice recording is genuinely yours matters. VoiceSign gives individuals a simple, free tool to:

  • Sign your voice memos, podcasts, or recordings with your identity
  • Verify that a recording was signed by a specific person
  • Prove provenance of your original audio content
  • Protect yourself against voice impersonation and unauthorized use

Install

pip install voicesign

Dependencies: numpy. For non-WAV audio formats (MP3, FLAC, M4A), you also need ffmpeg installed on your system.


Quick Start

Python API

import voicesign

# Read your audio file
with open("my_recording.wav", "rb") as f:
    audio = f.read()

# Sign it with your identity
signed = voicesign.sign(audio, identity="Alice Johnson", salt="my-secret-salt")

# Save the signed version
with open("signed_recording.wav", "wb") as f:
    f.write(signed)

# Later, verify it
with open("signed_recording.wav", "rb") as f:
    audio = f.read()

result = voicesign.verify(audio, identity="Alice Johnson", salt="my-secret-salt")

print(result["detected"])     # True
print(result["confidence"])   # 0.95 (95% confidence)
print(result["correlation"])  # 0.87

Command Line

# Sign a recording
voicesign sign -i "Alice Johnson" -s "my-secret" recording.wav

# Output: recording_signed.wav

# Verify a recording
voicesign verify -i "Alice Johnson" -s "my-secret" recording_signed.wav

# Output: MATCH - Voice signature detected for: Alice Johnson
#         Confidence: 95.23%

Custom output path

voicesign sign -i "Alice Johnson" -s "my-secret" -o output.wav input.wav

Non-WAV formats (requires ffmpeg)

voicesign sign -i "Alice Johnson" podcast.mp3
voicesign verify -i "Alice Johnson" podcast_signed.wav

How It Works

VoiceSign uses spread-spectrum audio watermarking in the frequency domain:

  1. Seed derivation - A SHA-256 hash of your salt + identity produces a deterministic seed.
  2. PN sequence generation - A pseudo-random noise (PN) sequence of +1/-1 values is generated from the seed.
  3. Frequency-domain embedding - The audio is split into 100ms segments. For each segment, the PN sequence is added to the real part of the FFT coefficients in the 2-6 kHz band at low amplitude.
  4. Detection - Pearson correlation between the expected PN sequence and the actual frequency coefficients. High correlation = signature present.

The watermark is:

  • Inaudible - Embedded at ~42-46 dB SNR, below human perception
  • Robust - Survives format conversion, mild compression, and noise
  • Deterministic - Same identity + salt always produces the same watermark
  • Lightweight - Pure numpy, no ML models, runs instantly on any machine

API Reference

voicesign.sign(audio_bytes, identity, salt=None, file_format="wav")

Embed an identity watermark into audio.

Parameter Type Description
audio_bytes bytes Raw audio file content
identity str Identity string to bind (name, email, etc.)
salt str or None Secret salt for watermark generation
file_format str Input format: wav, mp3, flac, m4a

Returns: bytes - Watermarked audio as 16-bit mono WAV.

voicesign.verify(audio_bytes, identity, salt=None, file_format="wav")

Check whether audio contains a watermark for a given identity.

Parameter Type Description
audio_bytes bytes Raw audio file content
identity str Identity string to check against
salt str or None Must match the salt used during signing
file_format str Input format: wav, mp3, flac, m4a

Returns: dict with keys:

  • detected (bool) - Whether a matching watermark was found
  • confidence (float) - Confidence score between 0 and 1
  • correlation (float) - Raw Pearson correlation value
  • identity_match (str) - The identity string tested

Security Notes

  • Salt matters. Anyone who knows your salt and identity can forge your watermark. Keep your salt private.
  • Not tamper-proof. A determined adversary who knows the algorithm and your salt can remove or overwrite the watermark. VoiceSign provides provenance, not DRM.
  • Use unique salts. Different salts for different contexts (personal, professional, etc.) prevent cross-context tracking.

Attribution

VoiceSign is created by Eliot Cohen Bacrie and powered by Oravys Inc.

If you use VoiceSign in your project, please include attribution:

Powered by Oravys Inc., created by Eliot Cohen Bacrie

See the NOTICE file for full attribution requirements.


Web Version

For a no-install experience, use the web version at:

voicesign.eu


License

Apache 2.0 with attribution requirements. See LICENSE and NOTICE.

Copyright 2024-2026 Oravys Inc.


Powered by Oravys Inc. - Voice Intelligence

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

voicesign-0.2.0-py3-none-any.whl (24.0 kB view details)

Uploaded Python 3

File details

Details for the file voicesign-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: voicesign-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 24.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for voicesign-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9663b51d7806026834e7bc87ea63d2696f937f73de0c01d9e1c2927e879d6bd5
MD5 632d3fe9ec361103829d3f16d88e90c6
BLAKE2b-256 3ce863f69c8de6036369c991608140a94967a3aea28994982ebef539d6dfb5e2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page