Maskinoversettelse · Engelsk original

Talerdiarisering

Identifiser hvem som snakket når i en multi-speaker opptak. Fire motorer er tilgjengelige: lett Pyannote (CLI standard), full-pipeline Community-1 (CoreML + innfødt PLDA/VBx), streaming Sortformer (CoreML, Neural Engine) og Nemotron 3 (CoreML INT8 eller MLX INT8).

Motorer

Velg motoren med --engine pyannote (standard), --engine community1, --engine sortformer, eller --engine nemotron3.

Pyannote (standard)

To-trinns rørledning: Pyannote segmentering prosesser overlapper vinduer med aktivitetsbasert høyttalerkjede (Pearson korrelasjon i overlappingssoner) for å tilordne globale høyttalermerker. Post-hoc WeSpeaker innbygging ekstraksjon muliggjør målhøyttaleridentifikasjon via tilmeldingslyd.

Community-1 (CoreML + innfødt VBx)

Den fulle Pyannote Community-1 CoreML bunt: 10-second PyanNet segmentering vinduer forløp hvert sekund, maskert WeSpeaker innelegger feed centroid AHC og en 256 →128 PLDA transformasjon, deretter innfødt Swift VBx og begrenset oppdrag produserer globale klynger. Det returnerer en 256-dimensjonal centroid per detektert høyttaler og støtter nøyaktig, minimum eller maksimal høyttaler-count grenser.

Sortformer (CoreML)

NVIDIAs ende-til-ende-neural diariseringsmodell. Direkte forutsi per-frame høyttaleraktivitet for opptil 4 høyttalere uten separate innbyggings- eller klyngefaser. Kjører på Neural Engine via CoreML med streaming-tilstandsbuffere (FIFO + høyttalerbuffer).

For live lyd, SortformerStreamingSession løper .streaming Sortformer modell stegvis med 16 kHz mono PCM buffere av enhver størrelse. Når 560 ms lookahead er tilgjengelig, det fremskrider i 480 Ms lydtrinn; en fem-fil M-serien Neural Engine pilot målt 12.4 mms median latens per 500 ms push. Høyttaler etiketter følger ankomst-Order høyttaler cache i stedet for å omklynge hvert vindu, og hver push returnerer et helstrøms øyeblikksbilde. finish() spyler den bufferede halen. I den modellerte ekvivalenstesten matcher de endelige segmentene hele buksen. .streaming diarisering innenfor ca. én 80 ms ramme.

Nemotron 3 (CoreML eller MLX)

NVIDIA Nemotron 3 forutsier 10 ms høyttaleraktivitet for opptil åtte anonyme høyttalere. Den endelige INT8 eksport nedlasting automatisk fra CoreML eller MLX. Standard CLI-bakstykke er CoreML; Velg MLX med --nemotron3-backend mlx. Begge støtter en lokal pakke gjennom --nemotron3-directory.

På et internt 132-registrerende diariseringssett (12,82 timer, 0,25 s krage), fraktet Nemotron 3 MLX og CoreML løpstider scoret 10,98% og 11,20% samlet DER, henholdsvis uten feil. På 48 engelske møter scoret de 10,31% og 10,24%. Se sammenlignings- og evalueringsgrensene

Note

--target-speaker og --embedding-engine flagg er bare tilgjengelige med standard Pyannote motor. Community-1 returnerer klyngesentroider gjennom sin Swift API; Sortformer og Nemotron 3 produserer ikke høyttalerinnbyggere.

For målte resultater på tvers av diariseringssystemene og åtte språk, scoret med én linjal, se speaker diarization benchmarks.

Publisert CALLHOME baseline

Følgende er NVIDIAs publiserte rå anonym-høyttaler baseline for diar_streaming_sortformer_4spk-v2. Det er en ekstern referanse, ikke en lokal måling av speech-swifts CoreML konvertering og ikke et navngitt-høyttall tilskrivelsesresultat.

DatasettTilstandDER
CALLHOME Del 22 referansehøyttalere6.57%
CALLHOME Del 23 referansehøyttalere10.05%
CALLHOME Del 24 referansehøyttalere12.44%

Alle rader bruker 1,04 s inngangsbuffer latens, overlapping inkludert, en 0,25 s krage, og etter behandling som er innstilt på discognite CALLHOME del 1. CALLHOme er lisensiert og ikke bundtet. Lokal diarization-bench rapporterer sammenlignbare resultater separat ved referansehøyttalertall i konsollen og i JSON under byReferenceSpeakerCount.

Community-1 Rørledning

Community-1 kjører begge nevrale stadier med CoreML og all vertsprosessering i Swift, så det ikke laster MLX eller krever en Metal Shader bibliotek. De publiserte standardene er bevart: hard powerset decoding, ren single-speaker masker med oppstrøms kortspors tilbakeløp, 0,6 centimeter-link terskel, Fa=0.07, Fb=0.8 og på de fleste 20 VBx iterasjoner.

På den faste fem-filen VoxConverse release subground (1.057.49 sekunder, 0,25-sekunds krage, overlapp inkludert), Swift utgang rescoret med pyannote.metrics målt 4.66% DER / 21.43% JER; den publiserte CoreML referanse målt 4.65% / 21.42%. Dette er en liten paritetskontroll, ikke en datasett-vidde kvalitetskrav.

Med speech-swifts rammegrid-scorer på samme undergruppe, målte Community-1 9.31% DER / 16.20% JER, 25.5× sanntid, og 1.54 GB topp RSS. standard Pyannote motor målt 5.03% / 9.28%, 105.7× sanntid, og 393 MB. Community-1 er derfor en valgfri oppstrøms-paritetsrørledning med høyttaler-count grenser og returnerte sentroider, ikke en universell nøyaktighet eller hastighetsoppgradering. Score fra de to scoremetoder er ikke direkte sammenlignbare.

Pyannote Rørledning

Standardrørledningen kjører i to trinn:

Trinn 1: Segmentering + høyttalerkjede

Pyannote segmentation-3.0 prosesserer 10-sekunders glidende vinduer med 50 % overlapp. A powerset dekoder konverterer 7-klasse utgangen til per-speaker sannsynligheter (opp til 3 lokale høyttalere per vindu). Tilstøtende vinduer deler en 5-sekunders overlapping - høyttaleridentitet utbredes på tvers av vinduer ved å datamaskinere Pearson korrelation mellom sannsynlighetsspor i overlappsonen, med grådig eksklusiv matching for konsistente globale høyttaler-ID-er.

Trinn 2: Posthoc Innbygging

Etter diarisering trekker WeSpeaker ResNet34-LM ut en 256-dimensjonal sentroid-innbygging per høyttaler. Disse innleggene muliggjør målhøyttalerutvinning (--target-speaker) men ikke driver selve høyttaleroppgaven.

Migrer fra pyannote.audio

Hvis du kommer fra Python pyannote.audio-biblioteket - erstatter en Pipeline-underklasse som setter pipeline.segmentation = ..., eller beveger seg bort fra en server hosting pyannote/speaker-diarization-3.1 — Soniqo-pakker det samme Pyannote-Segmentation-3.0-modellen og kjører den helt på-device på Apple Silicon. Ingen Python-kjøring, ingen CUDA, Hugging Face på-tid.

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 = ... (tilpasset underklasse) Fast: Pyannote-Segmentation-3.0 (MLX eller CoreML, autovalgt)
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

Pyannote-Segmentation-3.0 vektene konverteres fra oppstrøms HuggingFace kontrollpunkt, så segmenteringsloggene er numerisk ekvivalente i flyt-presisjon toleranse. Post-segmentasjonskjede (Pearson korrelasjon over over overlappende vinduer + grådig eksklusiv matching) og post-hoc WeSpeaker innebygde stadier er redisponert i Swift men produserer sammenlignbar RTTM utgang til referansen Python pipeline.

Ikke støttet ennå

Det er ingen streaming OnlineSpeakerDiarization ekvivalent for Pyannote motoren. For sanntid diarisering bruk --engine sortformer i stedet, som kjører Sortformer modellen med FIFO og høyttaler-kake tilstand buffere.

CLI bruk

# 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

Målhøyttalerutvinning

Gi tilmeldingslyd av en kjent høyttaler som bare trekker ut sine segmenter fra et opptak. Rørledningen beregner høyttaleren inneslutting av innmeldingslyden og finner klyngen med den høyeste cosinuslikheten.

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

DER Scoring

Evaluer diariseringskvaliteten ved å rangere mot en referanse RTTM-fil. Rørledningen beregner Diarization Feilrate (DER), som måler andelen tid som er feilaktig tilskrevet.

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

RTTM-utgang

--rttm-flagget produserer Rich Transcription Time Merket utgang, et standardformat som brukes til diariseringsvurdering. Hver linje følger formatet:

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

Alternativer

Mulighet Beskrivelse
--target-speaker Innrullingslyd for målhøyttalerekstraksjon (bare pyannote)
--embedding-engine Høyttalerinnbyggingsmotor: mlx eller coreml (kun pyannote)
--vad-filterPre-filter med Silero VAD (kun pyannote)
--community1-compute-unitsane (standard), cpu, gpu eller all
--num-speakers Kjent nøyaktig høyttalertall (Community-1 only)
--min-speakersMinimum høyttalertaler (Community-1, standard 1)
--max-speakers Maksimal høyttalertaler (Community-1)
--rttm Utgang i RTTM-format
--jsonJSON-utgangsformat
--score-againstReferanse RTTM fil for DER evaluering
Viktig

Diarisering fungerer best med opptak som har klare høyttalersvinger. Høyt overlappende tale kan redusere nøyaktighet. Høyttaler bestemmes automatisk.

Modellnedlastninger

Modeller lastes ned automatisk ved første bruk:

Komponent Modell StørrelseHuggingFace
SegmenteringPyannote-Segmentation-3.0~5.7 MBaufklarer/Pyannote-Segmentation-MLX
HøyttalerinnbyggingWeSpeaker-ResNet34-LM (MLX)~25 MBaufklarer/WeSpeaker-ResNet34-LM-MLX
HøyttalerinnbyggingWeSpeaker-ResNet34-LM (CoreML)~25 MBaufklarer/WeSpeaker-ResNet34-LM-CoreML
Community-1 rørledningCyanNet + maskert WeSpeaker + PLDA/VBx~32 MBaufklarer/Pyannote-Community-1-CoreML
SortformerSortformer Diarisering (CoreML)~240 MBaufklarer/Sorterformer-Diarisering-KoreML
Nemotron 3Diarisering INT8 (CoreML eller MLX)~ 100 MB hverCoreML · 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)
)