Traducere automată · Originalul în engleză

Diarizarea vorbitorilor

Identificaţi cine a vorbit atunci când într-o înregistrare multi-speaker. Patru motoare sunt disponibile: uşoară Pyannote (CLI implicit), full-pipeline Community-1 (CoreML + PLDA/VBx nativ), streaming Sortareformer (CoreML, Neural Engine) și Nemotron 3 (CoreML INT8 sau MLX INT8).

Motoare

Selectați motorul cu --engine pyannote (default), --engine community1, --engine sortformer, sau --engine nemotron3 motor.

Pyannote (default)

Conductă în două etape: Pyannote Procese de segmentare care se suprapun ferestrelor cu lanț difuzor bazat pe activitate (corelația Pearson în zone de suprapunere) pentru a atribui etichete difuzor globale. Post-hoc WeSpeaker înglobarea permite identificarea vorbitorului țintă prin audio de înregistrare.

Community-1 (CoreML + nativ VBx)

Întregul pachet Pyannote Community-1 CoreML pachet: 10 secunde Ferestrele de segmentare PyanNet avansează în fiecare secundă, mascate WeSpeaker înglobări se hrănesc cu centroid AHC și cu o transformare de 256→128 PLDA, apoi nativ Swift VBx și se atribuie cu restricții produc clustere globale. Se întoarce cu un centroid 256-dimensional detectat pe difuzor și suportă limite de speaker exacte, minime sau maxime.

Sortare (CoreML)

NVIDIA's end-to-end diarizare neuronală. Previzionează direct activitatea per-frame speaker pentru până la 4 speakeri fără etape separate de înglobare sau clustering. Rulează pe Neural Engine via CoreML with streaming state buffers (FIFO + speaker cache).

Pentru audio live, SortformerStreamingSession ruleaza .streaming Model Sortare incremental cu tampone mono PCM de 16 kHz de orice dimensiune.Odată ce este disponibilă panorama sa de 560 ms, avansează în 480 ms pași audio; un 5 file M-series Neural Engine pilot măsurat 12,4 ms latență mediană per 500 ms împinge.Etichetele speaker urmează testul Arrival-Order Speaker Cache în loc de re-clustering fiecare fereastră, și fiecare împingere returnează un instantaneu întreg-stream. finish() spălă coada tamponată.În modelul de încercare de echivalență, segmentele finale se potrivesc cu întregul-buffer .streaming diarizare în cadrul a aproximativ 80 ms.

Nemotron 3 (CoreML sau MLX)

NVIDIA Nemotron 3 prezice activitatea vorbitorului de 10 ms pentru până la opt vorbitori anonimi. Ultimul INT8 exportă automat de la CoreML sau MLX. Platforma CLI implicită este CoreML; alege MLX cu --nemotron3-backend mlx. Ambele sprijină un pachet local prin --nemotron3-directory.

Pe un set intern de diarizare 132-înregistrare (12,82 ore, 0,25 s guler), livrat Nemotron 3 MLX și CoreML runtimes marcat 10.98% și, respectiv, 11,20% cumulate DER. La 48 de întâlniri în limba engleză, acestea au marcat 10.31% și 10.24%. A se vedea pe limbaj de comparare și limitele de evaluare .

Notă

Indicatoarele --target-speaker şi --embedding-engine sunt disponibile numai cu motorul implicit Pyannote. Community-1 întoarce centroizii-cluster prin Swift API; Sortareder şi Nemotron 3 nu produc înglobări ale vorbitorului.

Pentru rezultate măsurate în sistemele de diarizare și opt limbi, marcate cu un singur conducător, a se vedea reperele de diarizarea speaker .

Înregistrare de bază a CALLHOME publicată

Următoarele este NVIDIA's publicat brut anonim-speaker de bază pentru diar_streaming_sortformer_4spk-v2 . Este o referință externă, nu o măsură locală de speech-swift's CoreML conversie și nu un rezultat de atribuire a denumirii.

Set de date StareDER
CaLLHOME Partea 22 vorbitori de referință6.57%
CaLLHOME Partea 23 vorbitori de referință10.05%
CaLLHOME Partea 24 vorbitori de referință12.44%

Toate rândurile folosesc 1.04 s latență intrare-buffer, suprapunerea include, un guler de 0,25 s, și post-procesare reglate pe disjunctiv CALLHOME Partea 1. CallHOME este licențiat și nu este grupat. Local diarization-bench raportează rezultate comparabile separat prin numărarea difuzorului de referință în consolă și în JSON sub byReferenceSpeakerCount.

Community-1

Community-1 rulează ambele etape neurale cu CoreML și toate procesele gazde în Swift, astfel încât să nu se încarce MLX sau necesită a Metal biblioteca de umbrire. Implicatele publicate sunt conservate: decodare cu putere tare, măști cu un singur difuzor curat, cu cale de întoarcere pe termen scurt în amonte, 0.6 pragul de legătură centroid; Fa=0.07, Fb=0.8, și cel mult iterații 20 VBx.

Pe subgrupul fix de eliberare VoxConverse cu cinci fişiere (1,057.49 secunde, cu o suprapunere de 0,25 secunde, inclusiv), Swift producţie rescorată cu pyannote.metrics măsurate 4.66% DER / 21,43% JER; referinţa publicată CoreML măsurată 4.65% / 21,42%. Aceasta este o verificare paritate mică, nu o cerere de calitate la nivelul întregului set de date.

Cu scorerul grilei de cadru speech-swift pe același subset, Community-1 măsurat 9.31% DER / 16.20% JER, 25.5× în timp real și 1.54 GB vârf RSSMotorul implicit Pyannote măsurat. 5.03% / 9.28%, 105.7× în timp real și 393 MB. Community-1 este, prin urmare, o opțională conducta de paritate în amonte cu limite de difuzor-număr și centroizi returnate, nu o precizie universală sau upgrade de viteză. Scores din cele două metode de notare nu sunt direct comparabile.

Pyannote Conductă

Conducta implicită se execută în două etape:

Etapa 1: Segmentare + înlănţuire difuzor

Pyannote segmentation-3.0 procesează ferestre glisante de 10 secunde cu o suprapunere de 50%. A decodor de set de putere convertește producția de 7 clase în probabilități per-speaker (până la 3 boxe locale per fereastră). Ferestrele adiacente împart o suprapunere de 5 secunde a identității difuzorului se propagă pe ferestre prin calcul Corelația Pearson între pistele de probabilitate din zona de suprapunere, cu potrivire exclusivă lacomă pentru ID-urile coerente ale vorbitorului global.

Etapa 2: Embedările post-hoc

După diarizare, WeSpeaker ResNet34-LM extrage un centroid 256-dimensional pe difuzor. Aceste înglobări permit extragerea difuzorului ţintă (--target-speaker), dar nu conduc însăşi atribuirea vorbitorului.

Migrare din pyannote.audio

Dacă veniţi de la Python pyannote.audio biblioteca Pipeline subclasă care stabilește pipeline.segmentation = ..., sau se deplasează departe de un server de găzduire pyannote/speaker-diarization-3.1 Soniqo învelește același model Pyannote-Segmentation-3.0 și îl rulează în întregime pe ecranul Apple Silicon. No Python runtime, no CUDA, no Hugging Face token at inference time.

pyannote.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 = ... (subclasă custom) Fix: Pyannote-Segmentation-3.0 (MLX sau CoreML, auto-selectat)
diarization.itertracks(yield_label=True) for seg in result.segments { ... }
diarization.write_rttm(file) CL: --rttm
pyannote.metrics.diarization.DiarizationErrorRate CL: --score-against reference.rttm

Ponderile Pyannote-Segmentation-3.0 sunt convertite din amonte HuggingFace punct de control, astfel încât logitele segmentării sunt echivalente numeric cu toleranţa de precizie float. Legarea post-segmentare (corelaţia Pearson între ferestre suprapuse + potrivirea exclusivă lacomă) şi post-hoc WeSpeaker fazele de încorporare sunt reinstalate în Swift dar produc o producţie RTTM comparabilă cu conducta de referinţă Python.

Nesusţinut încă

Nu există streaming OnlineSpeakerDiarization echivalent pentru motorul Pyannote. Pentru utilizarea în timp real a diarizării --engine sortformer în schimb, care rulează modelul Sortareexter cu FIFO și tampoane de stat speaker-cache.

Utilizarea 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

Extractie difuzor țintă

Oferă audio de înscriere a unui vorbitor cunoscut pentru a extrage doar segmentele lor dintr-o înregistrare. Conducta calculeaza difuzor înglobarea audio înscriere și găsește grupul cu cea mai mare asemănare cosinus.

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

DER Scoring

Evaluează calitatea diarizării prin notarea în raport cu un fișier RTTM de referință. Conducta calculează rata de eroare de diarizare (DER), care măsoară proporția de timp care este atribuită incorect.

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

Ieșire RTTM

Steagul --rttm produce producţia Rich Transcription Time Marked, un format standard utilizat pentru evaluarea diarizării. Fiecare linie urmează formatul:

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

Opțiuni

Opțiune Descriere
--target-speaker Înregistrare audio pentru extragerea difuzorului țintă (numai pyannote)
--embedding-engineMotor de încorporare a boxelor: mlx sau coreml (numai pyannote)
--vad-filterPrefiltru cu Silero VAD (numai pyannote)
--community1-compute-unitsane (default), cpu, gpu sau all
--num-speakers Număr exact de vorbitori cunoscuți (Community-1)
--min-speakers Numărul minim de vorbitori (Community-1, implicit 1)
--max-speakers Numărul maxim de vorbitori (Community-1)
--rttmIeșire în format RTTM
--jsonFormat de ieșire JSON
--score-against Fișier RTTM de referință pentru evaluarea DER
Important

Diarizarea funcţionează cel mai bine cu înregistrări care au turnări difuzor clare. Discursul extrem de suprapuse poate reduce precizia. Numărul speaker este determinat automat.

Modele de descărcări

Modelele sunt descărcate automat la prima utilizare:

ComponentăModelDimensiuneHuggingFace
SegmentarePyannote-Segmentation-3.0~5,7 MOaufklarer/Pyannote-Segmentation-MLX
Emitere speakerWeSpeaker-ResNet34-LM (MLX)~25 MOaufklarer/WeSpeaker-ResNet34-LM-MLX
Emitere speakerWeSpeaker-ResNet34-LM (CoreML)~25 MOaufklarer/WeSpeaker-ResNet34-LM-CoreML
Community-1PyanNet + mascat WeSpeaker + PLDA/VBx~32 MOaufklarer/Pyannote-Community-1-CoreML
SortareformerDiarizare Sorterformer (CoreML)~240 MOaufklarer/Sortformer-Diarization-CoreML
Nemotron 3Diarizare INT8 (CoreML sau MLX)~100 MO fiecareCoreML · 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)
)