VoiceSign
The first open-source voice signature tool for individuals.
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:
- Seed derivation - A SHA-256 hash of your salt + identity produces a deterministic seed.
- PN sequence generation - A pseudo-random noise (PN) sequence of +1/-1 values is generated from the seed.
- 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.
- 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 foundconfidence(float) - Confidence score between 0 and 1correlation(float) - Raw Pearson correlation valueidentity_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:
License
Apache 2.0 with attribution requirements. See LICENSE and NOTICE.
Copyright 2024-2026 Oravys Inc.
Powered by Oravys Inc. - Voice Intelligence
Release files for voicesign 0.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| voicesign-0.3.1.tar.gz | 25.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| voicesign-0.3.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 51.1 kB
Release files / voicesign-0.3.1.tar.gz
| Download URL | voicesign-0.3.1.tar.gz |
|---|---|
| Size | 25.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
04f46a07eb70d27365f140c357ebf9d70916fde830156b28a80751a5cfcc6809
|
|
BLAKE2b-256 checksum How to use checksums |
c95e193a35897bfec15402906f955d62a73350ab49de737c8cd7e64bbd9f681d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.7
|
Release files / voicesign-0.3.1-py3-none-any.whl
| Download URL | voicesign-0.3.1-py3-none-any.whl |
|---|---|
| Size | 26.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a4fc41a46cded68dc420a1671092adefbb9c9876ae5e1a80e7d93e58cef85dc4
|
|
BLAKE2b-256 checksum How to use checksums |
d88968d84cd7bb0cfd334b185088b3a4773699beb9b1cfa44033ec265b43b9fc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.7
|