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
--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.
| Datasett | Tilstand | DER |
|---|---|---|
| CALLHOME Del 2 | 2 referansehøyttalere | 6.57% |
| CALLHOME Del 2 | 3 referansehøyttalere | 10.05% |
| CALLHOME Del 2 | 4 referansehøyttalere | 12.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.
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-filter | Pre-filter med Silero VAD (kun pyannote) |
--community1-compute-units | ane (standard), cpu, gpu eller all |
--num-speakers | Kjent nøyaktig høyttalertall (Community-1 only) |
--min-speakers | Minimum høyttalertaler (Community-1, standard 1) |
--max-speakers | Maksimal høyttalertaler (Community-1) |
--rttm | Utgang i RTTM-format |
--json | JSON-utgangsformat |
--score-against | Referanse RTTM fil for DER evaluering |
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ørrelse | HuggingFace |
|---|---|---|---|
| Segmentering | Pyannote-Segmentation-3.0 | ~5.7 MB | aufklarer/Pyannote-Segmentation-MLX |
| Høyttalerinnbygging | WeSpeaker-ResNet34-LM (MLX) | ~25 MB | aufklarer/WeSpeaker-ResNet34-LM-MLX |
| Høyttalerinnbygging | WeSpeaker-ResNet34-LM (CoreML) | ~25 MB | aufklarer/WeSpeaker-ResNet34-LM-CoreML |
| Community-1 rørledning | CyanNet + maskert WeSpeaker + PLDA/VBx | ~32 MB | aufklarer/Pyannote-Community-1-CoreML |
| Sortformer | Sortformer Diarisering (CoreML) | ~240 MB | aufklarer/Sorterformer-Diarisering-KoreML |
| Nemotron 3 | Diarisering INT8 (CoreML eller MLX) | ~ 100 MB hver | CoreML · 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)
)