polyvoice 0.14.0

Speaker diarization for Rust — who spoke when. ONNX path optional: default features are empty (ort-free BYO-embedder core); enable onnx for Silero VAD, WeSpeaker embeddings, and Pyannote segmentation.
Documentation
schema = "polyvoice-models-v2"

# Stage-scoped version aliases (Deepgram diarize_model=latest|v1 pattern).
# Resolution is logged so DER reports record the pin that was actually used.
[aliases.segmenter]
latest = "powerset_fp32"
v1 = "powerset_fp32"

[aliases.embedder]
latest = "wespeaker_resnet34"
v1 = "wespeaker_resnet34"

[aliases.vad]
latest = "silero_vad"
v1 = "silero_vad"

# Shipping profiles. Both default to the proven FP32 pair: the recalibrated
# INT8 pair is much faster (~7x embedding stage, ~2x segmentation stage) but
# regresses DER on AMI meetings (+2.0/+2.8 pp), so it ships as the opt-in
# `fast` profile. The FP32 models stay available via their model ids for
# direct ModelRegistry::ensure() callers.
[profiles.mobile]
segmenter = "powerset_fp32"
embedder  = "wespeaker_resnet34"

[profiles.balanced]
segmenter = "powerset_fp32"
embedder  = "wespeaker_resnet34"

# Opt-in speed profile: recalibrated INT8 pair (powerset weights-only dynamic
# + ResNet34 static QDQ). At DER parity on VoxConverse-style audio (+0.2 pp
# on the dev split); expect ~+2 pp DER on AMI-style meeting audio.
[profiles.fast]
segmenter = "powerset_int8"
embedder  = "resnet34_int8"

# Legacy v0.5 entries — kept for back-compat callers that pass the model id
# directly to ModelRegistry::ensure(). Profiles do not reference them anymore.
[models.silero_vad]
url      = "https://github.com/snakers4/silero-vad/raw/master/src/silero_vad/data/silero_vad.onnx"
sha256   = "1a153a22f4509e292a94e67d6f9b85e8deb25b4988682b7e174c65279d8788e3"
size     = 2327524
filename = "silero_vad.onnx"
license  = "MIT"
license_url = "https://github.com/snakers4/silero-vad/blob/master/LICENSE"
provenance = "snakers4/silero-vad upstream ONNX"
adapter_type = "silero"
version  = "1.0"
sample_rate = 16000
signature = '''
untrusted comment: signature from minisign secret key
RUQGu9FvZMmIhZU2jujLiO9QWKC7WPSGEE1crTXcP/4t+FGlbFrJ9+JLTVuj7Om/zXdAo1Aak/nvQo3/7xXev41Qn10+VSda/wE=
trusted comment: polyvoice v0.6.0-alpha.3 | silero_vad.onnx
ECe8pg8lcsO5MxlmAjaLRUIFC2t5TRt8gGrl3boQO7PiVJFZkzgFlgI74YH9T1Dp0bKgaMBJ0kSBIJpmyZVmDw==
'''

[models.wespeaker_resnet34]
url      = "https://huggingface.co/Wespeaker/wespeaker-voxceleb-resnet34/resolve/main/voxceleb_resnet34.onnx?download=true"
sha256   = "9fea6516d7ad6bf0a76c7689f5a49b65d330fad6dde96c91bb4435ffbfe056a1"
size     = 26534127
filename = "wespeaker_resnet34.onnx"
license  = "Apache-2.0"
license_url = "https://huggingface.co/Wespeaker/wespeaker-voxceleb-resnet34"
provenance = "Wespeaker/wespeaker-voxceleb-resnet34 Hugging Face"
adapter_type = "wespeaker-resnet34"
version  = "1.0"
sample_rate = 16000
embedding_dim = 256
signature = '''
untrusted comment: signature from minisign secret key
RUQGu9FvZMmIhf99QhdU+yew+XOYA3tx+dixo9cqxxz0Y7xlIOiiLhFTFKbsKeiH5OkiGn9GPbzP8TwGGLjKGLVRsOdFHSueOAs=
trusted comment: polyvoice v0.6.0-alpha.3 | wespeaker_resnet34.onnx
BzPwRAu4i4ABLmMMqmgv++OWy+3tbmdf9FrCIgXtB/zfdXXwckWIQE7vcCIfpuLPS0BUWDbkbbV6n3mugnlCBw==
'''

[models.powerset_fp32]
url      = "https://huggingface.co/csukuangfj/sherpa-onnx-pyannote-segmentation-3-0/resolve/main/model.onnx"
sha256   = "220ad67ca923bef2fa91f2390c786097bf305bceb5e261d4af67b38e938e1079"
size     = 5992913
filename = "powerset_fp32.onnx"
license  = "MIT"
license_url = "https://github.com/k2-fsa/sherpa-onnx"
provenance = "sherpa-onnx-pyannote-segmentation-3-0 (pyannote/segmentation-3.0)"
adapter_type = "powerset-v1"
version  = "3.0"
sample_rate = 16000
window_secs = 10.0
hop_secs = 2.0
num_speakers = 3
signature = '''
untrusted comment: signature from minisign secret key
RUQGu9FvZMmIhQ10AL95cKcDAXudXyE1DdH7VfQpci6E/PZHNlI6W19DEjsqPi8tZ7GC8PZkaHeRJ4ZnjAKTQCvkRWYoByTjuAk=
trusted comment: polyvoice v0.6.0-alpha.3 | powerset_fp32.onnx
e33pe01miZQKvp1AoCQcv6Oa3vVmxOBcxNiOkasmsCxhRq5ix1uqMWjah8IB6YieUjvHYj4hd9j1OH6wPAm/AA==
'''

[models.cam_pp_fp32]
url      = "https://huggingface.co/Wespeaker/wespeaker-voxceleb-campplus/resolve/main/voxceleb_CAM%2B%2B.onnx?download=true"
sha256   = "b50810498b5bcf5773d086f6993d344476bd0c88b566a41e8d801aaf8461efad"
size     = 29292449
filename = "cam_pp_fp32.onnx"
license  = "Apache-2.0"
license_url = "https://huggingface.co/Wespeaker/wespeaker-voxceleb-campplus"
provenance = "Wespeaker/wespeaker-voxceleb-campplus Hugging Face"
adapter_type = "cam++"
version  = "1.0"
sample_rate = 16000
embedding_dim = 512
signature = '''
untrusted comment: signature from minisign secret key
RUQGu9FvZMmIhZxjhT1+WXcKvuaszc4e4LHkeeySB9tzOhQLjB23OeDyBKfzQWQdfp1JfLylKJ3fvlH92eix78kBHpFruwFCFAc=
trusted comment: polyvoice v0.6.0-alpha.3 | cam_pp_fp32.onnx
pnLedo8TIV+K14fAyL54r1d9mWm1rN18C50BA/QQclyfP01tOaJVbxcJB+GZ4+AA/fluvTDJewlPn1gMo33wBA==
'''

# v1.0 INT8 artifacts, recalibrated against VoxConverse-dev:
# - powerset_int8: weights-only dynamic quantization (QInt8, per-channel) —
#   static QDQ is not viable for this recurrent model (int8 activations on the
#   LSTM path destroy posteriors even when every compute op is excluded).
#   No calibration data.
# - resnet34_int8: static QDQ (QInt8, per-channel), calibrated on 1819 real
#   fbank+CMVN speech windows (0.5-5 s RTTM segments, VoxConverse-dev), with
#   the statistics-pooling tail and the input conv kept in fp32.
# - cam_pp_int8: unchanged from the previous calibration; not referenced by
#   any shipping profile.
[models.powerset_int8]
url      = "https://github.com/ekhodzitsky/polyvoice/releases/download/models-int8-v2/powerset_int8.onnx"
sha256   = "175896d26f639933cd86906d2dd3e6796eddb23c1f719925a3949052da76183b"
size     = 1649256
filename = "powerset_int8.onnx"
calibration = "weights-only dynamic quant, no calibration data"
license  = "MIT"
license_url = "https://github.com/k2-fsa/sherpa-onnx"
provenance = "INT8 quant of sherpa-onnx-pyannote-segmentation-3-0"
adapter_type = "powerset-v1"
version  = "3.0-int8"
sample_rate = 16000
window_secs = 10.0
hop_secs = 2.0
num_speakers = 3
signature = '''
untrusted comment: signature from minisign secret key
RUQGu9FvZMmIhcR4tl4/adcGnamCx9bdqn19jau2fR13+ZlGWjIhvGY8dKVtMRAsqNRAG4ConovFvFtg+i/Oi6pHViljSAxm9w8=
trusted comment: polyvoice model signing | powerset_int8.onnx
2uP5mp2QmktBQ9Ef6miZpxT03EvqajAehheme+PFMU7Rj+PQ9uTE9HoI7HxOwR8k2uQuHNXYPOqn3cqWSdCyCg==
'''

[models.cam_pp_int8]
url      = "https://github.com/ekhodzitsky/polyvoice/releases/download/v0.6.0-alpha.2/cam_pp_int8.onnx"
sha256   = "cca48a4b36c1b46e48432b1eb1461dd69f9cf113cf506f3f660de808c93b9a85"
size     = 8803007
filename = "cam_pp_int8.onnx"
calibration = "voxconverse_dev_500_samples_seed_42"
license  = "Apache-2.0"
license_url = "https://huggingface.co/Wespeaker/wespeaker-voxceleb-campplus"
provenance = "INT8 quant of Wespeaker CAM++"
adapter_type = "cam++"
version  = "1.0-int8"
sample_rate = 16000
embedding_dim = 512
signature = '''
untrusted comment: signature from minisign secret key
RUQGu9FvZMmIhRQLqEqyoP/TNkcz2seLIK19JzqgIbPWHKFDVHMTA4+2hdmwZA5t0M6msDTE8LPEQXVpmqlb+jC4IzfAm518JgE=
trusted comment: polyvoice v0.6.0-alpha.3 | cam_pp_int8.onnx
XHIN9IgSVAhMFVb0TazR7NjXwO/ba2iCHQzrXsJEJ6hM4KpnrpjUgFaxTHkH4nVxlq8/5Pp4ODUc4qku3cKDAA==
'''

[models.resnet34_int8]
url      = "https://github.com/ekhodzitsky/polyvoice/releases/download/models-int8-v2/resnet34_int8.onnx"
sha256   = "24b58559fefb2af624a5d371c43ebae891a9a8ca363b2f9e7c31fd8e440a36b3"
size     = 6765058
filename = "resnet34_int8.onnx"
calibration = "voxconverse_dev_fbank_cmvn_rttm_segments_1819"
license  = "Apache-2.0"
license_url = "https://huggingface.co/Wespeaker/wespeaker-voxceleb-resnet34"
provenance = "INT8 quant of Wespeaker ResNet34"
adapter_type = "wespeaker-resnet34"
version  = "1.0-int8"
sample_rate = 16000
embedding_dim = 256
signature = '''
untrusted comment: signature from minisign secret key
RUQGu9FvZMmIhbyEbyzNuaI/cMPl2FynsjuPIz8pYuz56z6foEDqfdGOk4aMvB3pecxJQ4T16PmSK55buKIsMRDdrudPy498CwI=
trusted comment: polyvoice model signing | resnet34_int8.onnx
vthsMhwnQ8gSFSnTRWU9j3JiuQAQpAHsf7Tc1vKTad0o/IjuuPu7YPXY3vh/TvwaPMDNm3FqHgcKZ98VoMn6AA==
'''

# Optional ERes2NetV2 (Apache-2.0, ungated). Short-utterance-oriented 192-d
# embedder. NEVER profile-default / never bundled. SHA-256 from upstream LFS oid.
# Signature omitted until a release-signed asset exists.
[models.eres2netv2]
url      = "https://huggingface.co/csukuangfj/speaker-embedding-models/resolve/main/3dspeaker_speech_eres2netv2_sv_zh-cn_16k-common.onnx?download=true"
sha256   = "bf1a75b9930474cf3389ef415e6e5d38ca96fea4a3a00f7e301d080a58ee2239"
size     = 71441526
filename = "3dspeaker_speech_eres2netv2_sv_zh-cn_16k-common.onnx"
license  = "Apache-2.0"
license_url = "https://www.apache.org/licenses/LICENSE-2.0"
provenance = "3D-Speaker / ModelScope iic speech_eres2netv2_sv_zh-cn_16k-common; ONNX mirror csukuangfj/speaker-embedding-models"
adapter_type = "eres2netv2"
version  = "1.0"
sample_rate = 16000
embedding_dim = 192

# Optional CAM++ trained on 200k Chinese speakers (domain variant for CJK audio).
# Same fbank pipeline as default CAM++; select via adapter "cam++-zh".
[models.cam_pp_zh]
url      = "https://huggingface.co/csukuangfj/speaker-embedding-models/resolve/main/3dspeaker_speech_campplus_sv_zh-cn_16k-common.onnx?download=true"
sha256   = "f682b514c05d947ee3fa91cd6ec6c5c7543479a128373fa29b1faedccd21fd11"
size     = 28281138
filename = "3dspeaker_speech_campplus_sv_zh-cn_16k-common.onnx"
license  = "Apache-2.0"
license_url = "https://www.apache.org/licenses/LICENSE-2.0"
provenance = "3D-Speaker / ModelScope campplus zh-cn common; ONNX mirror csukuangfj/speaker-embedding-models"
adapter_type = "cam++-zh"
version  = "1.0"
sample_rate = 16000
embedding_dim = 192

# Optional E2E Streaming Sortformer v2 (≤4 speakers). NEVER default, NEVER
# bundled, NEVER pulled by profile resolution or default CI. Download only via
# explicit ModelRegistry::ensure("sortformer_v2") under the `sortformer` feature.
# Signature omitted until a release artifact is signed with the project key —
# SHA-256 alone gates integrity for this optional download path.
[models.sortformer_v2]
url      = "https://huggingface.co/cgus/diar_streaming_sortformer_4spk-v2-onnx/resolve/main/diar_streaming_sortformer_4spk-v2.onnx?download=true"
sha256   = "7dbfc7cba4615e07b679f7d65b5e0edd22a4b7b1ab69505a594f2f90421bd9c1"
size     = 492242946
filename = "diar_streaming_sortformer_4spk-v2.onnx"
license  = "CC-BY-4.0"
license_url = "https://creativecommons.org/licenses/by/4.0/"
provenance = "NVIDIA diar_streaming_sortformer_4spk-v2 (CC-BY-4.0); community ONNX export by Altunenes for parakeet-rs, mirrored at cgus/diar_streaming_sortformer_4spk-v2-onnx"
adapter_type = "sortformer-v2"
version  = "2.0"
sample_rate = 16000
num_speakers = 4

# ---------------------------------------------------------------------------
# VBx PLDA weights (six precomputed .npy files, ~265 KB total). NOT profile
# defaults: resolved only when the `vbx` clusterer is selected and no local
# `--vbx-plda-dir` / POLYVOICE_VBX_PLDA_DIR is set. Signature omitted until a
# release engineer signs with the project minisign key — SHA-256 alone gates
# integrity for this optional download path (same pattern as sortformer_v2 /
# eres2netv2). Hosted from the commit that introduced the fixtures; pin keeps
# the URL content-stable even if master moves.
# ---------------------------------------------------------------------------
[models.vbx_plda_transform]
url      = "https://raw.githubusercontent.com/ekhodzitsky/polyvoice/0623ae0b6773db7731f0fb3e75d8950347be94db/fixtures/vbx-plda/plda_transform.npy"
sha256   = "90261469714415743f4b8a86ee6b89466db858bde3c5944367cccfb7abd34f14"
size     = 131200
filename = "plda_transform.npy"
license  = "CC-BY-4.0"
license_url = "https://creativecommons.org/licenses/by/4.0/"
provenance = "pyannote speaker-diarization-community-1 PLDA params, diagonalized offline via scripts/build-vbx-plda.py; fixtures/vbx-plda"
adapter_type = "vbx-plda"
version  = "1.0"

[models.vbx_plda_phi_computed]
url      = "https://raw.githubusercontent.com/ekhodzitsky/polyvoice/0623ae0b6773db7731f0fb3e75d8950347be94db/fixtures/vbx-plda/plda_phi_computed.npy"
sha256   = "6ef7cf2f5a23a45b66f440f9a996a4cf5c047b369829af695d50ef18aa0a35e3"
size     = 1152
filename = "plda_phi_computed.npy"
license  = "CC-BY-4.0"
license_url = "https://creativecommons.org/licenses/by/4.0/"
provenance = "pyannote speaker-diarization-community-1 PLDA params, diagonalized offline via scripts/build-vbx-plda.py; fixtures/vbx-plda"
adapter_type = "vbx-plda"
version  = "1.0"

[models.vbx_plda_mean1]
url      = "https://raw.githubusercontent.com/ekhodzitsky/polyvoice/0623ae0b6773db7731f0fb3e75d8950347be94db/fixtures/vbx-plda/plda_mean1.npy"
sha256   = "e424c0c352182aa8e0f555dec1f3b30e29a20b9ed6b25d339f112af92e51e36f"
size     = 2176
filename = "plda_mean1.npy"
license  = "CC-BY-4.0"
license_url = "https://creativecommons.org/licenses/by/4.0/"
provenance = "pyannote speaker-diarization-community-1 PLDA params, diagonalized offline via scripts/build-vbx-plda.py; fixtures/vbx-plda"
adapter_type = "vbx-plda"
version  = "1.0"

[models.vbx_plda_mean2]
url      = "https://raw.githubusercontent.com/ekhodzitsky/polyvoice/0623ae0b6773db7731f0fb3e75d8950347be94db/fixtures/vbx-plda/plda_mean2.npy"
sha256   = "6f6fb708a2037197b5b84ffeaa8f140cb878088fbecd6ab042ad26a7691bd2cf"
size     = 640
filename = "plda_mean2.npy"
license  = "CC-BY-4.0"
license_url = "https://creativecommons.org/licenses/by/4.0/"
provenance = "pyannote speaker-diarization-community-1 PLDA params, diagonalized offline via scripts/build-vbx-plda.py; fixtures/vbx-plda"
adapter_type = "vbx-plda"
version  = "1.0"

[models.vbx_plda_lda]
url      = "https://raw.githubusercontent.com/ekhodzitsky/polyvoice/0623ae0b6773db7731f0fb3e75d8950347be94db/fixtures/vbx-plda/plda_lda.npy"
sha256   = "e20c9b012bebd1aabda5a38a127e63a43cf35debdc502715fc143e2fb6bc3c4b"
size     = 131200
filename = "plda_lda.npy"
license  = "CC-BY-4.0"
license_url = "https://creativecommons.org/licenses/by/4.0/"
provenance = "pyannote speaker-diarization-community-1 PLDA params, diagonalized offline via scripts/build-vbx-plda.py; fixtures/vbx-plda"
adapter_type = "vbx-plda"
version  = "1.0"

[models.vbx_plda_mu]
url      = "https://raw.githubusercontent.com/ekhodzitsky/polyvoice/0623ae0b6773db7731f0fb3e75d8950347be94db/fixtures/vbx-plda/plda_mu.npy"
sha256   = "d286d48acf99bbc1ed1502fed0a3e361ae5626ce1870c8be9f7397c5e47886c6"
size     = 1152
filename = "plda_mu.npy"
license  = "CC-BY-4.0"
license_url = "https://creativecommons.org/licenses/by/4.0/"
provenance = "pyannote speaker-diarization-community-1 PLDA params, diagonalized offline via scripts/build-vbx-plda.py; fixtures/vbx-plda"
adapter_type = "vbx-plda"
version  = "1.0"