Skip to main content

Kezek
Splitting mono two-person conversations into per-speaker tracks

Weights · Demo · Paper

Kezek turns a mono recording of exactly two people into one track per person. Each track keeps the original length and timing.

  • Overlaps and short replies ("yeah", "mm-hm") stay on the track of the person who said them.
  • The two tracks always sum exactly to the input.
  • It is built for preparing full-duplex dialogue data from conversational audio that exists only as a mono mix: podcasts, interviews, calls.

How it works

Kezek decides who speaks when and who is who once for the whole recording. A separator then carries out that decision.

Stage Model Parameters
Speaker fingerprint raw-audio speaker embedding, trained to ignore phase 10.1 M
Stage 1 PairNet: activity of the two voices over the whole recording, guided by the fingerprint 11.8 M
Stage 2 KezekTSE-L: Conv-TasNet-style separator conditioned on the activity and the two voice profiles; outputs sum to the input 19.6 M

Total: 41 M parameters, all trained by us. No frozen third-party model is inside.

Results

The comparison is against the open pipeline pyannote → DialogueSidon (as published in the DuplexChat code), on the same recordings, over whole recordings.

Set System Short replies kept ↑ Leak (dB) ↓ No-swap ↑ Coverage ↑ h audio / GPU-h ↑
Open Yap test (as recorded) pyannote → DialogueSidon 0.687 −10.1 0.793 0.735 51
Kezek 0.830 −13.9 0.934 1.000 231
CallHome English (unseen telephone speech) pyannote → DialogueSidon 0.711 / 0.798 −9.7 0.797 0.816 46
Kezek 0.796 / 0.907 −11.8 0.859 1.000 232
  • Replies kept. The share of short replies (< 1 s) kept on the right track. On CallHome: over the other's speech / in pauses.
  • Leak. Energy on a track while only the other person speaks.
  • No-swap. The share of recordings in which the two people's tracks are never swapped.
  • Coverage. The share of the recording returned.
  • Speed. One RTX PRO 6000 GPU.

The metrics, the ablations and an ideal-mask ceiling are in the paper.

Install

pip install kezek

You need Python ≥ 3.10 and PyTorch ≥ 2.4. A CUDA GPU with bf16 is recommended; on CPU it runs in float32 and is much slower.

Use

From the command line:

kezek-separate interview.wav podcast.mp3 --out separated/
# separated/interview_A.wav, separated/interview_B.wav, separated/interview.json

From Python:

import soundfile as sf
from kezek import Kezek

kz = Kezek.from_pretrained()                    # weights from huggingface.co/manifestro/kezek-v1
x, sr = sf.read("interview_16k.wav", dtype="float32")   # mono, 16 kHz
tracks, activity, info = kz(x)                  # tracks [2, T]; activity [2, frames of 20 ms]

The CLI resamples any input to 16 kHz and mixes it down to mono. The JSON next to each pair of tracks gives each person's speech time, the overlap time and the stretches where stage 1 was unsure.

Limitations

  • Quiet replies said under a louder voice are the main remaining loss.
  • Exactly two speakers, offline. No enrollment and no speech restoration: Kezek splits the audio, it does not clean it.
  • Trained and evaluated quantitatively in English.
  • On telephone speech with similar voices, the tracks can swap for part of a call.

Responsible use

Kezek only reassigns audio that is already in a recording; it does not synthesise speech. You must have the right to process the recordings you give it. Do not use it to identify speakers or to clone a person's voice.

Licence

  • Code: MIT (this repository).
  • Weights: Apache-2.0 (Hugging Face).

The model was trained on Open Yap 1K under its Data Use Agreement, on Libri-Light and VoxPopuli, with MUSAN and RIRS noises for augmentation. The training data is not distributed here. See the model card.

Citation

@misc{karl2026kezek,
  title  = {Kezek: Splitting Mono Two-Person Conversations into Per-Speaker Tracks for Full-Duplex Dialogue Data},
  author = {Karl, Bagzhan and Karl, Alizhan},
  year   = {2026},
  eprint = {2611.16933},
  archivePrefix = {arXiv},
  primaryClass = {eess.AS},
  url    = {https://arxiv.org/abs/2611.16933}
}

Acknowledgements

We thank The Agentic Data Company for Open Yap 1K. VoxPopuli: we acknowledge the European Parliament for creating and sharing these materials.

Metadata

Release files for kezek 1.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for kezek 1.0.1
File Size Uploaded Provenance Actions
kezek-1.0.1.tar.gz 19.2 kB With provenance Details for kezek-1.0.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for kezek 1.0.1
File Interpreter ABI Platform Actions
kezek-1.0.1-py3-none-any.whl Python 3 none any Details for kezek-1.0.1-py3-none-any.whl

Total release size: 38.3 kB

Release files / kezek-1.0.1.tar.gz

Download URL kezek-1.0.1.tar.gz
Size 19.2 kB
Tags Source
SHA-256 checksum
How to use checksums
b33fbbbca0b61d8e691aa8a9344a8298246f9581703fee1f067455cbde08135d
BLAKE2b-256 checksum
How to use checksums
5ee00fb4346f7c48ed36b766361fbc584dff4ff470d7f2efd4cdfad7749c04ce
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 13, 2026.

Transparency log

Release files / kezek-1.0.1-py3-none-any.whl

Download URL kezek-1.0.1-py3-none-any.whl
Size 19.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fa4997d545b4126c211b5ae8fa65e6ac1571b577cebbf4c1a2ed91f196c25b86
BLAKE2b-256 checksum
How to use checksums
e92a72b5a33851378e16b7014ab9bc89863ee9cdb995f7e2757c3e0263d06147
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 13, 2026.

Transparency log

Security for kezek 1.0.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for kezek-1.0.1.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 13, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

1.0.1 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page