Terjemahan mesin · Versi asli bahasa Inggris

Diarisasi pembicara

Mengidentifikasi siapa yang berbicara ketika dalam rekaman multi- speaker. Empat mesin tersedia: ringan Pyannote (CLI baku), full- pipeline Community-1 (CoreML + PLDA / VBx), streaming Sortformer (CoreML, Neural Engine), dan Nemotron 3 (CoreML INT8 atau MLX INT8).

Mesin

Pilih mesin dengan --engine pyannote (bawaan), --engine community1, --engine sortformer, atau --engine nemotron3.

Pyannote (baku)

Dua baris baris baris baris: Pyannote Proses segmentasi overlapping jendela dengan actiity- berbasis speaker chaining (Pearson korelasi dalam zona tumpang tindih) untuk menetapkan label speaker global. Post -hoc WeSpeaker embedding extraction memungkinkan target identifikasi speaker melalui audio pendaftaran.

Community-1 (CoreML + asli VBx)

Penuh Pyannote Community-1 CoreML bundle: 10-second jendela segmentasi PyanNet maju setiap detik, bertopeng WeSpeaker embedment feed centroid AHC and a 256→128 PLDA transformasi, kemudian asli Swift VBx dan tugas dibatasi menghasilkan cluster global. Ini mengembalikan satu 256-dimensi centroid per speaker terdeteksi dan mendukung tepat, minimum, atau maksimum speaker- batas hitungan.

Sortmer (CoreML)

NVIDIAAkhir model diarisasi saraf. 4 pembicara tanpa embedding atau clustering tahap. runs on Neural Engine via CoreML dengan streaming keadaan buffer (FIFO + speaker cache).

Untuk audio langsung, SortformerStreamingSession menjalankan .streaming Model singkat secara bertahap dengan 16 kHz mono PCM buffer ukuran apapun. Sekali nya 560 mmlookahead tersedia, itu kemajuan dalam 480 ms langkah audio; sebuah five- file M- series Neural Engine Pilot diukur 12.4 ms median latensi per 500 ms push. finish() flushes the buffered tail. Dalam tes ekuivalen model-gated, segmen akhir cocok dengan whole-buffer .streaming Diarisasi dalam satu frame 80 ms.

Nemotron 3 (CoreML atau MLX)

NVIDIA Nemotron 3 memprediksikan aktivitas speaker 10 untuk sampai delapan pembicara anonim. Akhir INT8 ekspor secara otomatis dari CoreML atau MLXBackend CLI baku adalah CoreML; pilih MLX dengan --nemotron3-backend mlxKeduanya mendukung bundel lokal melalui --nemotron3-directory.

Pada internal 132-tape diarization set (12.82 jam, 0.25 s kerah), dikirim Nemotron 3 MLX dan CoreML runtimes mencetak 10.98% dan 11.20% Dipooled DER, dengan hormat, tanpa kegagalan. 48 Pertemuan bahasa Inggris, mereka mencetak gol 10.31% dan 10.24%Lihat perbandingan bahasa dan batas evaluasi.

Catatan

The --target-speaker dan --embedding-engine tanda hanya tersedia dengan baku Pyannote Mesin. Community-1 kembali cluster centroids melalui nya Swift API; Sortformer dan Nemotron 3 tidak menghasilkan penggelapan speaker.

Untuk hasil yang diukur di seluruh sistem diarisasi dan delapan bahasa, mencetak dengan satu penguasa, melihat Speaker diarization benchmarks.

Baseline CALLHOME yang diterbitkan

Berikut ini adalah NVIDIA yang diterbitkan mentah anonmous- speaker baseline untuk diar_streaming_sortformer_4spk-v2Ini adalah referensi eksternal, bukan pengukuran lokal speech-swift apos; s CoreML konversi dan bukan named- speaker hasil.

DatasetKondisiDER
CALLHOME Bagian 22 pembicara referensi6.57%
CALLHOME Bagian 23 pembicara referensi10.05%
CALLHOME Bagian 24 pembicara referensi12.44%

Semua baris memakai latensi penyangga 1.04, tumpang tindih termasuk, sebuah kerah 0.25 dan post- pemrosesan disetel taian pada pembagian CALLHOME Bagian 1. CALLHoME berlisensi dan tidak bundel. Lokal diarization-bench laporan hasil yang sebanding secara terpisah oleh jumlah speaker referensi dalam konsol dan di JSON di bawah byReferenceSpeakerCount.

Community-1 Pipeline

Community-1 menjalankan kedua tahap saraf dengan CoreML dan semua proses host di Swift, sehingga tidak beban MLX atau memerlukan Metal pustaka shader. Baku yang diterbitkan diawetkan: decoding powerset keras, penyandang diri bersih-speaker masker dengan upstream short- jalur fallback, 0.6 ambang centroid- linkage, Fa=0.07, Fb=0.8, dan kebanyakan iterasi 20 VBx.

Pada file five- tetap subset rilis VoxConverse (1,057.49 detik, kerah 0.25-kedua, tumpang tindih termasuk), keluaran Swift dibatalkan dengan pyannote.metrics diukur 4.66% DER / 21.43% JER; yang diterbitkan CoreML referensi diukur 4.65% / 21.42%Ini adalah pemeriksaan parity kecil, bukan data-klaim berkualitas lebar.

Dengan frame- grid speech-swift pada subset yang sama, diukur Community-1 9.31% DER / 16.20% JER, 25.5 × real-time, dan 1.54 GB puncak RSSMesin Pyannote yang diukur 5.03% / 9.28%, 105.7 × real-time, and 393 MBCommunity-1 oleh karena itu sebuah opsional upstrem- parity pipeline dengan speaker- batas count dan mengembalikan centroids, bukan sebuah akurasi universal atau peningkatan kecepatan. Nilai dari dua metode mencetak tidak secara langsung sebanding.

Pyannote Pipeline

Jalur pipa baku dalam dua tahap:

Tahap 1: Segmentasi + Speaker Chaining

Pyannote segmentation-3.0 proses 10-kedua geser jendela dengan overlap 50%. A pengacak daya Mengubah 7-class keluaran kedalam probabilitas per- speaker (sampai ke 3 local speakers per window). Addible windows share a 5-second overlap - identitas speaker disebarkan ke seluruh jendela dengan komputasi Pearson korelasi antara trek probabilitas dalam zona tumpang tindih, dengan pencocokan eksklusif serakah untuk ID speaker global konsisten.

Tahap 2: Post- hoc Embedding

Setelah diarisasi, WeSpeaker ResNet34-LM ekstrak sebuah centroid 256-dimensi embedding per speaker. Delubment ini memungkinkan target ekstraksi speaker (--target-speaker) tetapi tidak drive tugas speaker itu sendiri.

Meniru dari pyanote.audio

Jika kau datang dari Python pyannote.audio library - menggantikan sebuah Pipeline subclass yang set pipeline.segmentation = ...(Atau melarikan diri dari seseorang di antara mereka) dari kalangan orang-orang kafir; lafal ayat ini berkedudukan menjadi Haal atau kata keterangan keadaan bagi lafal Al- ' pyannote/speaker-diarization-3.1 — Soniqo membungkus sama Pyannote-Segmentation-3.0 model dan jalankan secara keseluruhan on-device di Apple SiliconTidak Python runtime, no CUDA, no Hugging Face tanda pada waktu inference.

pyanote.audio (Python)Soniqo (Swift)
Pipeline.from_pretrained("pyannote/speaker-diarization-3.1") DiarizationPipeline.fromPretrained()
pipeline(audio_file) pipeline.diarize(audio: samples, sampleRate: 16000)
pipeline.segmentation = ... (subclass gubahan) Tetap: Pyannote-Segmentation-3.0 (MLX atau CoreML, auto- dipilih)
diarization.itertracks(yield_label=True) for seg in result.segments { ... }
diarization.write_rttm(file) CLI: --rttm
pyannote.metrics.diarization.DiarizationErrorRate CLI: --score-against reference.rttm

The Pyannote-Segmentation-3.0 bobot dikonversi dari hulu HuggingFace Checkpoint, jadi log segmentasi sama secara numerik dalam toleransi presisi float. Gabungan post- segmentasi (Pearson korelasi di jendela yang tumpang tindih + kecocokan eksklusif) dan post- hoc WeSpeaker embedding stage are reimplemented in Swift tetapi menghasilkan keluaran RTTM yang sebanding dengan referensi Python Jalur pipa.

Belum didukung

Tidak ada streaming OnlineSpeakerDiarization sama dengan mesin Pyannote. Untuk penggunaan diarisasi real time --engine sortformer sebagai gantinya, yang menjalankan model Sortformer dengan FIFO dan speaker-cache negara penyangga.

Penggunaan CLI

# Basic diarization (pyannote, default)
.build/release/speech diarize meeting.wav

# Community-1 (CoreML + native PLDA/VBx)
.build/release/speech diarize meeting.wav --engine community1
.build/release/speech diarize meeting.wav --engine community1 --num-speakers 2

# End-to-end Sortformer (CoreML)
.build/release/speech diarize meeting.wav --engine sortformer

# Nemotron 3 (CoreML default; MLX optional)
.build/release/speech diarize meeting.wav --engine nemotron3
.build/release/speech diarize meeting.wav --engine nemotron3 --nemotron3-backend mlx

# RTTM output format (for evaluation)
.build/release/speech diarize meeting.wav --rttm

# JSON output
.build/release/speech diarize meeting.wav --json

Ekstraksi Speaker Target

Menyediakan audio pendaftaran dari pembicara yang dikenal untuk mengekstrak segmen mereka hanya dari rekaman. Pipa menghitung pembicara embedding dari audio pendaftaran dan menemukan cluster dengan kesamaan kosinus tertinggi.

# Extract segments for a specific speaker
.build/release/speech diarize meeting.wav --target-speaker enrollment.wav

DER Scoring

Kualitas diarisasi evaluasi dengan mencetak melawan berkas RTTM yang mereferensi. Pipa pipa menghitung Galat Diarisasi Rate (DER), yang mengukur proporsi waktu yang tidak benar dikategorikan.

# Score against reference RTTM
.build/release/speech diarize meeting.wav --score-against reference.rttm

Keluaran RTTM

The --rttm Flag menghasilkan Rich Transcription Time ditandai keluaran, format standar yang digunakan untuk evaluasi diarisasi. Setiap baris mengikuti format:

SPEAKER filename 1 start_time duration <NA> <NA> speaker_id <NA> <NA>

Opsi

OpsiDeskripsi
--target-speakerAudio pendaftaran untuk ekstraksi speaker target (hanya pyannote)
--embedding-engineSpeaker embedding engine: mlx atau coreml (hanya plannote)
--vad-filterPenyaring awal dengan Silero VAD (hanya plannote)
--community1-compute-unitsane (bawaan), cpu, gpu, atau all
--num-speakersJumlah pembicara yang dikenal dengan tepat (hanya Community-1)
--min-speakersJumlah pembicara minimum (Community-1, baku 1)
--max-speakersJumlah pembicara maksimum (Community-1)
--rttmKeluaran dalam format RTTM
--jsonFormat keluaran JSON
--score-againstReferensi berkas RTTM untuk evaluasi DER
Penting

Diarisasi bekerja paling baik dengan rekaman yang memiliki speaker jelas berbalik. pidato yang sangat tumpang tindih dapat mengurangi akurasi. jumlah pembicara ditentukan secara otomatis.

Unduhan Model

Model diunduh secara otomatis pada penggunaan pertama:

KomponenModelUkuranHuggingFace
SegmentasiPyannote-Segmentation-3.0- 5.7 MBAufklacer / Pynotte- segmentation - MLX
Jemaat PembicaraWeSpeaker-ResNet34-LM (MLX)~ 25 MBaufklarer / WeSpeaker-ResNet34-LM-MLX
Jemaat PembicaraWeSpeaker-ResNet34-LM (CoreML)~ 25 MBaufklarer / WeSpeaker-ResNet34-LM-CoreML
Pipa Community-1PyanNet + bertopeng WeSpeaker + PLDA / VBx~ 32 MBaufklarer / Pyannote-Community-1-CoreML
SortformerSORPER Diarization (CoreML)~ 240 MBAufklacer / Sortformer- Diarization-CoreML
Nemotron 3Diarisasi INT8 (CoreML atau MLX)~ 100 MB masing-masingCoreML · MLX

Swift API

import SpeechVAD

let pipeline = try await DiarizationPipeline.fromPretrained()
let result = pipeline.diarize(audio: samples, sampleRate: 16000)
for seg in result.segments {
    print("Speaker \(seg.speakerId): [\(seg.startTime)s - \(seg.endTime)s]")
}

// Target speaker extraction
let targetEmb = pipeline.embeddingModel.embed(audio: enrollmentAudio, sampleRate: 16000)
let segments = pipeline.extractSpeaker(
    audio: meetingAudio, sampleRate: 16000,
    targetEmbedding: targetEmb
)

// Full Community-1 pipeline with bounded speaker counts
let community1 = try await Community1DiarizationPipeline.fromPretrained()
try community1.prewarm()
let attributed = try community1.diarize(
    audio: meetingAudio,
    sampleRate: 16000,
    speakerBounds: Community1SpeakerBounds(minimum: 2, maximum: 6)
)