VoxLock
The best performing voice isolator there is. VoxLock is an open-source voice isolation model: it keeps the caller's voice and removes the other voices in the room before speech-to-text hears them. Made for voice agents and phone calls: one input, the call audio, and it picks out the caller by itself. It streams on a CPU with 24 ms of algorithmic latency.
Live demo · Model on Hugging Face
Results
| Model | Access | Word error rate % | Background words leaked / min |
|---|---|---|---|
| VoxLock | open | 4.95 | 0.11 |
| Krisp VI 2.5 Default | paid | 5.30 | 1.52 |
| Krisp VI 2.5 Balanced | paid | 5.32 | 2.02 |
| Krisp VI 2.5 HD | paid | 5.79 | 2.74 |
| Krisp VI 2.5 Lite | paid | 6.21 | 4.52 |
| ai-coustics Voice Focus 2.2 L | paid | 6.84 | 0.66 |
| ai-coustics Voice Focus 2.2 S | paid | 6.91 | 1.00 |
| Sanas Voice Isolation SE 1.0 | paid | 9.38 | 13.76 |
| REAL-TSE causal (VoxLock's starting checkpoint) | open | 9.81 | 13.73 |
| Hush | open | 12.09 | 19.58 |
| DeepFilterNet3 | open | 13.30 | 22.77 |
| TIGER | open | 14.72 | 37.24 |
| No processing | 23.21 | 66.48 | |
| SAM-Audio small (Meta) | open | 33.77 | 21.15 |
265 real recordings from the Krisp Voice Isolation Benchmark, transcribed with Parakeet TDT 0.6B v2 and scored with the benchmark's published method. Background words leaked counts words transcribed while only the background was talking, per minute of that audio.
On real AMI meetings not used in training, with the headset wearer as the caller:
| Model | Access | Word error rate % | Background words leaked / min |
|---|---|---|---|
| VoxLock | open | 10.12 | 2.12 |
| ai-coustics Voice Focus 2.2 S | paid | 11.85 | 1.06 |
| ai-coustics Voice Focus 2.2 L | paid | 12.13 | 1.72 |
| Sanas Voice Isolation SE 1.0 | paid | 13.30 | 5.30 |
| TIGER | open | 22.84 | 36.85 |
| DeepFilterNet3 | open | 26.78 | 38.84 |
| Hush | open | 33.00 | 68.93 |
| No processing | 33.03 | 78.34 |
Caller words missed, deletions, insertions and 95% intervals: bench/results.
Use
pip install voxlock
voxlock call.wav -o caller.wav
Any sample rate, mono or stereo. The model, 50 MB, downloads from Hugging Face on first use.
import voxlock
vl = voxlock.VoxLock()
call = voxlock.load_audio("call.wav") # 16 kHz mono float32
caller = vl.isolate(call) # same length as the input
VoxLock keeps the voice in a 3-second sample of the caller. isolate takes the loudest 3 seconds in the first 15 seconds of the call, which is how it was benchmarked. Pass sample= to choose it yourself.
Live calls
stream = vl.stream(sample) # about 3 s of the caller, 16 kHz mono
for chunk in call_audio: # 16 kHz float32 chunks of any size
send(stream.push(chunk)) # the isolated audio, about 24 ms behind
send(stream.flush()) # at the end of the call
The stream needs the sample before it starts. In a voice agent, take the first 3 seconds the caller speaks, or a sample saved from an earlier call, and pass the audio through until then. Streaming gives the same output as isolate. With 4 CPU threads on an Apple M2 Pro it runs in real time from 40 ms chunks (VoxLock(threads=4)).
PyTorch
git clone https://github.com/arbazsiddiqui/voxlock && cd voxlock
pip install -r requirements.txt
huggingface-cli download arbazsiddiqui/voxlock model.safetensors config.yaml --local-dir ckpt
python isolate.py --ckpt ckpt --in call.wav --out caller.wav
Training
A 27M causal band-split RNN target-speaker extractor, fine-tuned from the REAL-TSE challenge baseline on a single NVIDIA L4:
REAL-TSE tfmap_context_causal_100
-> simulated calls 4,000 steps LibriSpeech callers + background talkers in simulated rooms
-> real AMI crosstalk 4,000 steps headset recordings from 40 meetings
-> long calls (30 s) 800 steps callers who talk throughout
-> rooms and distances 400 steps callers near or far from the mic, background voices dry or in the room, room noise
Repository
| Path | |
|---|---|
voxlock/ |
the pip install voxlock package: whole files, streaming, command line |
isolate.py |
PyTorch inference |
export_onnx.py |
ONNX export |
demo/ |
the browser demo (python demo/serve.py) |
bench/ |
benchmark harness, vendor runners, per-file results |
train/ |
training scripts and data preparation |
Acknowledgements
Built on the REAL-TSE challenge baseline and WeSep by Shuai Wang, Ke Zhang and co-authors, with WeSpeaker's ECAPA model. Trained on LibriSpeech and the AMI Meeting Corpus.
License
Apache-2.0.
Metadata
Release files for voxlock 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| voxlock-1.0.0.tar.gz | 13.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| voxlock-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 26.0 kB
Release files / voxlock-1.0.0.tar.gz
| Download URL | voxlock-1.0.0.tar.gz |
|---|---|
| Size | 13.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0a1dbde773b4cbbb20d3602be844503b2f76e901eab7f9ba803fa34829023500
|
|
BLAKE2b-256 checksum How to use checksums |
7a048753738c60679187b384bd4cd04eedbd1ca2be1a1551007baf9ae0ad93b3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.9
|
Release files / voxlock-1.0.0-py3-none-any.whl
| Download URL | voxlock-1.0.0-py3-none-any.whl |
|---|---|
| Size | 12.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5b2f3a17067886e6fd8aa0163cfdbc737a6d2caa1decf7c58660b9a152f181f1
|
|
BLAKE2b-256 checksum How to use checksums |
b3122681401b9753586dda301a49027ea0bd7e674b1dbb9458a2cbc3c598e2b1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.9
|