Maskinöversättning · Engelskt original
Talardiarisering
Identifiera vem som talade när i en multi-talare inspelning. Fyra motorer är tillgängliga: lätta Pyannote (CLI standard), full-pipeline Community-1 (CoreML + infödd PLDA / VBx), streaming Sortformer (CoreML, Neural Engine), och Nemotron 3 (CoreML INT8 eller MLX ZZ INT8).
Motorer
Välj motorn med --engine pyannote (standard), --engine community1, --engine sortformer, eller --engine nemotron3.
Pyannote (standard)
Tvåstegspipeline: Pyannote segmenteringsprocesser överlappande fönster med aktivitetsbaserad högtalarkedja (Pearson-korrelation i överlappzoner) för att tilldela globala högtalaretiketter. Post-hoc WeSpeaker inbäddningsextraktion möjliggör målhögtalaridentifiering via inskrivningsljud.
Community-1 (CoreML + infödd VBx)
Fullständig Pyannote Community-1 CoreML bunt: 10-andra PyanNet-segmenteringsfönster förskott varje sekund, maskerad WeSpeaker inbäddning foder centroid AHC och en 256→128 PLDA transformerar, sedan infödd Swift VBx och begränsat uppdrag producerar globala kluster. Det returnerar ett 256-dimensionell centroid per detekterad högtalare och stöder exakta, minsta eller maximala högtalarräkningsgränser.
Sortformer (CoreML)
NVIDIA: s end-to-end neural diarization modell. Direkt förutspår per-frame högtalare aktivitet för upp till 4 högtalare utan separata inbäddning eller klustering stadier. Kör på Neural Engine via CoreML med strömmande statsbuffertar (FIFO + högtalare cache).
för live audio, SortformerStreamingSession springer .streaming Sortformermodellen stegvis med 16 kHz mono PCM buffertar av alla storlekar. 560 ms lookahead är tillgängligt, det går framåt 480 ms ljudsteg; en fem-fil M-serie Neural Engine Pilot mätt 12.4 Ms Median Latency per 500 ms push. Speaker etiketter följer ankomst-order talman Cache i stället för att klustera varje fönster, och varje tryck returnerar en helströms ögonblicksbild. finish() spola buffert svansen. I det modellerade likvärdighetstestet matchade slutsegmenten helbuffert .streaming diarization inom cirka en 80 ms ram.
Nemotron 3 (CoreML eller MLX)
NVIDIA Nemotron 3 förutspår 10 ms högtalaraktivitet för upp till åtta anonyma högtalare. Den slutliga INT8 export nedladdning automatiskt från CoreML eller MLXStandard CLI backend är CoreML; välj MLX med --nemotron3-backend mlxBåda stöder en lokal bunt genom --nemotron3-directory.
På en intern 132inspelning av diarization set (12.82 timmar, 0.25 s collar), skeppade Nemotron 3 MLX och CoreML Rontimes scored 10.98% och 11.20% poolade DER, respektive, utan fel. 48 Engelska möten, de gjorde 10.31% och 10.24%Se den per språkjämförelse och utvärderingsgränser.
--target-speaker och --embedding-engine flaggor är endast tillgängliga med standard Pyannote motor. Community-1 returnerar klustercentroider genom sina Swift API; Sortformer och Nemotron 3 producerar inte högtalarinbäddningar.
För uppmätta resultat över diariseringssystemen och åtta språk, som görs med en linjal, se högtalardiariseringsriktmärken .
Förlag: CALLHOME Baseline
Följande är NVIDIA publicerad rå anonym-högtalarbaslinje för diar_streaming_sortformer_4spk-v2. Det är en extern referens, inte en lokal mätning av speech-swift CoreML konvertering och inte ett namngivet attributionsresultat.
| Dataset | Villkor | DER |
|---|---|---|
| CALLHOME Del 2 | 2 referenshögtalare | 6.57% |
| CALLHOME Del 2 | 3 referenshögtalare | 10.05% |
| CALLHOME Del 2 | 4 referenshögtalare | 12.44% |
Alla rader använder 1.04 s input-buffert latens, överlapp ingår, en 0.25 s krage och efterbehandling inställd på disjoint CALLHOME Part 1. CALLHAMME är licensierad och är inte buntad. Local diarization-bench rapporterar jämförbara resultat separat genom referenshögtalare i konsolen och i JSON under byReferenceSpeakerCount.
Community-1 Pipeline
Community-1 körs både neurala steg med CoreML och all värdbearbetning i Swift, så det laddar inte MLX eller kräver ett Metal shader bibliotek. De publicerade standarderna bevaras: hårda krafter avkodning, rena single-speaker masker med uppströms kortslutning, 0.6 centroid-länkgräns, Fa=0.07, Fb=0.8, och på de flesta 20 VBx iterationer.
På den fasta fem-filen VoxConverse release subset (1,057.49 sekunder, 0.25-sekund krage, överlapp ingår), Swift utgång rescored med pyannote.metrics mätt 4.66% DER / 21.43% JERDen publicerade CoreML referens mätt 4.65% / 21.42%Detta är en liten paritetskontroll, inte ett dataset-wide kvalitetskrav.
Med speech-swift: s ram-grid scorer på samma undergrupp, Community-1 mätt 9.31% DER / 16.20% JER, 25.5 × realtid, och 1.54 GB-topp RSSStandard Pyannote motor mätt 5.03% / 9.28%, 105.7 × realtid, och 393 MBCommunity-1 är därför en valfri uppströms-paritetsledning med högtalarräkningsgränser och returnerade centroider, inte en universell noggrannhet eller hastighetsuppgradering. Scores från de två poängmetoderna är inte direkt jämförbara.
Pyannote Pipeline
Standardpipeline körs i två steg:
Steg 1: Segmentering + Högtalare Chaining
Pyannote segmentation-3.0 behandlar 10-sekunders glidande fönster med 50% överlappning. A powerset decoder omvandlar 7-klassutgången till per-speaker sannolikheter (upp till 3 lokala högtalare per fönster). Intilliggande fönster delar en 5-sekund överlapp - högtalare identitet förökas över fönster genom att beräkna Pearson corelation
Steg 2: Post-hoc inbäddning
Efter diarization, WeSpeaker ResNet34-LM extraherar en 256-dimensionell centroid inbäddning per högtalare. Dessa inbäddningar möjliggör målhögtalare extraktion (--target-speaker) men kör inte själva högtalaruppdraget.
Migrering från pyannote.audio
Om du kommer från Python pyannote.audio Biblioteket – ersätta ett Pipeline Subclass som sätter pipeline.segmentation = ...eller flytta bort från en server hosting pyannote/speaker-diarization-3.1 Soniqo omslag samma Pyannote-Segmentation-3.0 modell och kör det helt på-enhet på Apple Silicon. No Python runtime, ingen CUDA, ingen Hugging Face token vid inferens 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 = ... (anpassad underklass) |
Fixed: Pyannote-Segmentation-3.0 (MLX eller CoreML, automatisk vald) |
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 |
Den som Pyannote-Segmentation-3.0 vikter omvandlas från uppströms HuggingFace checkpoint, så segmenteringslogits är numeriskt likvärdiga inom float-precision tolerans. Efter-segmentering kedja (Pearson korrelation över överlappande fönster + giriga exklusiva matchningar) och post-hoc WeSpeaker Inbäddningsstadier återförenas i Swift men producerar jämförbara RTTM-utgångar till referensen Python pipeline.
Det finns ingen streaming OnlineSpeakerDiarization motsvarande för Pyannote motor. För realtid diarization användning --engine sortformer i stället, som kör Sortformer modell med FIFO och högtalar-cache state buffers.
CLI Användning
# 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
Target Speaker Extraction
Ge inskrivningsljud av en känd högtalare för att extrahera endast sina segment från en inspelning. Pipeline beräknar högtalaren inbäddning av inskrivnings ljudet och finner klustret med den högsta kosin likhet.
# Extract segments for a specific speaker
.build/release/speech diarize meeting.wav --target-speaker enrollment.wav
DER Scoring
Utvärdera diariseringskvalitet genom att poängtera en referens RTTM-fil. Pipeline beräknar Diarization Error Rate (DER), som mäter andelen tid som felaktigt tillskrivs.
# Score against reference RTTM
.build/release/speech diarize meeting.wav --score-against reference.rttm
RTTM Output
--rttm flaggan producerar Rich Transcription Time Marked-utgången, ett standardformat som används för diarization-utvärdering. Varje rad följer formatet:
SPEAKER filename 1 start_time duration <NA> <NA> speaker_id <NA> <NA>
Alternativ
| Alternativ | Beskrivning |
|---|---|
--target-speaker | Inskrivningsljud för målhögtalare extraktion (endast Pyannote) |
--embedding-engine | Högtalarinbäddningsmotor: mlx eller coreml (endast pyannot) |
--vad-filter | Pre-filter med Silero VAD (endast pyannot) |
--community1-compute-units | ane (standard), cpu, gpu, eller all |
--num-speakers | Känd exakt högtalarantal (Community-1 endast) |
--min-speakers | Minsta högtalarantal (Community-1, standard 1) |
--max-speakers | Maximalt högtalarantal (Community-1) |
--rttm | Utgång i RTTM-format |
--json | JSON utdata format |
--score-against | Referens RTTM-fil för DER utvärdering |
Diarization fungerar bäst med inspelningar som har tydliga högtalare svänger. Högt överlappande tal kan minska noggrannheten. Speaker räknas automatiskt.
Modell nedladdningar
Modeller hämtas automatiskt vid första användning:
| Komponent | Modell | Storlek | HuggingFace |
|---|---|---|---|
| Segmentering | Pyannote-Segmentation-3.0 | ~5.7 MB | aufklarer/Pyannote-Segmentation-MLX |
| Högtalare inbäddning | WeSpeaker-ResNet34-LM (MLX) | ~25 MB | aufklarer/WeSpeaker-ResNet34-LM-MLX |
| Högtalare inbäddning | WeSpeaker-ResNet34-LM (CoreML) | ~25 MB | aufklarer/WeSpeaker-ResNet34-LM-CoreML |
| Community-1 pipeline | PyanNet + maskerad WeSpeaker + PLDA/VBx | ~32 MB | aufklarer/Pyannote-Community-1-CoreML |
| Sortformer | Sortformer Diarization (CoreML) | ~240 MB | aufklarer/Sortformer-Diarization-CoreML |
| Nemotron 3 | Diarization INT8 (CoreML eller MLX) | ~ 100 MB vardera | 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)
)